2012-01-06 28 views
6

Tengo el siguiente oyente establecido de "pagebeforechange" (muy similar al código propio de la documentación de jQuery Mobile) y un enlace en la página principal que está llamando http://localhost/#product?id=255979jQuery Mobile "pagebeforechange" ser llamado dos veces

//Bind Listener for Product Details 
$(document).bind("pagebeforechange", function(e, data) { 
    //Only Run If Site is Initialized 
    if(ajaxSite.options.initialized) { 
     if (typeof data.toPage === "string") { 
      var u = $.mobile.path.parseUrl(data.toPage), 
       pl = /^#product/; 

      if (u.hash.search(pl) !== -1) { 
       console.log("showProduct being called."); 
       ajaxSite.showProduct(u, data.options); 
       e.preventDefault(); 
      } 
     } 
    } 
}); 

Cuando abro la consola JavaScript y haga clic en el enlace que estoy viendo lo siguiente:

showProduct being called. 
showProduct being called. 

me parece que no puede encontrar nada acerca de por qué sería conseguir llama dos veces. He visto otros errores donde vclicks se registran dos veces debido a un clic de borde, pero esto no tiene ningún sentido ya que se basa en el cambio de página real.

+0

¿Está ejecutando un diseño de varias páginas o una sola página? http://jquerymobile.com/demos/1.0/docs/pages/index.html El motivo por el que pregunto es que está vinculando a $ (documento) en lugar de a la página Id. –

+0

Diseño de página múltiple: el método "showProduct()" carga información en la segunda página y luego transiciones. – Jack

+0

Me pregunto porque estás vinculando el $ (documento) en el que se está llamando varias veces, ¿podrías usar el pageId y probarlo? –

Respuesta

6

Ya que estás unión a la $ (document) y el uso de un diseño de múltiples páginas

Creo JQM está cargando el documento varias veces (sólo una corazonada)

cambiar al uso de la pageId lugar, ejemplo:

$(document).bind("pagebeforechange", function(e, data) { ... 

a

$('#pageId').bind("pagebeforechange", function(e, data) { ... 
+3

Para mí, el evento no se desencadena al insertar el pageId usando v1.0 ... (también ver http://stackoverflow.com/questions/8793403/jquery-mobile-cant-bind-pagebeforechange-to-page- id) – Lincoln

+0

vinculando a pageId no activa el evento –

+0

@JihoKang si publica una pregunta con parte del código que está utilizando, probablemente sería más fácil ayudarle de esta manera –

4

Tal vez un poco tarde, pero aquí está mi conjetura:

Cualquier evento pagechange desencadena dos transiciones, una "hacia adelante" (pagechange) y un "retroceso" (hashchange). Si avanza, el hashChange está bloqueado, si retrocede, es al revés.

Mire en el código fuente jqm y marque la propiedad ignoreNextHashChange.

Esto es responsable de bloquear el hashChange en las transiciones hacia adelante, de lo contrario, usted estaría yendo y viniendo.

Supongo que su función se activa dos veces, porque ambos eventos se desencadenan desde dentro de changePage y hashChange.

Si ese fuera el caso, JQM tendría que bloquear el hashChange rountine antes de activar este evento.

+0

Te estoy dando un punto, ya que este es un consejo útil, pero en realidad resolví el problema hace bastante tiempo :-). El problema tenía que hacer que preventDefault() no se ejecutara mientras aún se llamaba manualmente a un cambio de página. Tenía un método con una llamada AJAX encima del preventDefault() y un error con el AJAX no se manejaba correctamente y el preventDefault() nunca se llamó. Error tonto, pero me estaba volviendo loco después de mirarlo durante 6 horas. Realmente solo necesitaba otro par de ojos para decirme a qué me saltaba. ¡Gracias! – Jack

3

Se llama dos veces por diseño. http://api.jquerymobile.com/pagebeforechange/

si data.toPage se establece en una cadena, el evento indica que la navegación está a punto de comenzar.

si data.toPage se establece en un objeto jQuery, el evento indica que la página de destino se ha cargado.

+0

Lea la pregunta. El código publicado muestra el filtrado en (typeof data.toPage === "string"). Se muestra que el evento pasa ese condicional dos veces. Este problema es más complejo. – janoside

+0

esta es información útil para aquellos que no saben esto, pero debido a la forma en que fue redactado, no lo voy a volver a subir a cero –

-1

Si lee la documentación móvil de jquery https://api.jquerymobile.com/pagebeforechange/, dice que se llama dos veces, una vez data.toPage siendo url a la página nueva, la segunda vez data.toPage siendo el objeto jquery de la página nueva.

Cuestiones relacionadas