【问题标题】:Does event.stopPropagation in a checkbox click event prevent the change event from firing in IE8 and earlier?复选框单击事件中的 event.stopPropagation 是否会阻止更改事件在 IE8 及更早版本中触发?
【发布时间】:2012-05-31 17:24:13
【问题描述】:

似乎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>");
    });

});

这是预期的行为吗?

【问题讨论】:

  • 预期?不。虽然老实说,我对早期版本的 IE 做了一些看起来如此荒谬的事情并不感到惊讶。

标签: javascript jquery


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。但是,如果从点击事件中删除“event.stopPropagation()”行,则会在 IE8 中按预期触发更改事件。
  • 所以...我不相信这是众所周知的 IE8 错误,因为当删除“event.stopPropagation()”行时,我提供的测试用例可以正常工作。
  • jQuery 试图规范大多数浏览器的怪癖,包括这个:它模拟点击时的更改事件并吃掉在模糊时触发的事件(参见jQuery.event.special.change)。 stopPropagation 可能会干扰。
  • 在这种情况下,这听起来像一个 jquery,因为 stopPropagation 应该防止事件冒泡到父母,而不是防止给定元素内的事件。
  • 我认为这些 cmets 包含正确的答案 - 我已编译为单独的答案(并赞成 @Tgr 的答案)。
【解决方案2】:

(根据 Tgr 的答案编译 cmets,以便我接受答案。)

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

@Tgr 确认:

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

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多