event.preventDefault()没有取消jQuery Mobile中的链接方向

背景
我一直在努力解决这个愚蠢的小问题,试图在jQuery Mobile应用程序中的一个锚元素上触发click事件时取消链接方向。

假设我有一个简单的多页文档,如下所示:

 

……和这样的JavaScript:

 (function (MyApp, $, undefined) { 'use strict'; // Initializes app function init() { $('#mLink').on('click', function (event) { event.preventDefault(); //event.stopPropagation(); //event.stopImmediatePropagation(); }); } // jQuery Mobile is ready now -> override defaults $(document).on("mobileinit", function () { // Set the default page transition $.mobile.defaultPageTransition = 'slide'; }); // jQuery Mobile is ready now $(document).ready(init); }(window.MyApp = window.MyApp || {}, jQuery)); 

问题
我无法弄清楚为什么event.preventDefault()没有取消页面转换。 但是,如果我添加event.stopPropagation() ,它将取消它。 此外,如果我从应用程序中删除jQuery Mobile库,它可以在没有event.stopPropagation()


这是正常的行为,是否可以在处理程序中始终调用它们以取消链接方向?

笔记
我只使用jQuery Mobile的多页模板,导航和转换function。

补充问题
隐藏在我原始问题背后的问题是“jQuery Mobile对截取event.preventDefault()方法的链接做了什么,以防止链接的默认操作,即转到目标页面。”

正常? 是。 可以同时打电话吗? 是。
event.preventDefault()是防止浏览器默认行为和event.stopPropagation()的唯一工具,是防止竞争事件处理程序触发的唯一工具。

如果你想要一个单行,你可以使用return false来实现相同的结果。 来自http://api.jquery.com/on/ :

从事件处理程序返回false将自动调用event.stopPropagation()和event.preventDefault()。 也可以为处理程序传递false值,作为function(){return false;的简写; }。 所以,$(“a.disabled”)。on(“click”,false); 将事件处理程序附加到具有“禁用”类的所有链接,以防止它们在单击时被跟踪并且还阻止事件冒泡。

我必须承认我对jQuery mobile不太熟悉,但我对此并不感到惊讶。 我最近为移动设备编写了一些脚本(纯JS),你注意到的第一件事就是大多数都没有点击事件。 一切都很现在。

问题是,触摸事件严重超载 :当用户触摸屏幕并保持X时间时,他可能会尝试选择一些文本,获取放大镜,或初始触摸可能是滑动的开始。 在touchstart上没有真正的默认操作。 大多数为您提供tab事件的脚本,只需为touchstart事件添加一个侦听器,该事件将touchend侦听器绑定到Xms的触摸元素,并将其映射到click

防止默认允许不会停止事件,它的默认操作(如果有的话)不会通过,但事件通过dom传播所有相同,touchend监听器被设置,那个处理程序将是踢的一切都关闭。 如果您不是要阻止默认操作,而只是阻止事件沿着DOM向下传播到目标,我的猜测是touchout处理程序永远不会被绑定,或者至少永远不会被触发。 简单地说:就元素而言, touchstart事件从未到达它,因此如果没有触摸启动触发touchend就不会发生,这必然意味着触摸在DOM的其他地方开始。

我认为,这解释了为什么你会出现这种略微出乎意料的行为。 现在你的问题:

如果没有jQuery mobile,则会调用click处理程序。 我知道我刚才说触摸设备上没有真正的点击事件,但链接会触发直接绑定到元素的点击处理程序。 但是,click事件无法真正在移动设备上委托,只有直接绑定似乎可以解决问题。 也许你可能能够在冒泡阶段抓住它们,但对于锚点来说,这确实会限制你的选择太多。 在你的代码片段中,你将一个单击处理程序直接绑定到你的元素,这样就可以解释为什么它适用于常规jQ,而不是jQm。

正常行为? 是的,我确实相信。 根据我的经验,它是。 是否可以调用这两种方法来停止事件? 当然,只要你知道两者之间的区别是什么,并且你知道你何时以及为什么只打电话给你。但是如果你想杀死这个事件,我认为两者都没有坏处。

注意:已经给出的两个答案都说return false; 与调用stopPropagationpreventDefault 。 虽然在jQuery中也是如此,但当您发现自己编写纯JS时并非如此。 在纯JavaScript中,从处理程序返回false与仅调用preventDefault相同,所以要小心。
一旦MS’JScript实现就是一个很好的例子:

 //w3c: e.preventDefault(); e.stopPropagation(); //IE: e.returnValue = false; e.cancelBubble = true; 

处理程序返回false ===事件对象的返回值为false ,但它的冒泡能力保持不变。