当用户点击屏幕上的任意位置时,IE会触发复选框的更改事件

时间:2011-07-12 16:00:08

标签: jquery internet-explorer

这是重新创建问题的最简单代码。 (在我的真实示例中,如果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的版本。

3 个答案:

答案 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;
    }
})