【问题标题】:Simple jQuery click event bind not working in IE8简单的 jQuery 点击事件绑定在 IE8 中不起作用
【发布时间】:2013-09-24 16:51:13
【问题描述】:

这似乎适用于几乎所有浏览器,除了 IE8(可能还有 IE7,但我还没有尝试过),我不知道为什么。

$('body')
    .on('click', '.toggle', function(e){
        $(this).toggleClass('active');
        e.preventDefault();
        e.stopPropagation();
    });

我注意到,当我单击归类为 toggle 的链接时,尽管有 e.preventDefault(),浏览器仍会转到页面顶部。在调查问题时,我看到了返回 false 或设置 event.returnValue = false 等解决方案。我已经尝试了这两种方法,首先测试e.preventDefault(),然后在不满足条件时执行替代方法。

设置返回值:

$('body')
    .on('click', '.toggle', function(e){
        if (e.preventDefault()) {
                e.preventDefault();
            } else {
                e.returnValue = false;
            }
        $(this).toggleClass('active');
    });

我也尝试过在全局事件对象上设置returnValue,而不是像一篇文章中建议的那样将e 传递到绑定函数中。

我的尝试返回 false:

$('body')
    .on('click', '.toggle', function(e){
        if (e.preventDefault()) {
                e.preventDefault();
            }
        $(this).toggleClass('active');
        return false;
    });

尽管有所有这些不同的尝试,IE8 仍采用链接的默认操作并且 不会切换类。我在这里做错了什么?我正在使用 jQuery 1.10.2。

更新:找到问题的根源。谢谢大家的帮助。我有条件地包含了一些非 IE 的脚本元素,这个脚本就是其中之一。返回 false 现在对我有用。非常感谢您将我推向正确的方向!

【问题讨论】:

  • 这可能无法解决问题,但无论如何都应该这样做。删除 if 语句中的空括号,使其变为 if (e.preventDefault) {
  • 你在哪里绑定这个事件?即使您使用委托,'body' 在 DOM 准备好之前也不存在。将其放入$(document).ready( 或将其更改为$(document).on(。我将其更改为$(document).on,它在 IE 8 中(在 WinXP 虚拟机中)对我有效。
  • @RocketHazmat - OP 说它适用于所有其他浏览器,这不是问题。
  • @Adam:只是一个想法。 :)
  • @raddevon:是的,应该是一样的。在<body> 结束时,一切都应该准备就绪:-)

标签: javascript jquery internet-explorer internet-explorer-8


【解决方案1】:

您的 JS 中除此处以外的其他地方存在错误 - 它正在停止执行,因此您的事件处理程序永远不会被绑定。

打开开发工具 (F12) 并刷新您的页面,您会看到脚本错误。这就是造成问题的原因。

另外,请记住

e.preventDefault();
e.stopPropagation();

一样
return false;

stopPropagation() 和绑定到 body 元素的事件处理程序也有点奇怪,尽管我猜它会阻止事件冒泡到文档...

编辑#2

发生了 3 件事之一 - 1)您的代码在其他地方出现错误,导致执行停止并且处理程序未绑定,2)您的代码在事件处理程序中出现错误(不是来自什么您已发布)或 3)您特别在 IE8 中取消绑定此事件处理程序(或 body 元素上的所有事件处理程序)(不太可能)。

开始添加一些console.log 以确定上述哪一项导致了您的问题。

明确地说,您的事件处理程序应如下所示:

$('body').on('click','.toggle',function(e) {
     e.preventDefault();
     $(this).toggleClass('active');
});

【讨论】:

  • 我重新加载了 IE8 devtools 打开,但我没有看到任何错误。页面加载后,我的控制台很干净。我还尝试在 Chrome devtools 中重新加载。除了抱怨它找不到我的缩小文件的源映射之外,我也没有收到错误。
【解决方案2】:

在 IE8 中 event 对象没有 preventDefault 方法。在你的代码中调用它会在控制台中给你这样的错误:

TypeError: Object #<MouseEvent> has no method 'preventDefault'

此错误会导致脚本立即停止,因此锚可以执行其主要工作,即跟随 href。而不是那种用途:

$('body').on('click', '.toggle', function(e){
    $(this).toggleClass('active');
    return false;
});

【讨论】:

  • 传递给函数的“事件”是jQuery event。 jQuery 添加了一个preventDefault 方法。它“规范化”对象,使其在所有浏览器中的行为相同。
  • 我已更改我的代码以准确反映您在此处的内容。页面仍然滚动到顶部,我的课程仍然没有切换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多