复选框单击事件中的event.stopPropagation是否阻止更改事件在IE8及更早版本中触发?

时间:2012-03-13 16:39:14

标签: javascript jquery

复选框event.stopPropagation()事件中的click似乎会阻止相关的change事件在IE9之前在IE中触发。

(以下代码位于jsFiddle

<input type="checkbox" value="Y" checked>Test
<div id="output">Logging...</div>

使用以下jquery块,IE8及更早版本中的更改事件不会触发,但IE9(和Chrome)中的 会触发:

$(document).ready(function() {

    $("input").click(function(event) {
        event.stopPropagation();
        $("#output").append("<pre>click</pre>");
    });

    $("input").change(function(event) {
        $("#output").append("<pre>change</pre>");
    });

});

Chrome和IE9提供:

Logging...
change
click
change
click
change
click

IE8及更早版本给出了:

Logging...
click
click
click

但是,如果我在特定的“IE9之前”处理,那么所有工作都按预期工作:

使用以下jquery块:

$(document).ready(function() {

    $("input").click(function(event) {

        event.stopPropagation();

        $("#output").append("<pre>click</pre>");

        // fix event bubbling before IE9
        if ($.browser.msie) {
            if (parseInt($.browser.version, 10) < 9) {
                $(this).trigger("change");
            }
        }

    });

    $("input").change(function(event) {
        $("#output").append("<pre>change</pre>");
    });

});

这是预期的行为吗?

2 个答案:

答案 0 :(得分:3)

这是一个与事件冒泡无关的well-known IE8 bug:当焦点离开时,更改事件仅在复选框上触发。

答案 1 :(得分:1)

(编写有关Tgr答案的评论,以便我接受答案。)

如果从click事件中删除了“event.stopPropagation()”行,则会在IE8中按预期触发更改事件,因此这不是众所周知的IE8错误mentioned by Tgr

@Tgr确认:

  

jQuery尝试规范化大多数浏览器怪癖,包括这个:它在点击时模拟更改事件并吃掉在模糊时触发的事件(参见jQuery.event.special.change)。 stopPropagation可能会干扰这一点。