2011-10-06 11 views
13

Estoy viendo el código anterior. Estoy viendo que para los elementos que se agregan con ajax, hay muchos códigos de livequery. ¿Ya no se necesita livequery con las versiones más nuevas de jquery? ¿Alguien sabe después de qué versión exactamente no es necesaria?Es livequery obsoleto

$("#somediv").livequery(function(){ 
    $(this).click(function(){ 

    }); 
}); 
+4

sí, livequery está muerto. También es un patrón anti – Raynos

+1

@Raynos ¿Qué lo reemplaza? Hasta el momento no he encontrado ejemplos que sirvan a su propósito. .on es para eventos, y el único evento jquery que se acerca es DOMNodeInserted que no tiene un amplio soporte de navegador. – AaronLS

+1

La delegación de eventos @ Aaronys resolverá su problema. Si necesita 'DOMNodeInserted', puede crear un complejo sistema de plantillas o hacerlo incorrectamente. Si el primero simplemente construye un sistema de plantillas simple en su lugar – Raynos

Respuesta

11

livequery es un concepto totalmente diferente de .live().

El método .live() usa evento delegación para controlar eventos que ocurren en cualquier parte de la página.

livequery invocarán controladores cuando se produzcan cambios DOM (a través de métodos jQuery).

Para el siguiente ejemplo, cuando se agrega un elemento con class="some_class" al DOM (o la clase se agrega a un elemento), se ejecutará el primer controlador. Cuando se elimina, el segundo.

$('.some_class').livequery(function() { 

     // apply a plugin to the element 
    $(this).somePlugin(); 

}, function() { 

    // clean up after the element was removed 

}); 

debe haber un nivel real necesidad de livequery, pero en ese raro caso en el que se necesita para responder a los cambios de DOM, y no tienen ningún control sobre el jQuery que está causando esos cambios, que pueden ser útiles.

+0

@Raynos: No quiero llamarlo feo, pero diría que casi siempre sugeriría un enfoque diferente. – user113716

+0

itera el dom cada _período_ buscando cambios. Básicamente sondea el dom, revisa cada elemento sangriento y ve si algo ha cambiado. Increíblemente computacionalmente costoso y simplemente estúpido, ni siquiera presenta detección de eventos de mutación dom – Raynos

+7

@Raynos: Acabo de echar un vistazo a la fuente e hice una prueba rápida, y tu descripción de cómo 'livequery' funciona no es correcta. De hecho, ajusta los métodos jQuery con una función que invoca el código interno antes de invocar el original.Por lo tanto, cuando se llama a un método, realiza una selección DOM basada en el selector original proporcionado y aplica las devoluciones de llamada si se encontraron nuevos elementos. Por lo tanto, no hay ningún sondeo en cada período de todos los elementos DOM. – user113716

2

Tienes que usar on() y adjuntar el evento a un padre o cuerpo. Ej:

$('#obj').livequery('click', function() { ... }); 
$('#obj').livequery(function() { ... }); 

convertirse

$('body').on('click', '#obj', function() { ... }); 
$('body').on('DOMNodeInserted','#obj', function() { ... }); 

nota que DOMNodeInserted es IE9 +