JS的li标签在IE8上无法点击

5

我使用以下JS代码,但是在IE8浏览器上,li的onclick不起作用。

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);
    }
});

请建议。

你看过这个网址吗:https://dev59.com/TGkw5IYBdhLWcg3wm70g? - Awad Maharoof
你的代码完全不符合IE8标准,IE8不支持getElementsByClassNameaddEventListener等。你可以在MDN上查找所有本地JavaScript函数,并查看它们在哪些浏览器中受支持。 - adeneo
@adeneo 感谢您的回复,我尝试了不同的 li onclik 代码,但这是我得到的最好的一个。请建议是否有其他 JS 适用于 li onclick:它应该处理内部 span、anchor 标签和浏览器兼容性。 - Sudheera
1个回答

7

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) {
    // ...
});

请注意,它在使用attachEvent的浏览器上提供了缺失的preventDefaultstopPropagation函数,并确保在处理程序调用中的this与使用addEventListener时相同。
以上内容未涵盖事件规范化的各个方面:
1. 它不能保证处理程序运行的顺序(attachEvent的顺序与addEventListener的顺序相反) 2. 它未解决关于e.whiche.keyCode等问题。
当然,我还没有提供detach事件函数。 :-) 对于这些功能,请考虑使用像jQueryYUIClosure其他几个库之一
附带说明:正如adeneo在评论中指出的那样,IE8也不支持getElementsByClassName。但是它支持querySelectorAllquerySelector,所以可以将代码更改为:
var _url = document.getElementsByClassName(id)[1].getAttribute('href');

to

var _url = document.querySelectorAll("." + id)[1].getAttribute('href');

请注意,这将尝试获取与选择器匹配的第二个元素。 [1]是列表中的第二个条目,而不是第一个,第一个应该是[0]。 如果您想要第一个匹配项,可以使用querySelector,它仅返回第一个匹配项:
var _url = document.querySelector("." + id).getAttribute('href');

@Neo - 我喜欢称之为兼容模式。;-) 当然,我看不出为什么不行,它查看了定义和(不)兼容模式,在IE11的不兼容模式下,它会禁用自身并不定义addEventListener... - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接