2012-12-03 50 views
1

我正在寫一個Chrome擴展,我在頁面上添加一個按鈕,然後向它添加一個onclick事件。由於我想添加更多的按鈕,我想要它動態..如何通過參數傳遞函數名稱以用作onclick eventlistener?

addAutoModButton('Auto-Moderate', 'moderate'); 

function addAutoModButton(name, onclickfunction) { 
    ... 
    ... 
    //creating a button and adding it 
    var modbtn = document.createElement("input"); 
    modbtn.setAttribute('type','button'); 
    modbtn.setAttribute('value',name); 
    title_header.appendChild(modbtn); 

    modbtn.addEventListener("click", window["onclickfunction"], false); 
    // thats what is not working 

} 

function moderate() { 
    //do some stuff 
} 

建議?

+0

你似乎並沒有在任何地方定義'onclickfunction'。 –

+2

未經測試,但您應該可以編寫'addAutoModButton('Auto-Moderate',moderate);',然後'modbtn.addEventListener(「click」,onclickfunction,false);'。函數只是javascript中的數據,所以你可以傳遞一個函數作爲參數(而不是函數的名字,函數本身)。 – Oliver

+0

@Oliver:我建議加入這個答案。 – Cerbrus

回答

2
  • 您需要使用您定義的參數。

    function addAutoModButton(name, onclickfunction) { 
        ... 
        modbtn.addEventListener("click", onclickfunction, false); 
               ----^^^^^^^^^^^^^^^-- 
    
  • 傳遞函數,而不是它的名字。

    addAutoModButton('Auto-Moderate', moderate); 
               ---^^^^^^^^-- 
    

    您需要在將函數作爲參數傳遞之前定義該函數。


或者,你可以把它作爲是(僅限於全球範圍內,但。)通過unquoting傳遞到窗口屬性名稱。

modbtn.addEventListener("click", window[onclickfunction], false); 
            ---^^^^^^^^^^^^^^^--- 

在從字面上靜態解析到window.onclickfunction之前。

0

函數是JS一流的對象,這樣你就可以像任何其他變量對待它:

function someF(){} 
function func2(argumentFunction) 
{ 
    document.body.addEventListener('click',argumentFunction,false);//<-- use argument name 
} 
func2(someF);//<-- function someF will be used as callback 

的參數/變量的函數對象,這意味着JS不真正關心引用函數有什麼名字,它看什麼變量引用,在這種情況下,參數引用一個函數,該函數在其他地方聲明,但作爲參數傳遞。純粹和簡單

相關問題