javascript – 在手動呼叫事件處理程式時給出某些條件的IE中出錯
前言
>請注意,我不是在尋找程式碼解決方案,而是深入瞭解為什麼會發生這種情況.
> IE(測試7和8),但不是Firefox,Chrome,Safari的錯誤.
描述
當手動呼叫分配給onclick的功能時,如果滿足以下所有條件,IE將丟擲Error:Object不支援此操作:
>通過元素的[event]屬性直接呼叫該方法.
>你不使用.call()或.apply().
你傳遞一個引數(任何引數,甚至是未定義的).
>您嘗試將返回值分配給變數.
違反這些規則中的任何一個,並且呼叫成功.
該功能本身似乎與之無關.空函式給出相同的結果.
碼
var elem = document.getElementById('test');// simple div element. var result;// store result returned. function test_func(){};// function declaration. // function expression behaves identically. elem.onclick = test_func; // assign test_func to element's onclick. // DIRECT CALL test_func();// works test_func( true );// works result = test_func();// works result = test_func( true );// works // DIRECT CALL, CHANGING THE CONTEXT TO THE ELEMENT test_func.call( elem );// works test_func.call( elem, true );// works result = test_func.call( elem );// works result = test_func.call( elem, true );// works ******** (surprising) // CALL VIA ELEMENT, USING .call() METHOD, CHANGING THE CONTEXT TO THE ELEMENT elem.onclick.call( elem );// works elem.onclick.call( elem, true );// works result = elem.onclick.call( elem );// works result = elem.onclick.call( elem, true );// works ******** ( very surprising) // CALL VIA ELEMENT elem.onclick();// works elem.onclick( true );// works result = elem.onclick();// works result = elem.onclick( true );// Error: Object doesn't support this action
概要
再次,我不需要程式碼解決方案.相反,如果有人深入瞭解為什麼IE以這種方式實現,我很好奇.
非常感謝.
編輯:澄清一件事,實際功能什麼都沒有任何區別.命名引數,不命名,返回引數,返回一個文字值,返回未定義,所有這些都不起作用.
這可能是因為函式似乎從來沒有被實際呼叫.正如我在下面的評論中指出的,導致此呼叫的程式碼執行正常,因此它也不是解析問題.但是當口譯人員到達這個時,它會看到:
Variable + AssignmentOperator + DOMElement + EventHandler + CallOperator + Argument
…並丟擲錯誤.沒有操縱我似乎有任何區別.任何一個的有效刪除,錯誤消失.
如果我將一個變數新增到儲存處理程式的中間,然後從變數工作起來.
var temp = elem.onclick; result = temp( true );// works
…但這不應該是一個驚喜,因為它是有效地與上面的第四個版本相同.
.
問為什麼也是不必要的因為
>你不會經常使用引數呼叫事件處理程式
>您可以解決問題(正如您在問題中所述)
另外要注意的是,你的比喻太具體了.問題不僅限於賦值表示式,還可以使用其他型別的表示式進行重現:
undefined === elem.onclick( true ) typeof elem.onclick( true ) elem.onclick( true ) - 1 alert(elem.onclick( true ))
http://stackoverflow.com/questions/4138277/error-in-ie-when-manually-calling-event-handler-given-certain-conditions