IE8和更早版本没有
addEventListener,但是它们确实有其非标准的前身
attachEvent。他们不是 很 一样。
这是一个使用可用功能的“挂钩此事件”功能:
var hookEvent = (function() { var div; // The function we use on standard-compliant browsers function standardHookEvent(element, eventName, handler) { element.addEventListener(eventName, handler, false); return element; } // The function we use on browsers with the previous Microsoft-specific mechanism function oldIEHookEvent(element, eventName, handler) { element.attachEvent("on" + eventName, function(e) { e = e || window.event; e.preventDefault = oldIEPreventDefault; e.stopPropagation = oldIEStopPropagation; handler.call(element, e); }); return element; } // Polyfill for preventDefault on old IE function oldIEPreventDefault() { this.returnValue = false; } // Polyfill for stopPropagation on old IE function oldIEStopPropagation() { this.cancelBubble = true; } // Return the appropriate function; we don't rely on document.body // here just in case someone wants to use this within the head div = document.createElement('div'); if (div.addEventListener) { div = undefined; return standardHookEvent; } if (div.attachEvent) { div = undefined; return oldIEHookEvent; } throw "Neither modern event mechanism (addEventListener nor attachEvent) is supported by this browser.";})();
然后,您将在示例中使用它:
hookEvent(document.getElementById("hd_vertical"), "click", function(e) { // ...});
请注意,它如何在使用的浏览器上提供事件对象的缺少
preventDefault和
stopPropagation功能,
attachEvent并确保
this在处理程序调用中使用的是它
addEventListener。
有活动正常化的各个方面,上面的也 没有 做:
它不能保证处理程序的运行
attachEvent
顺序(它们的执行顺序与之相反addEventListener
)它不处理
e.which
与vs之e.keyCode
类的问题
旁注:正如adeneo在对问题的评论中指出的那样,IE8也不支持
getElementsByClassName。但是它确实支持
querySelectorAll和
querySelector,因此请更改:
var _url = document.getElementsByClassName(id)[1].getAttribute('href');
至
var _url = document.querySelectorAll("." + id)[1].getAttribute('href');
请注意,这将尝试获取与选择器匹配的第二个元素。
[1]是列表中的第二个条目,而不是第一个
[0]。如果您要使用
querySelector第一个匹配项,则可以使用,它仅返回第一个匹配项:
var _url = document.querySelector("." + id).getAttribute('href');
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)