【问题标题】:event.preventDefault() or return false don't work in IE9event.preventDefault() 或 return false 在 IE9 中不起作用
【发布时间】:2014-01-12 02:51:09
【问题描述】:

我正在尝试让以下代码在所有版本的 IE 中工作,因为它可以在其他浏览器中找到:

  <a href="" class="specificClass">Click Me </a>
    //Javascript
     $(".specificClass").click(
                        function(e) {
                            e.preventDefault();
                           // Do Something
                             //return false; Doesn't work either
                        }
                );

切换到href="#" 使其尝试转到页面顶部,同样仅在 IE9 中。例如: 在 IE9 中离开 href="" 会重定向到当前链接本身。

<a href="#" onclick="doSomething(this); return false;"> Click Me Two </a>

似乎这两种方法都会触发 onclick Javascript 被调用,但 href="" 的默认行为不会被覆盖。如果我使用event.preventDefault() 什么都不会发生。

以下方法有效:

<a href="javascript:doSomething(this);"> Click Me Two </a>
function doSomething(me) {

    // event.preventDefault is not needed as the javascript is added via href

}

但是我不想让我的所有锚标记都使用 href="javascript:" 或 onclick="doSomething"只是为了让它在 IE9 中工作。 我也不想使用不同的标签(例如尝试了 span 标签),因为在所有浏览器中设置样式都很棘手。

还有其他想法吗?

看起来这是一个合法的错误,我已提交修复它的请求。我现在也提出了一种解决方法: https://connect.microsoft.com/IE/feedback/details/812247/event-preventdefault-or-return-false-dont-work-in-ie9

【问题讨论】:

  • 我在你的代码中看到了 jQuery - 注意 jQuery 事件和普通 DOM 事件是不同的,preventDefault 即使在 jQuery 中也不起作用?
  • 它当然可以在所有其他浏览器中使用?
  • 仅作记录,在您的实际页面中,上面的第一个 JS 位于脚本标记和链接下方 - 正确吗?
  • 是的,代码在 Javascript 文件中,并且包含 JQuery 作为库。 preventDefault 即使在 JQuery 格式中也不起作用,尽管它似乎已被触发(使用开发人员工具添加了一个调试点)。我的代码只是显示正在发生的事情的一个示例。 @adeneo 当然 :)
  • 如果有帮助,HTML 将通过 ASP 代码生成。也许那里发生了什么事情没有在点击时及时在 JQuery 中添加 .click 触发器?

标签: javascript cross-browser internet-explorer-9


【解决方案1】:

在 IE9 中,遗留事件处理程序模型仍然部分使用。 preventDefault() 仅在使用 addEventListener() 附加事件侦听器时有效。

如果您想阻止内联处理程序的默认操作,您必须使用旧方法:

event.returnValue = false;
event.cancelBubble = true; // This is affects like event.stopPropagation() in older IEs

虽然 jQuery 不工作很奇怪,但我对此没有任何解释......除非你在兼容模式下运行 IE 并使用 jQuery 2.X?


编辑

如果没有打开开发工具,对console 对象的引用也会破坏 IE

// The very first lines in the global context
if (!window.console) {
    window.console = {
        log: function () {}
        // Add other console methods, if the scripts on the page are using them
    }
}

虽然使用上面的代码可以避免console 问题,但最好从要发布的最终代码中删除所有日志记录。

【讨论】:

  • 考虑到他的帖子内容——这个解决问题会让我感到惊讶,因为他使用的 jQuery 已经对其进行了规范化。
  • 嗯.. 看起来我在这里搞砸了......也许我会等待 OP 的回应,因为我现在还没有 IE9。虽然我也可以在帖子中看到内联 onclick()...
  • 您好,感谢您的回答。不幸的是,除非我在 IE 中打开调试器,否则这也不起作用,而且它似乎确实触发了。是否有可能在 .click 可以通过 JQuery 应用之前调用默认行为。我使用的是 JQuery 1.8,无法控制我们使用的版本。
  • @Amy 在您发表评论后,您的处理函数中似乎有一个console.log()。如果没有打开,IE9 无法识别console。只需删除/注释掉 console 调用,您的 jQuery 就可以正常工作了。
  • "not working unless I have the Debugger open in IE" 明确指向console对象的引用,即IEundefined,如果没有打开开发工具...对不起,看起来就像我不知道你的代码有什么问题:-(。(5) 一般来说,jQuery 的“事件模型”在 IE9 中运行良好,onclickhref 之前被明确处理。
【解决方案2】:

这可能是由于事件冒泡造成的。

查看此链接: http://api.jquery.com/event.stopPropagation/

event.stopPropagation();

【讨论】:

  • 这也让我很惊讶,因为他的第一个代码示例执行了return false(下面也不起作用),它同时执行了 stopPropagation() 和 preventDefault()
【解决方案3】:

对于 IE9,如果站点上的任何位置有任何 console.log,除非您打开开发人员工具,否则会出现意外行为。对于实际用户来说是不可能的。

在没有任何 console.log(在 IE9 中)的情况下查看它如何正常工作:jsfiddle.net/4hfjq/10,但当你这样做时却不行:jsfiddle.net/4hfjq/20 尝试重新定向到“”页面,除非您打开了开发人员工具。

就我而言,console.logs 太多了,所以我采用了另一种解决方法,即使用 &lt;a href="javascript:doSomething()"&gt;Link &lt;/a&gt; 并在不使用 JQuery .eventType 方法的情况下定义该代码。检查这个:jsfiddle.net/4hfjq/22

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2022-01-02
    • 2016-06-13
    相关资源
    最近更新 更多