jsfiddle链接:
http://jsfiddle.net/sudheera/DUZ3B/14/
HTML
<div class="primaryNav fl">
<ul id="hd_vertical" class="productNav">
<li id="hd_test" class="flight">
<span class="navIcon flightIcon hd_test">Test</span>
<a class="hd_test" href="http://validator.w3.org/">Flights</a>
</li>
<li id="hd_test1" class="bus">
<span class="navIcon busIcon hd_test1">Test</span>
<a class="hd_test1" href="http://www.w3schools.com/">Buses</a>
</li>
</ul>
</div>
JS
var changeLocation = function(id) {
var _url = document.getElementsByClassName(id)[1].getAttribute('href');
location.href = _url;
}
document.getElementById("hd_vertical").addEventListener("click",function(e) {
if(e.target.nodeName == "LI") {
var _anchor = e.target.id;
changeLocation(_anchor);
} else if(e.target.nodeName == "SPAN") {
var span = e.target;
var li = span.parentNode;
var _anchor = li.id;
changeLocation(_anchor);
}
});
请提出建议
#1 楼
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
与e.keyCode
之类的问题,例如...以及当然,我没有提供分离事件功能。 :-)对于类似的事情,请考虑使用jQuery,YUI,Closure或其他任何一种库。问题,IE8也不支持
getElementsByClassName
。但是它确实支持querySelectorAll
和querySelector
,因此请更改:var _url = document.getElementsByClassName(id)[1].getAttribute('href');
到
var _url = document.querySelectorAll("." + id)[1].getAttribute('href');
请注意,这将尝试获取与选择器匹配的第二个元素。
[1]
是列表中的第二个条目,而不是第一个条目,它将是[0]
。如果您是第一个,则可以使用querySelector
,它仅返回第一个匹配项:评论
@Neo-我喜欢称其为不兼容模式。 ;-)当然,我不明白为什么不这样做,它查看已定义的内容,并且在(兼容)兼容模式下,IE11陷入困境,并且未定义addEventListener ...
– T.J.拥挤者
5月1日18:37
评论
您是否看过:stackoverflow.com/questions/9769868/…?您的代码完全不符合IE8,IE8不支持getElementsByClassName,addEventListener等。您可以在MDN上查找所有本机javascript函数,并查看支持哪些浏览器。
@adeneo谢谢您的回复,我尝试了不同的代码来实现li onclik,但这是我得到的最好的代码。请建议是否为li onclick使用其他JS:它应注意内部跨度,锚标记和浏览器兼容性。