Estoy tratando de descubrir cómo ejecutar un código js cuando un elemento se elimina de la página:
jQuery('#some-element').remove(); // remove some element from the page
/* need to figure out how to independently detect the above happened */
¿Hay un evento diseñado para eso, algo como:
jQuery('#some-element').onremoval( function() {
// do post-mortem stuff here
});
Gracias.
Respuestas:
Recién marcado, ya está incorporado en la versión actual de JQuery:
jQuery - v1.9.1
jQuery UI - v1.10.2
Importante : Esta es la funcionalidad del script Jquery UI (no JQuery), por lo que debe cargar ambos scripts (jquery y jquery-ui) para que funcione. Aquí hay un ejemplo: http://jsfiddle.net/72RTz/
fuente
remove
en el elemento, se dispara, pero si el elemento se destruye de otra manera, al sobrescribirlo, no funciona.Puedes usar eventos especiales de jQuery para esto.
Con toda simplicidad,
Preparar:
Uso:
Anexo para responder a los comentarios de Pierre y DesignerGuy:
Para que no se active la devolución de llamada al llamar
$('.thing').off('destroyed')
, cambie la condición if a:if (o.handler && o.type !== 'destroyed') { ... }
fuente
o.handler()
para que, de loo.handler.apply(this,arguments)
contrario, el evento y los objetos de datos no pasen a través del detector de eventos.$('.thing').unbind('destroyed')
que realmente podría ser molesto (ya que desvincular significa que no queremos que se llame al controlador ...)Puede vincularse al evento DOMNodeRemoved (parte de la especificación DOM Level 3 WC3).
Funciona en IE9, últimas versiones de Firefox y Chrome.
Ejemplo:
También puede recibir una notificación cuando se insertan elementos mediante el enlace a
DOMNodeInserted
fuente
e.target.className
oif ($(e.target).hasClass('my-class')) { ...
.No hay un evento incorporado para eliminar elementos, pero puede crear uno mediante la falsificación del método de eliminación predeterminado de jQuery. Tenga en cuenta que se debe llamar a la devolución de llamada antes de eliminarla realmente para mantener la referencia.
Nota: algunos problemas con esta respuesta han sido descritos por otros carteles.
html()
replace()
u otros métodos jQueryLa solución más elegante para este problema parece ser: https://stackoverflow.com/a/10172676/216941
fuente
$('#some-element').bind('remove', function(ev) { if (ev.target === this) { console.log('removed!'); } });
De enganche
.remove()
no es la mejor manera de manejar esto, ya que hay muchas maneras de eliminar elementos de la página (por ejemplo, mediante el uso.html()
,.replace()
etc).Para evitar varios riesgos de pérdida de memoria, internamente jQuery intentará llamar a la función
jQuery.cleanData()
para cada elemento eliminado, independientemente del método utilizado para eliminarlo.Vea esta respuesta para más detalles: fugas de memoria javascript
Por lo tanto, para obtener mejores resultados, debe conectar la
cleanData
función, que es exactamente lo que hace el complemento jquery.event.destroyed :http://v3.javascriptmvc.com/jquery/dist/jquery.event.destroyed.js
fuente
cleanData
fue muy útil para mí! Muchas gracias, Joe :)Para aquellos que usan jQuery UI:
jQuery UI ha anulado algunos de los métodos de jQuery para implementar un
remove
evento que consigue manejado no sólo cuando se quita explícitamente el elemento dado, pero también si el elemento consigue quitado del DOM mediante cualquier método jQuery auto-limpieza (por ejemploreplace
,html
, etc.) . Básicamente, esto le permite poner un gancho en los mismos eventos que se activan cuando jQuery está "limpiando" los eventos y datos asociados con un elemento DOM.John Resig ha indicado que está abierto a la idea de implementar este evento en una versión futura de jQuery core, pero no estoy seguro de dónde se encuentra actualmente.
fuente
Solo se requiere jQuery (no se necesita jQuery UI)
( He extraído esta extensión del marco de la interfaz de usuario jQuery )
Funciona con:
empty()
yhtml()
yremove()
Con esta solución también puede desvincular el controlador de eventos.
¡Intentalo! - Ejemplo
Demo adicional - jsBin
fuente
No pude obtener esta respuesta para trabajar con la desvinculación (a pesar de la actualización, ver aquí ), pero pude encontrar una forma de evitarlo. La respuesta fue crear un evento especial 'destroy_proxy' que activó un evento 'destruido'. Pones el detector de eventos tanto en 'destruido_proxy' como en 'destruido', luego, cuando quieres desvincular, simplemente desvincula el evento 'destruido':
Aquí hay un violín
fuente
Me gusta la respuesta de mtkopone usando eventos especiales jQuery, pero tenga en cuenta que no funciona a) cuando los elementos se separan en lugar de eliminarse ob) cuando algunas bibliotecas antiguas que no son jquery usan innerHTML para destruir sus elementos
fuente
detach
se usa especialmente para no desencadenar la limpieza, ya que el elemento probablemente esté planeado para volverse a unir más tarde. b) sigue siendo cierto y aún no tiene un manejo confiable, al menos desde que los eventos de mutación DOM se implementen ampliamente.No estoy seguro de que haya un identificador de evento para esto, por lo que tendría que mantener una copia del DOM y compararlo con el DOM existente en algún tipo de bucle de sondeo, lo que podría ser bastante desagradable. Sin embargo, Firebug hace esto: si inspecciona el HTML y ejecuta algunos cambios DOM, resalta los cambios en amarillo en la consola Firebug por un corto tiempo.
Alternativamente, podría crear una función de eliminación ...
fuente
Así es como se crea un oyente jQuery live remove :
O:
fuente
El evento "eliminar" de jQuery funciona bien, sin adición. Puede ser más confiable a tiempo usar un truco simple, en lugar de parchear jQuery.
Simplemente modifique o agregue un atributo en el elemento que está a punto de eliminar del DOM. Por lo tanto, puede activar cualquier función de actualización, que simplemente ignorará los elementos en camino a ser destruidos, con el atributo "do_not_count_it".
Supongamos que tenemos una tabla con celdas correspondientes a los precios, y que necesita mostrar solo el último precio: este es el selector que se activará cuando se elimine una celda de precio (tenemos un botón en cada línea de la tabla que hace eso, no se muestra aquí)
Y aquí hay una función que encuentra el último precio en la tabla, sin tener en cuenta el último, si fue el que se eliminó. De hecho, cuando se activa el evento "eliminar", y cuando se llama a esta función, el elemento aún no se elimina.
Al final, la función update_prices () funciona bien, y después de eso, se elimina el elemento DOM.
fuente
haciendo referencia a la respuesta de @David:
Cuando desee hacerlo con otra función, p. Ej. html () como en mi caso, no olvides agregar return en una nueva función:
fuente
Esta.
fuente
una extensión de la respuesta de Adam en caso de que necesite evitar el incumplimiento, aquí hay una solución alternativa:
fuente
También podemos usar DOMNodeRemoved:
fuente