这是重新创建问题的最简单代码。 (在我的真实示例中,如果ajax调用出错,我正在重置复选框。)
<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 :(得分: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 :(得分:1)
所以问题是你在change事件中有效地触发了change事件。一个选项可能是使用不同的事件,因此您可以通过代码更改值。
或者,你可以考虑一个类似于这个的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;
}
})
});
希望有所帮助
RE:其他建议
这与我使用其他活动的建议相同。但是,如果用户选中并使用空格键进行更改,则单击时会丢失事件处理程序。当然,你可以决定这是否可以接受。
对不起另一张海报,我会评论你的,但我还没有声誉。这就是为什么我在这里,我想纯粹建立它,所以我可以打15,并标记一个帮助我前几天的答案。傻真的
答案 2 :(得分:1)
活跃旗帜的想法似乎也有同样的问题,但如果按照以下方式实施则可行:
var activeFlag = true;
$('#ckbx').change( function( e ){
if(activeFlag)
{
activeFlag = false;
alert('fired.');
this.checked = !this.checked;
}
else
{
activeFlag = true;
}
})