2011-01-24 16 views

Respuesta

5

Si usted quiere hacer algo de jQuery en él, también se puede hacer algo como livequery (extra plugin):

$('column-header').livequery(function() 
{ 
    // do things here with your column-header, like binding new events and stuff. 
    // this function is called when an object is added. 
    // check the API for the deletion function and so on. 
}); 

ACTUALIZACIÓN: Parece que el enlace estaba roto. Trate this link

+0

Gracias, funcionó para mí. –

+0

livequery no existe – w35l3y

+1

@ w35l3y Creo que este es el enlace ahora: http://plugins.jquery.com/livequery/ – Marnix

-4

probar este ...

if($('.column-header')){ 
//do something... 
} 

o también puede hacer algo como this..it será más genérico

jQuery.exists = function(selector) { return ($(selector).length > 0); } 

if ($(selector).exists()) { 
    // Do something 
} 
+0

sigue siendo la pregunta, cuándo disparar esa declaración? – jAndy

+0

sí, esa es la cuestión. No quería dispararlo una y otra vez. –

1

Debe retirar la jQuery Mutation Events. Creo que es lo que estás buscando.

+0

Siga los enlaces a http://www.adaptavist.com/display/jQuery/Mutation+Events que lo explica un poco más – MattSmith

+0

Gracias, echando un vistazo –

21
$(document).bind('DOMNodeInserted', function(e) { 
    console.log(e.target, ' was inserted'); 
}); 

DOMNodeInserted es un evento de nivel 3 DOM. Eso a su vez significa que necesita un navegador bastante nuevo para admitir ese tipo de evento.

Referencia: MDC

+0

Hmmm ... Esto se ve interesante. –

+2

Esta es la mejor opción para el desarrollo futuro, IMO. Sin embargo, cabe señalar que esto no es compatible con IE8 y versiones anteriores. He agregado una respuesta a continuación si alguien quiere hacer una manera rápida y sucia para hacer que algo como esto funcione en IE8 y en versiones anteriores y no quiere usar livequery por alguna razón. –

+2

A partir de 2016 [eventos de mutación] (https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events) están en desuso. Se recomienda no utilizar este tipo de técnica en proyectos antiguos o nuevos. Pitty. –

0

si desea establecer mismas funciones para todos los elementos con class column-header entonces puede usar jQuery en vivo()

$(".column-header").live("click",function(){}); 
+0

sí, pero el problema es que se activará solo al hacer clic y no al renderizarse. –

0

¿Cómo sobre el uso de una encuesta - mantener la búsqueda de un elemento con clase " column-header ", hasta que lo encuentre y luego realice una acción. Parece simple.

+0

Sí, eso funcionaría, pero habría un retraso en la experiencia de UI. Esperando evitar eso. –

+0

creo que depende de cuán profunda y cuán amplia sea su estructura dom en la página. No creo que el uso de algunos plugins de jquery logre un rendimiento mucho más rápido; debería probarse en cierto ejemplo. – bogatyrjov

+0

Sí, he intentado livequery. Hubo un retraso. –

3

Usaría setInterval para buscar elementos repetidamente. p.ej.

var curLength=0; 
setInterval(function(){ 
    if ($('.column-header').length!=curLength){ 
    curLength=$('.column-header').length; 
    // do stuff here 
    } 
},100); 

este código va a comprobar que no existen nuevos elementos .colum de cabecera de cada 100 ms

+0

Eso funcionaría. Pero, ¿no será pesado? –

+2

Sería bastante pesado, pero sin soporte nativo para el evento NodeAdded. esto es tan bueno como se pone. Tanto la consulta en vivo como los eventos de mutación con toda seguridad utilizan algún tipo de bucle setInterval de todos modos. – Ivan

+0

No sería pesado en absoluto, establezca el intervalo en una variable y desactívela después. –

2

Creo que el método DOMNodeInserted mencionado anteriormente es probablemente la opción más atractiva, pero si usted necesita algo que se va a trabajar con IE8 e inferior, que podría hacer algo como lo siguiente:

// wrap this up in en immediately executed function so we don't 
// junk up our global scope. 
(function() { 
    // We're going to use this to store what we already know about. 
    var prevFound = null; 

    setInterval(function() { 
     // get all of the nodes you care about. 
     var newFound = $('.yourSelector'); 

     // get all of the nodes that weren't here last check 
     var diff = newFound.not(prevFound); 

     // do something with the newly added nodes 
     diff.addClass('.justGotHere'); 

     // set the tracking variable to what you've found. 
     prevFound = newFound; 
    }, 100); 
})(); 

eso es sólo la idea básica, se puede cambiar que le apetezca, hacer un método fuera de él, mantenga el valor de retorno de la función setInterval para que puede detenerlo, o lo que sea que necesites hacer. Pero debería hacer el trabajo.

7

La respuesta aceptada utiliza un plugin obsoleta a partir de 2011 y la más alta respuesta upvoted utiliza eventos de mutación que son ahora deprecated.

Hoy, un MutationObserver es lo que debe usar para detectar cuando un elemento se ha agregado al DOM. MutationObservers ahora son ampliamente compatibles en todos los navegadores modernos (Chrome 26+, Firefox 14+, IE11, Edge, Opera 15+, etc.).

Aquí hay un ejemplo simple de cómo puede usar un MutationObserver para escuchar cuando un elemento se agrega al DOM.

Para abreviar, estoy usando la sintaxis de jQuery para construir el nodo e insertarlo en el DOM.

var myElement = $("<div>hello world</div>")[0]; 

var observer = new MutationObserver(function(mutations) { 
    if (document.contains(myElement)) { 
     console.log("It's in the DOM!"); 
     observer.disconnect(); 
    } 
}); 

observer.observe(document, {attributes: false, childList: true, characterData: false, subtree:true}); 

$("body").append(myElement); // console.log: It's in the DOM! 

El controlador de eventos observer se disparará cada vez que se añade o se elimina de la document cualquier nodo. Dentro del controlador, realizamos una comprobación contains para determinar si myElement se encuentra ahora en el document.

No necesita iterar sobre cada registro de mutación almacenado en mutations porque puede realizar la comprobación document.contains directamente al myElement.

Para mejorar el rendimiento, reemplace document con el elemento específico que contendrá myElement en el DOM.

Cuestiones relacionadas