Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪个跨浏览器EventListener是正确的(纯Javascript)_Javascript_Cross Browser_Event Listener - Fatal编程技术网

哪个跨浏览器EventListener是正确的(纯Javascript)

哪个跨浏览器EventListener是正确的(纯Javascript),javascript,cross-browser,event-listener,Javascript,Cross Browser,Event Listener,我需要一个纯Javascript的交叉浏览器EventListener 在互联网上我发现了以下两个版本 哪一个是正确的/更好的 有人能解释一下第二个版本吗 (尤其是这一段我不清楚:event_function.call(html_元素) 第1版: function AddEvent(html_element, event_name, event_function) { if(html_element.attachEvent) //Internet Explorer

我需要一个纯Javascript的交叉浏览器EventListener

在互联网上我发现了以下两个版本

哪一个是正确的/更好的

有人能解释一下第二个版本吗

(尤其是这一段我不清楚:event_function.call(html_元素)

第1版:

function AddEvent(html_element, event_name, event_function) 
{       
   if(html_element.attachEvent) //Internet Explorer
      html_element.attachEvent("on" + event_name, event_function); 
   else if(html_element.addEventListener) // Everything else
      html_element.addEventListener(event_name, event_function, false);
}
function AddEvent(html_element, event_name, event_function) 
{       
   if(html_element.attachEvent) //Internet Explorer
      html_element.attachEvent("on" + event_name, function() { event_function.call(html_element); }); //<-- This I don't understand
   else if(html_element.addEventListener) // Everything else
      html_element.addEventListener(event_name, event_function, false);
}
第2版:

function AddEvent(html_element, event_name, event_function) 
{       
   if(html_element.attachEvent) //Internet Explorer
      html_element.attachEvent("on" + event_name, event_function); 
   else if(html_element.addEventListener) // Everything else
      html_element.addEventListener(event_name, event_function, false);
}
function AddEvent(html_element, event_name, event_function) 
{       
   if(html_element.attachEvent) //Internet Explorer
      html_element.attachEvent("on" + event_name, function() { event_function.call(html_element); }); //<-- This I don't understand
   else if(html_element.addEventListener) // Everything else
      html_element.addEventListener(event_name, event_function, false);
}
函数AddEvent(html\u元素、事件\u名称、事件\u函数)
{       
if(html\u element.attachEvent)//Internet Explorer

html_element.attachEvent(“on”+event_name,function(){event_function.call(html_element);}/序言:所有现代浏览器都支持
addEventListener
,甚至支持IE9+,但需要注意的是,IE9-IE11默认情况下会通过内部网集和(我认为)上的兼容模式蹒跚而行在其他一些上下文中。您可以通过从服务器发送
X-UA-Compatible
头,或将其作为
meta
标记包含在
头的开始处,来告诉IE9-IE11。(声称您实际上必须从服务器发送,但我认为这是不正确的;只是如果您将
meta
标记放得更低,IE可能会忽略它。)因此,除非您需要支持IE8,否则您可能不再需要跨浏览器的替代方案


它们都没有彻底规范化事件处理程序处理的内容

您需要处理的差异包括:

  • 调用处理程序时,
    this
    的值

  • 事件
    对象来自何处

  • 事件
    对象上可用的方法

您不理解的部分:

html_element.attachEvent("on" + event_name, function() { event_function.call(html_element); }); //<-- This I don't understand
然后您可以在示例中这样使用它:

hookEvent(document.getElementById("hd_vertical"), "click", function(e) {
    // ...
});

如果你真的需要支持IE8(或更少)的话,就可以使用它然后检查它们是否都没有完成跨浏览器处理的彻底工作。非常感谢!这真是太棒了!您是否还可以为REMOVEListener函数提供代码?因为我不知道如何在REMOVEListener中重新排列旧的IEHookEvent函数。@user3297459:是的,上面没有为删除li做任何准备steners.有很多方法可以做到这一点。
removeEventListener
的工作方式实际上有点难以模仿;基本上你必须做jQuery所做的事情:为你的库钩住事件一次,存储一个已注册的处理程序列表,如果事件发生,你自己启动它们。然后你就有了需要删除的信息一个。这相当复杂。上面的函数可以非常简单地返回一个函数,让你删除刚才添加的侦听器,但这使用的是不同的语义。是的,这就是我所想的。无论如何,谢谢。所以我可能要用你的逻辑加上事件缓存来构建一组函数,就像Dustin Diaz在他的“岩石固体加法器”中所做的那样再加上我自己的RemovelListener函数,它使用缓存来删除侦听器。不过,再一次:非常感谢!你真的帮助了我!