2012-08-16 45 views
2

背景不取消链接方向
我一直在试图取消链接方向时,点击事件在jQuery Mobile的应用定位元素上触发这个愚蠢的小问题所困扰。event.preventDefault()在jQuery Mobile的

比方说,我有一个简单的多页文档是这样的:

<div data-role="page" id="page-1">   
    <div data-role="content"> 
     <a href="#page-2" id="mLink">page 2</a> 
    </div><!-- /content --> 
</div><!-- /page --> 

<div data-role="page" id="page-2"> 
    <div data-role="content"> 
    </div><!-- /content --> 
</div><!-- /page --> 

...和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的只为它的多页模板,导航和过渡能力。

其他问题
问题的背后潜伏着我原来的问题有种被“什么jQuery Mobile的确实给拦截event.preventDefault链接()方法来阻止链接的默认操作,即会目标网页?'

+0

在jQuery mobile中使用'document.ready' [不好](http://jquerymobile.com/test/docs/api/events.html)。改为使用'$(document).bind('pageinit',function ...)'。 – vcsjones 2012-08-16 20:22:15

+0

@vcsjones是的,我也读过,但从来不知道如何实现。在一些测试中,我用'$(document).on('pageinit',handler)'替换了'document.ready',但每当我在多页文档中更改页面时,它似乎都会激发。另外,使用'on'代替'pageinit'的'bind'会好吗? – micadelli 2012-08-16 20:35:46

回答

6

正常吗?是。可以同时打电话吗?是。
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);将事件处理程序附加到所有 链接的类别为“禁用”,以防止它们在被点击时被跟踪 ,并且还会阻止事件冒泡。

3

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

事情是,触摸事件严重重载:当用户触摸屏幕并保持X时间,他可能试图选择一些文本,获取放大镜,或者初始触摸可能是开始的一个刷卡。在touchstart上没有采取默认行动。大多数为您提供tab事件的脚本,只需添加一个侦听器,即将touchend侦听器绑定到Xms的触摸元素的touchstart事件,然后将其映射到click

防止默认允许不停止的情况下正因为如此,它的默认操作(如果有的话)不落空,但该事件通过DOM传播都一样,touchend监听器设置和处理程序将被把所有东西都踢出去的那个。如果你不想阻止默认动作,但是只是阻止事件向下传播到目标,我的猜测是touchout处理器永远不会被绑定,或者至少永远不会被解雇。简单地说:就元素而言,touchstart事件从未达到过,因此如果在没有touchstart的情况下触发touchend,则该事件从未发生,这必定意味着在DOM中的其他地方开始触摸。

我想,这就解释了为什么会出现这种稍微意外的行为。现在你的问题:

没有jQuery手机,调用点击处理程序。我知道我刚才说过触摸设备上没有真正的点击事件,但链接确实会触发直接绑定到这些元素的点击处理程序。但是,点击事件并不能真正在移动设备上进行委托,只有直接绑定似乎有诀窍。也许你可以在冒泡阶段捕捉到它们,但是对于锚点来说,这确实会限制你的选择太多。在你的代码片段中,你直接将一个点击处理程序绑定到你的元素上,这样就可以解释为什么它可以处理常规的jQ,而不是jQm。

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

注意:已经给出的两个答案都表示return false;与致电stopPropagationpreventDefault的数量相同。虽然在jQuery中的确如此,那就是而不是当你发现你自己编写纯JS的时候。在纯JavaScript中,从你的处理程序返回false与仅调用preventDefault相同,所以要小心。
这一次MS” JScript的实施是一个很好的例子:

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

处理程序返回false ===事件对象有false返回值,但其能力泡沫保持不变。

+0

Upvoted,因为你实际解释了为什么'preventDefault'可能不够。当我看到'preventDefault()'按预期方式运行(并且'event.defaultPrevented()'返回'true')时,我被踩踏了,但是仍然遵循链接。我附加到“tap”事件,你的解释是有道理的。谢谢! – 2015-11-06 13:33:16