2011-07-12 52 views
1

以下是重現此問題的最簡單代碼。 (在我的現實世界的例子,我重置複選框,如果存在與Ajax調用錯誤。)當用戶單擊屏幕上的任何位置時,IE會觸發複選框的更改事件

<html> 
    <script src="http://code.jquery.com/jquery-1.4.2.js"></script> 
<script> 
    $(document).ready(function(){ 
     $('#ckbx').change(function(e){ 
      alert('fired.'); 
      this.checked = !this.checked; 
     }) 
    }); 
</script> 

<form> 
    <input id="ckbx" type="checkbox"></input> 
</form> 

</html> 

在IE9中,當我點擊複選框,則顯示警報。然後,如果我等待任何時間,然後點擊頁面上的其他任何地方,它會再次觸發該事件。

如果我刪除this.checked = !this.checked問題就消失了。

任何人都可以解釋這一點嗎?或者提供一種解決這個問題的方法?

更新: 我正在使用jquery 1.4.2;在jquery 1.6中這不是一個問題。但是,我們接近發佈,並且我們不願意更改jquery的版本。

+0

的jQuery已經更新了IE9。既然你發現了一個特定於IE9的舊jQuery bug,並在jQuery 1.6中修復了這個bug,我不確定你想從我們這裏得到什麼。 – Sparky

+1

即使使用jQuery 1.6.2,它也可以在IE7中完成,所以我不認爲這是相關的。 – Pointy

+0

'Khm'!.....我聽說過'IE'嗎? :) –

回答

1

這是因爲.change()事件在您重置複選框並單擊頁面上的其他位置時會再次觸發。您應該使用.click()事件。

<html> 
    <script src="http://code.jquery.com/jquery-1.4.2.js"></script> 
<script> 
    $(document).ready(function(){ 
     $('#ckbx').click(function(e){ 
      alert('fired.'); 
      this.checked = !this.checked; 
     }) 
    }); 
</script> 

<form> 
    <input id="ckbx" type="checkbox"></input> 
</form> 

</html> 
+1

當我讀到這個回覆時,我原本以爲點擊不會在用戶使用鍵盤時處理,但它確實如此。所以,我要去解決這個問題。謝謝。 – mlsteeves

1

所以問題在於,您正在從更改事件內部有效觸發更改事件。一種選擇可能是使用不同的事件,以便通過代碼更改值。

或者,你可以考慮一個類似的activeFlag ...

var activeFlag; 
$(document).ready(function(){ 
    activeFlag = true; 
    $('#ckbx').change(function(e){ 
     if(activeFlag) 
     { 
      alert('fired.'); 
      activeFlag = false;//temp disable event to process value reset 
      this.checked = !this.checked; 
      activeFlag = true; 
     } 
    }) 
}); 

希望幫助

回覆:其它意見

這將是我的建議,使用相同的另一個事件。但是,如果用戶選中並使用空格鍵進行更改,則點擊會丟失事件處理程序。當然,你可以決定這是否可以接受。

對不起另一張海報,我會評論你的,但我還沒有名聲。這實際上是我爲什麼來到這裏的原因,我想純粹爲了這個目的,我可以打到15,並且標記出一個能夠幫助我的答案。傻真

1

活躍標記想法似乎有同樣的問題,但它的工作原理,如果實現這樣的:

var activeFlag = true; 
$('#ckbx').change(function(e){ 
    if(activeFlag) 
    { 
     activeFlag = false; 
     alert('fired.');    
     this.checked = !this.checked;   
    } 
    else 
    { 
     activeFlag = true; 
    } 
}) 
相關問題