2012-01-18 7 views
5

Estoy creando una aplicación web y realizaré mis propias pruebas de todos modos para confirmar, pero quería saber si alguien tenía experiencia con esto al vincular/desvincular, etc. Por ejemplo, quiero destruir primero los eventos del contenedor de contenido actual y los eventos infantiles , luego cargue y adjunte nuevos eventos basados ​​en un script remoto al cargar el nuevo contenido en el DIV. Puedo atravesar, pero pensé que si ya fuera sería bueno saberlo. Este enfoque, hipotéticamente, se escalaría en términos de mantener la complejidad baja mientras mantenga el alcance del evento al contenido DIV.¿jQuery off/unbind, etc. desconecta recursivamente todos los eventos al selector actual AND children?

Por solicitud estoy explicando el propósito de lo que estoy haciendo.

Estoy buscando crear una aplicación web AJAX que se pueda mantener. Imagine que puede agregarle cientos de páginas/scripts y que el llamado no necesita saber nada más que su URL mientras solicita nuevas cosas. Esto es lo que estoy buscando. Lo he hecho utilizando superposiciones iframe y funciona bien, pero mi principal preocupación para hacer AJAX puro es el código que queda en la memoria después de que no es necesario, como eventos y referencias de cierre, etc. La superposición iframe tiene sus ventajas en ese sentido, ya que no mucho pensamiento involucrado allí pero es más lento cargar una nueva URL cada vez y ese enfoque no se integra bien si desea que partes de la página se actualicen sobre otras.

Así que el proceso de pensamiento es crear una metodología para tener un DIV padre que se inyecte con nuevo HTML a través del método de carga jQuery. El método de carga tiene el gran efecto secundario de ejecutar el script también. Entonces, si uso ese enfoque, necesito crear un sistema para hacer esto que no hinche el navegador y deje un comportamiento extraño de los eventos, etc. Esta podría ser otra pregunta.

ACTUALIZACIÓN

he respondido a mi pregunta después de ver esta ventana emergente de un representante a voto. Esto realmente no es un problema si adjuntas eventos en el nivel principal usando el enfoque de burbujeo de eventos. Ver mi respuesta a continuación.

Respuesta

2

La respuesta rápida es no, no es así.

.off() es como .unbind() en que elimina TODOS los manejadores de eventos de un tipo elegido de cualquier objeto envuelto en jquery que haya seleccionado. Si desea eliminar los controladores de más elementos, seleccione más elementos.

edit for comment: Supongo que como mencionas la recursividad, querías decir 'descendientes' y no 'hijos'. En ese caso (como sugiere su comentario) "*" ES exactamente lo que está buscando. jsFiddle

$('selector, selector *') 

Si eso parece "costosa", lo que debería. Considerar un plan como este es casi una evidencia cierta de que es hora de reconsiderar el problema.

+0

+1 PERO lo revisaré como responde si puede investigar un poco más para encontrar el remedio más rápido además del desprendimiento recursivo. Supongo que "*" funcionaría, pero no quiero un recorrido costoso si no es necesario. Gracias. –

+0

Sí, usaría ese selector también. Entonces, lo que estoy viendo es que no hay una respuesta rápida a esto, como pensé. Gracias por la respuesta. –

+0

@ kitgui.com bien, puede haber una respuesta rápida, pero la división ocurre más atrás que esto. Si comparte con nosotros las características específicas del problema, podríamos ofrecerle una solución diferente. – Sinetheta

4

Estoy siguiendo porque ha pasado un tiempo y tengo una solución muy simple para ese problema.

Si siempre adjuntar eventos en el nodo padre utilizando el evento enfoque burbujeo de este modo:

$('parentSelector') 
    .on('click', 'someDescendant', function(ev) { 
    // code 
    }) 
    .on('focus', 'anotherDescendant', function(ev) { 
    // code 
    }); 

A continuación, la eliminación de estos eventos es muy sencillo:

$('parentSelector').off(); 

Así que cada vez que coloque sus widgets , siempre puede hacerlo de forma segura:

$('parentSelector') 
    .off() 
    .on('click.my-widget', 'someDescendant', function(ev) { 
    // code 
    }).on('focus', 'anotherDescendant', function(ev) { 
    // code 
    }); 

La recursión/selector el problema es inexistente si usas ese enfoque.

+1

Lo tiene. Sin embargo, recomendaría que cualquier enlace que se aplique solo a un widget en particular no se haga más alto que ese widget. Por ejemplo: los enlaces que se relacionan con * todos * widgets (tal vez clic para ocultar) aparecerían en el contenedor de todos los widgets, pero el enlace relacionado con un widget específico (tal vez los controles lightbox) estaría en el widget mismo. – Sinetheta

Cuestiones relacionadas