2012-03-19 86 views
7

我有jQuery Mobile的iPad Safari和由於某種原因觸摸滑動事件發射兩次。停止jQuery Mobile滑動事件雙冒泡

在過去的一年中,人們已經報告了與本週最近相同的問題,但我無法找到如何解決這個雙重事件而不修改jQuery Mobile的解釋,我不想這樣做。 Thread on jQuery forums

滑動處理程序的follwoing元素綁定都具有相同的不正確的雙重事件結果,其中每次滑動都會調用兩次警報。

jQuery Mobile觸摸事件應該如何綁定以避免雙冒泡?

// Test 1: Binding directly to document with delegate() 
$(document).delegate(document, 'swipeleft swiperight', function (event) { 
    alert('You just ' + event.type + 'ed!'); 
}); 


// Test 2: Binding to document with on() handler recommended as of 1.7 with and without preventDefault 
$(document).on('swipeleft',function(event, data){ 
    event.preventDefault(); 
    alert('You just ' + event.type + 'ed!'); 
}); 


// Test 3: Binding to body with on() with and without event.stopPropagation 
$('body').on('swipeleft',function(event, data){ 
    event.stopPropagation(); 
    alert('You just ' + event.type + 'ed!'); 
}); 


// Test 4: Binding to div by class 
$('.container').on('swipeleft',function(event, data){ 
    event.stopPropagation(); 
    alert('You just ' + event.type + 'ed!'); 
}); 

回答

11

event.stopImmediatePropagation()是特技,(),它是從不同stopPropagation。確保在document.ready中調用jQuery on()方法似乎有所幫助。我能夠使用任何元素選擇綁定的事件,包括使用swipeup和刷卡從here

$(document).ready(function(){  
    $(document).on('swipeleft swiperight swipedown swipeup',function(event, data){ 
     event.stopImmediatePropagation(); 
     console.log('(document).Stop prop: You just ' + event.type + 'ed!'); 
    }); 
}); 
+1

我把它放在'的$(document).bind( 'pageinit')',它不工作。我必須在每個滑動事件處理程序中放置event.stopImmediatePropagation();以使其起作用 – 2013-11-28 23:11:10

+2

這很有道理。你的滑動事件觸發兩次,需要用'stopImmediatePropagation()'來停止,就像上面的答案一樣。 'pageinit'事件不是雙冒泡的,所以它不需要手動停止。 'pageinit'應該每頁只觸發一次,但是它會爲每個動態添加的頁面再次觸發。 – 2013-11-29 21:09:30

+1

這看起來似乎比其他解決方案效果更好,但我仍然在swiperight上發生了一些棘手的行爲......我的Android 4.x在幾個(隨機?)頁面出現在一個小小的螺母上,然後它出現在正確的頁面上。 – cbmtrx 2015-12-03 17:21:31

0

倒在我的情況下,它確實也有幫助。我試圖用手機jquery和滑動事件(左側和右側)幾次觸發頁面。 event.stopImmediatePropagation()它像一個魅力工作。謝謝 !!

這是我的代碼。

<script type="text/javascript"> 
    $(document).bind('pageinit', function(event) { 
     $("div:jqmData(role='page')").live('swipeleft swiperight',function(event){ 
      if (event.type == 'swipeleft') { 
       var prev = $(this).prev("div:jqmData(role='page')"); 
       if(typeof(prev.data('url')) !='undefined') { 
        $.mobile.changePage(prev.data('url'), { transition: 'slide', reverse: false}); 
        event.stopImmediatePropagation(); 
       } 
      } 
      if (event.type == 'swiperight') { 
       var next = $(this).next("div:jqmData(role='page')"); 
       if(typeof(next.data('url')) != 'undefined') { 
        $.mobile.changePage(next.data('url'), { transition: 'slide', reverse: false}); 
        event.stopImmediatePropagation(); 
       }     
      }   
     }); 
    }); 
    </script> 

HTML -

<div data-role="page" id="page1" data-url="#page1"> 
    <div data-role="content"> 
     <div> 
     <h1> Page 1 </h1> 
     <p>I'm first in the source order so I'm shown as the page.</p>  
     <p>View internal page called</p>  
      <ul data-role="listview" data-inset="true" data-theme="c"> 
       <li>Swipe Right to view Page 2</li> 
      </ul> 
     </div> 
    </div> 
</div> 
<div data-role="page" id="page2" data-url="#page2"> 
    <div data-role="content"> 
     <div> 
     <h1> Page 2 </h1> 
     <p>I'm first in the source order so I'm shown as the page.</p>  
     <p>View internal page called</p>  
      <ul data-role="listview" data-inset="true" data-theme="c"> 
       <li>Swipe Right to view Page 3</li> 
      </ul> 
     </div> 
    </div> 
</div> 
+1

不客氣,我很高興它幫助 – 2012-07-16 17:24:12

3

好,曾與刷卡事件相同的問題被稱爲兩次。 的解決方法是將事件這樣綁定:

$(document).on('swipeleft', '#div_id', function(event){ 
    //console.log("swipleft"+event); 
    // code 
}); 
+0

感謝分享。我想知道,如果無法通過容器作爲參數,在任何被刷過的容器上調用'on'一次,然後立即再次在文檔上調用。 – 2012-11-13 14:57:15

+0

嗡嗡聲可能是問題......不知道發生了什麼。但是,在文檔下方的級別上附加滑動時會出現問題。 – 2012-11-13 19:22:03

+1

這個幫了我。實際上我只是用swipeleft來綁定文檔進行測試,而不是swiperight,這導致兩次事件觸發兩次。正如我所預料的那樣,我也爲swiperight更改了這兩個事件。 (並且沒有必要舉辦活動。stopImmediatePropagation())。 – 2013-06-28 07:19:46