onchange 事件的 ul 侦听器在 IE 中不起作用

发布于 2024-12-10 22:47:57 字数 1051 浏览 0 评论 0原文

我有一个 input 列表,

<ul id="list">
    <li><input type="text" /></li>
    <li><input type="text" /></li>
    <li><input type="text" /></li>
    <li><input type="text" /></li>
</ul> 

因为有很多,所以我让 ul 做一个事件委托:

function addHandler(element, type, handler) {
    if (element.addEventListener) {
        element.addEventListener(type, handler, false);
    } else if (element.attachEvent) {
        element.attachEvent("on" + type, handler);
    } else {
        element["on" + type] = handler;
    }
}
addHandler(document.getElementById("list"), "change", function(event) {
    event = event || window.event;
    var target = event.target || event.srcElement;
    if (target.nodeName === "INPUT") {
        alert(target.value);
    }
});

这在 Chrome、Firefox 中效果很好,但在 IE 中不行,这是什么?有问题吗?
小提琴:http://jsfiddle.net/94ngc/

I have a list of input

<ul id="list">
    <li><input type="text" /></li>
    <li><input type="text" /></li>
    <li><input type="text" /></li>
    <li><input type="text" /></li>
</ul> 

Because there are many of them, I let ul do a event delegation:

function addHandler(element, type, handler) {
    if (element.addEventListener) {
        element.addEventListener(type, handler, false);
    } else if (element.attachEvent) {
        element.attachEvent("on" + type, handler);
    } else {
        element["on" + type] = handler;
    }
}
addHandler(document.getElementById("list"), "change", function(event) {
    event = event || window.event;
    var target = event.target || event.srcElement;
    if (target.nodeName === "INPUT") {
        alert(target.value);
    }
});

This works well in Chrome, Firefox, but not in IE, what's the problem?
Fiddle: http://jsfiddle.net/94ngc/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

各空 2024-12-17 22:47:57

问题在于 change 事件在 IE<9 中存在错误。看看这个图表:

http://www.quirksmode.org/dom/events/ 如您所见, change

事件在所有浏览器中都有效,但 IE 仅在输入元素上触发它(我想它只是没有正确冒泡,或者它不适用于其他元素)。

尝试将此作为测试,它应该适用于 IE 中的第一个输入:

var inp = document.getElementById("list").firstChild.firstChild;
addHandler(inp, "change", function(event) {
    event = event || window.event;
    var target = event.target || event.srcElement;
    if (target.nodeName === "INPUT") {
        alert(target.value);
    }
});

我建议您循环遍历所有输入并将侦听器附加到每个元素,而不是将事件委托给 UL,或者使用像 jQuery 或 YUI 这样的事件规范化器。

注意:您的代码似乎在 IE9+ 中运行良好

The problem is that the change event is buggy in IE<9. Have a look at this chart:

http://www.quirksmode.org/dom/events/change.html

As you can see, the change event works in all browsers, but IE only triggers it on the input element (I suppose it just doesn’t bubble correctly, or it is not available for other elements).

Try this as a test, it should work for the fist input in IE:

var inp = document.getElementById("list").firstChild.firstChild;
addHandler(inp, "change", function(event) {
    event = event || window.event;
    var target = event.target || event.srcElement;
    if (target.nodeName === "INPUT") {
        alert(target.value);
    }
});

I suggest you loop through all your inputs and attach the listener to each element instead of delegating the event to the UL, or use an event normalizer like jQuery or YUI.

Note: your code seems to work fine in IE9+

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文