javascript - 我应该直接分配 JavaScript 事件来统一代码吗?

标签 javascript internet-explorer

我的编程是否很差,或者通过分配事件处理程序对 IE 向后弯曲太多,例如:

element.someEvent = someFunction; 

而不是:

element.attachEventListener("someEvent", someFunction, false);
  • 这个想法有哪些缺点和优点?
  • 如果不测试和选择正确的方法,我会错过什么或让自己陷入什么境地?

最佳答案

如果您使用 element.onclick = xxx; 样式,则您将自己(以及您在页面上使用的任何其他脚本)限制为单个该元素上的事件的事件处理程序(该事件的任何先前处理程序都会受到攻击)。通过 addEventListener/attachEvent 机制,您可以独立地附加和删除事件处理程序,而不会发生串扰。

例如,如果您这样做:

 document.getElementById('foo').onclick = function() {
 };

...然后元素 foo 上任何先前的 click 处理程序都会被吹走,并且在单击 foo 时不再被调用。相比之下:

 document.getElementById('foo').addEventListener('click', function() {
 });

现在您的 click 处理程序被调用,但之前附加到该元素的任何其他 click 处理程序也 em> 被叫到。你和别人相处得很好。 :-)

创建一个函数来解决这些问题很容易:

function hookEvent(element, eventName, handler) {
    if (element.attachEvent) {
        element.attachEvent("on" + eventName, handler);
    }
    else if (element.addEventListener) {
        element.addEventListener(eventName, handler, false);
    }
    else {
        element["on" + eventName] = handler;
    }
}

...或者如果您真的想去城里:

var hookEvent = (function() {

    function hookViaAttach(element, eventName, handler) {
        element.attachEvent("on" + eventName, handler);
    }
    function hookViaAdd(element, eventName, handler) {
        element.addEventListener(eventName, handler, false);
    }
    function hookDOM0(element, eventName, handler) {
        element["on" + eventName] = handler;
    }

    if (document.attachEvent) {
        return hookViaAttach;
    }
    if (document.addEventListener) {
        return hookViaAdd;
    }
    return hookDOM0;
})();

...它创建一个函数,该函数检测一次要使用哪种类型的处理程序,然后在整个过程中使用它。

坦率地说,对于这些东西,利用其他人的工作并使用像 jQuery 这样的库是很有用的。 , Prototype , YUI , Closure ,或any of several others .

关于javascript - 我应该直接分配 JavaScript 事件来统一代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4340547/

相关文章:

javascript - 使用什么事件来触发将 JSON 内容插入到现有 HTML 标记中?

javascript - Angular TypeScript 服务未定义

c# - IE7 中由 JavaScript 和图像引起的混合内容警告

html - 旋转时图标在 IE9 和 IE10 中消失

css - 如何在 Internet Explorer 8 中设置 <div> 框的最小高度?

javascript - 阻止 IE 两次加载动态包含的脚本

javascript - IE10 在文档打开后但在文档写入之前执行功能问题?

javascript - "(AppContainer)RangeError: Maximum call stack size exceeded"- 与 react 热加载器 react

javascript - 一个子组件与 ReactJS 中的另一个兄弟组件对话

javascript - 对两个不同的 ID 使用 jquery IF 语句