2012-03-19 16 views
7

Tengo jQuery Mobile en iPad Safari y, por alguna razón, los eventos de deslizamiento táctil se disparan dos veces.Detener jQuery Evento de deslizamiento móvil doble burbujeo

Las personas han informado del mismo problema en el último año tan recientemente como esta semana, pero no puedo encontrar una explicación sobre cómo arreglar el evento doble sin modificar jQuery Mobile y no quiero hacer eso. Thread on jQuery forums

Los enlaces de elemento follwoing para el controlador de deslizamiento tienen todos el mismo resultado incorrecto de doble evento donde la alerta se llama dos veces por cada golpe.

¿Cómo deben vincularse los eventos jQuery Mobile touch para evitar el doble burbujeo?

// 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!'); 
}); 

Respuesta

11

event.stopImmediatePropagation() era el truco, que es diferente de stopPropagation(). Asegurar que el método jQuery on() se llame en document.ready parece ayudar. Yo era capaz de utilizar cualquier selector de elementos para unir los eventos, incluyendo el uso de la swipeup y deslizar hacia abajo desde 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

coloqué bajo '$ (document) .bind ('pageinit')' y no funciona. Tuve que poner 'event.stopImmediatePropagation();' en cada manejador de eventos de deslizamiento para que funcione –

+2

Eso tiene sentido. Los eventos de deslizamiento se disparan dos veces y deben detenerse con 'stopImmediatePropagation()' igual que la respuesta anterior. El evento 'pageinit' no está haciendo doble burbujeo por lo que no requiere parada manual. 'pageinit' solo debe disparar una vez por página pero se dispara nuevamente para cada página añadida dinámicamente. –

+1

Esto parece haber funcionado mejor que otras soluciones, aunque todavía estoy obteniendo un comportamiento desquiciado en swiperight ... mi Android 4.x se vuelve un poco loco con varias páginas (al azar?) Antes de que aterrice en la correcta. – cbmtrx

0

que realmente ayudó en mi caso también. Estaba intentando pasar páginas con los eventos de jquery móvil y deslizar (izquierda y derecha) que se activan varias veces. event.stopImmediatePropagation() funcionó como un amuleto. Gracias !!

aquí está mi código.

<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

De nada, me alegro de que haya ayudado –

3

Bueno, tenía el mismo problema con el evento golpe dado en llamar dos veces. La solución consiste en unir el evento de este modo:

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

Gracias por compartir. Me pregunto si al fallar al pasar el contenedor como un parámetro se llama 'on' una vez en cualquier contenedor que se pasa y luego inmediatamente en el documento. –

+0

zumbido puede ser el problema ... no sé exactamente lo que sucede. Pero hay un problema al colocar el deslizamiento en los niveles debajo de Documento. –

+1

Este me ayudó. De hecho, solo probé con encuadernación para documentar con deslizamiento y no también swiperight, y esto llevó a que ambos eventos se dispararan dos veces. En el momento en que también lo cambié por swiperight, ambos eventos se dispararon una vez, como se esperaba. (Y no hubo necesidad de evento.stopImmediatePropagation()). –

Cuestiones relacionadas