2012-04-26 18 views
7

Estoy esperando el evento document.ready para hacer algo en mi página.Espere hasta que los elementos HTML obtengan una clase y luego hagan algo

Alas alguna otra secuencia de comandos, que no puedo cambiar, no ha funcionado aún una vez que se llama mi secuencia de comandos. Por lo tanto, la selección de jquery en el nombre de la clase falla ya que la clase aún no existe en el DOM.

Es por eso que quiero decirle a mi función que escuche hasta que un elemento obtenga una cierta clase, luego haga algo con él.

¿Cómo logro esto?

+0

¿Controla este otro script? ¿No puedes llamar a tu código como una devolución de llamada del otro código? – j08691

+0

u obtenga la otra secuencia de comandos para activar un evento personalizado – rgvcorley

+0

Parece un duplicado de esta pregunta: http://stackoverflow.com/questions/1950038/jquery-fire-event-if-css-class-changed –

Respuesta

3

Puede activar algún evento una vez que haya agregado la clase.

Ejemplo:

$('#ele').addClass('theClass'); 
$(document).trigger('classGiven') 


$(document).bind('classGiven',function(){ 
    //do what you need 
}); 
12

Algo como esto (pseudo código):

var timer = setInterval(function() { 
    if (element.className=='someclass') { 
     //run some other function 
     goDoMyStuff(); 
     clearInterval(timer); 
    } 
}, 200); 

o escuchar para el elemento de inclusión:

function flagInsertedElement(event) { 
    var el=event.target; 
} 
document.addEventListener('DOMNodeInserted', flagInsertedElement, false); 

jQuery versión:

$(document).on('DOMNodeInserted', function(e) { 
    if (e.target.className=='someclass') { 
     goDoMyStuff(); 
    } 
}); 

También existe la liveQuery plug-in :

$("#future_element").livequery(function(){ 
    //element created 
}); 

O si se trata de un controlador de eventos regular, eventos delegados con jQuery's on();

+0

El enfoque del temporizador funcionaba como un amuleto. – k0pernikus

+0

Obtuve tres votos atrasados ​​sobre eso, pero un setInterval simple como ese no usa muchos recursos y funciona bien, pero debería tener algún tipo de final si la clase nunca se encontró, como una función de tiempo de espera que borra el intervalo después de un par de segundos . La función de jQuery para escuchar el nodo DOM insertado es probablemente la mejor manera de hacerlo, pero a menos que se elimine el controlador que continuará, verificando todos los elementos insertados para el nombre de clase, que en mi opinión es peor que tener un setInterval. – adeneo

+0

@adeneo gran respuesta, bien hecho, gracias :) –

0

lo siento si tengo tu pregunta equivocada, pero ¿por qué no hacer algo sencillo como esto en document.ready? :

$("#myelement").addClass('myclass'); 

if($("#myelement").hasClass('myclass')) { 
    alert('do stuff here'); 
} 
+0

No agrego el elemento con esta clase. Se agrega con otro script. Y quiero capturar ese cambio y luego hacer algo de magia en él. – k0pernikus

+0

así que tal vez sería mejor agregar devolución de llamada en esa otra secuencia de comandos si es posible? – Vytautas

Cuestiones relacionadas