attachEvent在队列的开头插入事件,而addEventListener将事件附加到队列

Mar*_*aio 2 javascript events event-handling addeventlistener

我使用这个简单的工作函数来添加事件:

function AppendEvent(html_element, event_name, event_function)
{
   if(html_element)
   {
      if(html_element.attachEvent) //IE
         html_element.attachEvent("on" + event_name, event_function);
      else if(html_element.addEventListener) //FF
            html_element.addEventListener(event_name, event_function, false);
   };
}
Run Code Online (Sandbox Code Playgroud)

在做这个简单的测试时:

AppendEvent(window, 'load', function(){alert('load 1');});
AppendEvent(window, 'load', function(){alert('load 2');});
Run Code Online (Sandbox Code Playgroud)

我注意到FF3.6 addEventListener 在事件队列的末尾追加每个新事件,因此在上面的例子中你会得到两个警告,说'加载1''加载2'.

另一方面,IE7 attachEvent在事件队列的开头插入每个新事件,因此在上面的示例中,您将收到警告"加载2"加载1'.

有没有办法解决这个问题并使两者以同样的方式工作?

谢谢!

Poi*_*nty 8

根据MSDN文档,attachEvent未指定执行顺序(使用的单词是"随机").然而,这与附件的逆序相反并不奇怪.

您可以完全避免这样做,并根据所涉及元素的"on event "属性构建一系列处理程序.或者你可以使用jQuery或类似的东西,如果可能的话.


小智 6

我解决了这个问题:

function addEvent(obj,evtype,func,bubble)
{
    try
    {
         obj.addEventListener(evtype,func,bubble);
    }
    catch(err) // for bastard IE
    {
         if(obj["on"+evtype] == null)
              obj["on"+evtype] = func;
         else
         {
          var e = obj["on"+evtype];
          obj["on"+evtype] = function(){e(); func();}
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

工作完美