2015-07-12 31 views
4

叫我在HTML下面的複選框:複選框的onclick功能不是在IE

上點擊

function updateSettings(id, bit) { 
 
    alert('0'); 
 
}
<input type="checkbox" onclick="alert('1');updateSettings(0, 1);alert('2');" />

在IE11我得到警報1,2,但不爲0:不執行功能在所有。

在Chrome中一切正常。

+0

它在我的IE 11中工作:http://codepen.io/anon/pen/WvJmOv – connexo

+0

@connexo,不在我的地址 – JNF

+0

@ user4749485 IE在文檔對象上定義了一個函數'updateSettings',查看我的答案。 – Zimmi

回答

2

發現了這個問題,但它很平穩。如果您將函數名稱更改爲小寫,那麼它可以工作。

function updatesettings(id, bit) { 
 
    alert('0'); 
 
}
<input type="checkbox" onclick="alert('1');updatesettings(0, 1);alert('2');" />

DEMOhttp://codepen.io/anon/pen/YXLgxJ

UPDATE:作爲濟米具有解釋updateSettings是在IE一個內置的方法document.updateSettings(),這將在onclick事件,而不是被觸發我們的方法window.updateSettings()

+0

哇,這很奇怪,我們現在只能在onclick函數中使用小寫嗎? – Alexander

+1

大聲笑..這真的很奇怪。無論如何,這是IE。 –

0

我建議不要使用內聯onclick事件,而使用jQuery來定義複選框的事件:

function updateSettings(id, bit) { 
     alert('0'); 
    } 

    jQuery(document).ready(function(){ 
     jQuery("#cbMyCheckbox").click(function(){ 
       alert('1'); 
       updateSettings(0, 1); 
       alert('2'); 
     }); 
    }); 

,然後在你的HTML:

<input type="checkbox" id="cbMyCheckbox" /> 
+0

這對我來說有點不方便:複選框是自動生成的,使用jquery定義事件會複雜得多:從某些複選框屬性中獲取函數參數是必要的... – Alexander

+1

這就是HTML5'data-'屬性爲;) – Terry

+0

@Terry很高興知道,thx。但在我的情況下,自動生成仍然更簡單;) – Alexander

3

功能updateSettings是在IE上定義的document對象。看到這個documentaion

當你內聯一個調用,如在這種情況下,在onclick中,如果函數被定義,它將首先在元素本身中查找。然後它會搜索DOM樹到document以查看函數是否被定義(有些元素被搜索,有些不是,不幸的是我不知道直到@ user4749485寫下他的評論爲止)的規則,並且之後,作爲最後的手段在window。正如它發現它,它運行它。

由於您可能在全局對象(window)上定義了您自己的updateSettings,因此在IE中未觸發它,因爲在document對象上定義的函數首先被找到。

神祕的bug結束:-)

UPDATE:

@ user4749485指向的鏈接解釋這個在w3 site,信息項1.10 - 詞法環境範圍。概括起來:

<element onclick="functionFoo();">bar</element> 

意味着以下過程:

Does element.functionFoo exist ? YES ==> use this function. 
ELSE 
Does element belong(1) to a form and form.functionFoo exist ? YES ==> use this function. 
ELSE 
Does document.functionFoo exist ? YES ==> use this function. 
ELSE 
Does window.functionFoo exist ? YES ==> use this function. 
ELSE 
crash. 

(1)=一個元件屬於一個形式=一個元件是一個形式元素的內部。粗略地說,它必須是一個表單元素,就像在輸入元素的問題中一樣。

+0

@ user4749485非常感謝您的鏈接,我相應地更新了這篇文章。這很好,我們現在有確切的信息。 – Zimmi