2012-08-16 68 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

相關問題