IE8及更早版本没有addEventListener
,但它们确实有其非标准前身,attachEvent
。他们不是quite相同。
这是一个使用可用内容的“挂钩此事件”函数:
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
and stopPropagation
浏览器上事件对象的函数使用attachEvent
并确保this
如果您使用的是处理程序调用中的内容addEventListener
.
上述内容实现了事件标准化的各个方面not do:
它不保证处理程序的运行顺序(attachEvent
以相反的顺序执行它们addEventListener
)
它不处理周围的问题e.which
vs. e.keyCode
等等
...当然,我还没有提供detach事件函数。 :-) 对于类似的事情,请考虑使用类似的库jQuery, YUI, Closure, or 其他几个中的任何一个.
旁注:如adeneo在对该问题的评论中指出,IE8也不支持getElementsByClassName
。但它does支持querySelectorAll
and querySelector
,所以改变:
var _url = document.getElementsByClassName(id)[1].getAttribute('href');
to
var _url = document.querySelectorAll("." + id)[1].getAttribute('href');
请注意,这将尝试获取second与选择器匹配的元素。[1]
是列表中的第二个条目,而不是第一个条目,这将是[0]
。如果您的意思是第一个,您可以使用querySelector
,它仅返回第一个匹配项:
var _url = document.querySelector("." + id).getAttribute('href');