2014-06-05 48 views
1

我不確定以前是否詢問過,因爲我不知道它叫什麼。onclick分配的參數功能

但爲什麼不這樣的方法工作?以下僅僅是

<script> 
document.getElementById('main_div').onclick=clickie(argument1,argument2); 

function clickie(parameter1,parameter2){ 
//code here 
} 

</script> 

上面的代碼將正常工作,如果事件處理程序不帶參數的分配,但參數,它不工作的一般示例。我想我在網上閱讀,爲了克服這個問題,你可以使用閉包。我假設這是因爲括號()立即調用函數而不是將其分配給事件?

+0

訪問函數內的PARAMS – jhyap

回答

8

因爲您立即調用該函數並返回結果,而不是引用它。

當添加括號調用該函數,並將結果傳回的onclick

document.getElementById('main_div').onclick = clickie(); // returns undefined 

所以它實際上等於寫

document.getElementById('main_div').onclick = undefined; 

這是不是你想要的,你想

document.getElementById('main_div').onclick = clickie; 

但是你不能傳遞參數,所以要做到這一點,你必須使用匿名函數nction以及

document.getElementById('main_div').onclick = function() { 
    clickie(argument1,argument2); 
} 

,它是通常最好使用的addEventListener附加事件偵聽器,但同樣的原則也適用,它要麼(不帶參數)

document.getElementById('main_div').addEventListener('click', clickie, false); 

或匿名函數傳遞參數

document.getElementById('main_div').addEventListener('click', function() { 
    clickie(argument1,argument2); 
}, false); 
+0

謝謝!現在有很多意義。 – user3029001

0

要將事件綁定到元素,您需要使用attachEventaddEventListener方法。例如。

/* Non IE*/ 
document.getElementById('main_div').addEventListener('click', function() {}, false); 

/* IE */ 
document.getElementById('main_div').attachEvent('onclick', function() {}); 
2

當你說onClick = function(){...}時,你正在用一些內部JavaScript庫註冊你的函數。所以當「點擊」發生時,該庫會調用你的函數。

現在想象一下,您是該圖書館的作者,並且有人通過它註冊了他們的功能。你怎麼知道有多少參數傳遞給函數?你怎麼知道要傳入什麼樣的參數?

clickie(argument1,argument2) 

這意味着調用該函數並返回其返回值。

clickie 

這僅僅是對功能(不調用/執行它)

0

的函數名,後跟括號被解釋爲一個函數調用或函數聲明的開始的引用。 onclick屬性需要設置爲一個函數對象。函數聲明是一個聲明,並不是一個函數。它不返回對函數的引用。相反,它具有在全局範圍內創建一個引用新函數對象的變量的副作用。

function clickie(param) { return true; } 

創建一個名爲clickie的全局變量,它指向一個函數對象。然後可以將該對象分配爲事件處理程序,如下所示:element.onclick = clickie;。一位不願具名的函數聲明(經常混淆與閉合;對於差異看Closure vs Anonymous function (difference?))不會返回一個函數對象,可以分配到財產的事件處理程序,如下:

element.onclick = function(event) { return true; }; 

但這不起作用:

element.onclick = function clickie(event) { return true;}; 

爲什麼?因爲function clickie(event) { return true;}是一個聲明,而不是一個函數。它不會返回任何東西。所以沒有什麼可以分配給onclick屬性的。希望這可以幫助。

0

最簡單的方法是:

yourElement.onclick = yourFunc.bind(this, [arg1, arg2]); 

function yourFunc (args, event) { 
    // here you can work with you array of the arguments 'args' 
}