2012-05-09 12 views
11

Me parece que no puede envolver mi cabeza en torno a las diferencias entre lo siguiente en jQuery Mobile:jQuery Mobile delegado vs vs vivo se unen

$(document).live('pageshow', function(event) { 
}); 

$(document).bind('pageshow', function(event) { 
}); 

$(document).delegate("#page", "pageshow", function() { 
}); 

¿Cómo ejecutar secuencias de comandos en la cabeza de mis documentos que son diferentes en ciertas páginas? ¿Qué métodos utilizo para llamar esos scripts?

Actualización: jQuery versión: 1.7.1 versión jQuery Mobile: 1.1.0

Respuesta

15

se podría unirse a un "evento de página" que jQuery Mobile expone, como pageinit:

$(document).delegate('#my-page', 'pageinit', function() { 
    //this is like document.ready for this pseudo-page 
}); 

Dado que está utilizando jQuery Core 1.7.1 se puede utilizar .on() que tiene una sintaxis ligeramente diferente:

$(document).on('pageinit', '#my-page', function() { 
    //this is like document.ready for this pseudo-page 
}); 

Los tres de sus métodos de hacer cosas similares. .live() es lo mismo que usar .delegate() con document como la selección de raíz, pero se ha depreciado, por lo que es una buena idea dejar de usarlo (fuente: http://api.jquery.com/on). Usar .bind() directamente en el elemento document es lo mismo que usar .delegate(), pero cuando usa .bind() debe determinar qué pseudopágina hizo que se dispare el evento en el controlador de eventos en lugar de en la llamada a la función.

Por ejemplo:

$(document).bind('pageshow', function() { 
    var id = $.mobile.activePage[0].id; 
    //you can use $.mobile.activePage to do work on the current page 
}); 

En general, delegación de eventos se utiliza cuando no se sabe cuando un elemento existirá en el DOM. Se basa en eventos que burbujean el DOM hasta que llegan a la selección de raíz (en su caso, siempre es el elemento document).

Docs para .delegate(): http://api.jquery.com/delegate

Para más información general acerca de la diferencia entre estas funciones, consulte este artículo (he leído para comprobar su exactitud y está justo-a): http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html

+0

Gracias por los recursos. Esto es genial. Tengo otra pregunta algo relacionada. Digamos que mi página de inicio tiene una presentación de diapositivas.¿Debo llamar el código de presentación de diapositivas dentro de la función 'pageinit' o 'pageshow'? – cusejuice

+1

'pageshow' se activará cada vez que el usuario vea la página. Por ejemplo, se disparará cuando vea la página de inicio por primera vez, pero también se activará cuando navegue y vuelva a la página de inicio. Configuraría la presentación de diapositivas en el controlador de eventos 'pageinit' pero luego lo detendré en el controlador de eventos' pagehide' y lo iniciaré en el controlador de eventos 'pageshow'. Esto funcionará para la carga inicial porque el evento 'pageshow' se dispara después del evento' pageinit'. – Jasper

+0

Si configuro la presentación de diapositivas (es decir, ejecuto una función para iniciar la presentación de diapositivas) en TANTO el controlador de eventos 'pageinit' como' pageshow', ¿no invocaría la función dos veces? – cusejuice

0

Ésta es una excelente descripción: http://jquerybyexample.blogspot.com/2010/08/bind-vs-live-vs-delegate-function.html

Pero la respuesta corta es que si estás usando jQuery 1.7, probablemente debería empezar a utilizar la nueva API de() en lugar de cualquiera de los siguientes: http://api.jquery.com/on/

+0

Ese artículo es realmente confuso. Por ejemplo, '.live()' no se vincula a los elementos a los que se dirige (nunca), se une al elemento 'document' (siempre) y comprueba los eventos de burbujeo para el elemento de destino para ver si coincide con la selección pasaste a '.live()'. Además, '.live()' se puede utilizar en el encadenamiento, pero el autor usa un ejemplo estúpido para mostrar lo contrario. No utilice este artículo como base de su información sobre estas funciones. – Jasper

+1

Pruebe este artículo, es mucho mejor: http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html – Jasper

0

El otro día tuve la misma pregunta y descubrí que este artículo proporcionaba un desglose claro de cada uno.

http://jquerybyexample.blogspot.com/2010/08/bind-vs-live-vs-delegate-function.html

+0

Este artículo está lleno de declaraciones inválidas, vea mi comentario sobre la respuesta de Julie Sheffield. – Jasper

+0

Pruebe este artículo, es realmente uno bueno: http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html – Jasper