JS li 标签 onclick 在 IE8 上不起作用

2023-12-09

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

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

请建议


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:

  1. 它不保证处理程序的运行顺序(attachEvent以相反的顺序执行它们addEventListener)

  2. 它不处理周围的问题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');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS li 标签 onclick 在 IE8 上不起作用 的相关文章

随机推荐

  • C 位标志枚举应如何转换为 C++?

    C 大部分是 C 的超集 但并非总是如此 特别是 虽然 C 和 C 中的枚举值都隐式转换为 int 但反之则不然 只有在 C 中 int 才会转换回枚举值 因此 通过枚举声明定义的位标志无法正常工作 因此 这在 C 中是可以的 但在 C 中
  • 在 PDF 页面上运行 Chrome 插件

    使用 Chrome 扩展程序 我想 检测当前选项卡是否已加载 PDF 文件 向 popup html 添加一个按钮以提供将 PDF 转换为 HTML5 的功能 获取 PDF 文件的 URL 并将其发送到在线服务 为了实现 1 我认为本页上的
  • Javascript:无法使用 getElementById 获取元素[重复]

    这个问题在这里已经有答案了 好的 我需要新的眼光 因为我还在这个问题上待了一个小时 这是我的简单 HTML 代码 testssio html 其中包含 javascript 脚本 div div 但这不起作用 使用调试器 我得到
  • 在 Android 中按下按钮时增加按钮的大小

    如何使按钮的大小在按下时稍微增大并在释放时再次减小 这是为了通过使用尺寸和不同的颜色来突出显示按下的按钮 问候 琪琪 做你的Button一个字段 并修改其大小OnTouchListener与之相关 使用 OnTouchListener 你可
  • Doctrine DQL 条件查询

    我正在尝试使用 Doctrine 的查询生成器构建动态查询 假设我还想在下面选择一个结束时间 仅当输入一个结束时间时 我如何有条件地将其添加到声明中 query this gt getEntityManager gt createQuery
  • Excel VBA - 如果单元格是整数,则删除整行

    我一直在尝试使用一些关于如何删除 Excel VBA 上的整行的代码片段 但我无法修改它们以包含 IsNumber 验证 我需要能够选择一个活动区域 例如 Set r ActiveSheet Range A1 C10 当它逐行浏览时 并检查
  • 脚本每 24 小时重新启动一次 Heroku [重复]

    这个问题在这里已经有答案了 我有一个 Python 中的 Telegram 机器人 但它大约每 24 小时在工作线程中通过相同的命令重新启动一次 我正在使用免费版本的 dynohours 如何禁用此重新启动 你不能 您必须设计您的应用程序
  • ruby on Rails f.select 具有自定义属性的选项

    我有一个表单选择语句 如下所示 f select country id countries map c c name c id 这段代码的结果是
  • 在快照侦听器中添加一个新文档时,Firestore 文档读取成本

    我有一个文档侦听器 可以侦听与此类似的前 25 个文档 db collection cities whereField state isEqualTo CA limit to 25 addSnapshotListener querySnap
  • 使用 Selenium WebDriver 和 Java Robot 类上传文件

    我正在使用 Selenium WebDriver 和 Java 我需要自动化文件上传功能 我尝试了很多 但是当单击 浏览 按钮并打开一个新窗口时 脚本会停止进一步执行 并且会卡住 我尝试了 FireFox 和 IE 驱动程序 但没有成功 我
  • 一次检查所有 $_POST 变量

    有没有办法一次检查一个表单中的所有帖子变量 以至少验证它们不为空 例如 if isset ALL POST echo one of your fields is not completed 您可以创建一个必填字段的数组并循环遍历该数组 re
  • Kendo Grid 外键列动态绑定

    Html Kendo Grid IEnumerable
  • 如何检测手机是否连接android auto

    我正在开发一个音频播放器应用程序 我需要确定用户的设备何时连接到 Android Auto 该应用程序具有警报功能 我想确保它不会在用户开车时响起 确定我的音乐服务是否 MediaBrowserService 有效 我可以在 onCreat
  • 方言错误消息流口水

    我已经在 Tomcat 7 中部署了一个 webApp 我正在使用 Drools 现在 当我连续运行时 Drools 会抛出运行时异常 我也在类路径中添加了 core 3 4 2 v 883 R34x jar 请查找错误日志 Some er
  • C#串行端口监听器[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 在 C 中是否有任何串行端口侦听器 如果串行端口上有任何数据 它将调用我的函数 我唯一的想法是使用无限循环 如下所示 while true if someDataOnSerial
  • 用于选择单选按钮的greasemonkey脚本

    我是新来的 我有一个关于油脂猴的问题 一个页面包含多个单选按钮值 需要做出一个选择 这个正确的选择选项隐藏在页面中 单选按钮以结构如下的形式出现
  • 如何强制 npm 不创建本地包的符号链接?

    我下载了 npm 包的本地副本并将其解压到桌面上 然后我用了npm install directory 安装它 我注意到 当我删除桌面目录时 应用程序说它找不到已安装的模块 经过进一步调查 我注意到包裹在node modules但它旁边有箭
  • ag-grid API 在 Angular 单元测试中未定义

    我正在以角度编写 Ag grid 的单元测试用例 测试 组件 ts public gridApi GridApi public gridColumnApi constructor private service Service this i
  • 如果 UseSpaStaticFiles() 应该为 Angular 页面提供服务,为什么仍然需要 UseSpa() ?

    我在这里阅读了一些文章 博客文章和问题 但我仍然对 的用法感到困惑UseSpaStaticFiles and UseSpa ASP NET Core 2 1 中的中间件 参考 ASP NET Core 2 1 中的 UseStaticFil
  • JS li 标签 onclick 在 IE8 上不起作用

    我使用下面的 JS 但 li onclick 在 IE8 浏览器上不起作用 jsfiddle 链接 http jsfiddle net sudheera DUZ3B 14 HTML div class primaryNav fl ul cl