2011-10-18 22 views
6

¿Cómo elimino funciones anónimas que se configuran para que se activen a través de una llamada a jquery document.ready()?Borrado de una llamada a jquery document.ready()

Por ejemplo:

<script type="text/javascript"> 
    //some code sets a doc ready callback 
    $(document).ready(function() 
    { 
     alert('ready'); 
    }); 

    //my attempt to prevent the callback from happening 
    window.onload = null; 
    $(document).unbind("ready"); 

</script> 

La alerta ocurre a pesar de mis intentos de eludir ella. ¿Hay alguna manera de hacer esto?

+0

Es posible configurar más de una función '' 'ready''', así que no me sorprende que' '' unbind''' no lo haga trabajo. Una solución hacky sería establecer una variable global, y envolver todo dentro de la función '' 'ready''' en un' '' if''' para probar el valor - simplemente cambie el valor y mientras '' 'ready' '' la función seguirá ejecutándose, su contenido no ... – JoLoCo

Respuesta

5

Probablemente obtendrás la respuesta más adecuada si describes qué problema estás tratando de resolver.

jQuery no tiene una forma documentada públicamente para deshacer o bloquear los manejadores de document.ready(). Si controlas el código, se puede utilizar una variable global y una condicional como esto:

var skipReady = false; 
$(document).ready(function() 
{ 
    if (!skipReady) { 
     alert('ready'); 
    } 
}); 

// skip the document.ready code, if it hasn't already fired 
skipReady = true; 

O, si se quiere cortar en jQuery un poco (más allá de las interfaces documentadas), usted puede hacer esto:

$(document).ready(function() { 
    alert("ready"); 
}); 

// stop the ready handler 
$.isReady = true; 

Puedes ver este último trabajo aquí: http://jsfiddle.net/jfriend00/ZjH2k/. Esto funciona porque jQuery usa la propiedad: $.isReady para realizar un seguimiento de si ya ha disparado los controladores de listo o no. Configurarlo en verdadero hace que piense que ya lo ha disparado, por lo que no todos lo volverán a hacer.

+0

No controlo el código. Estoy creando un fragmento de JavaScript que se puede incluir en el sitio web de un cliente que reemplazará parte de su contenido. Desafortunadamente tienen devoluciones de llamada que esperan que parte del contenido reemplazado esté allí, por lo tanto, un error. Pensé que si podía anular sus llamadas de doc ready de alguna manera, entonces esto resolvería el problema. –

+0

Wow: está intentando bloquear todo el código de inicialización jQuery.ready. Espero que sepas lo que estás haciendo porque muchas cosas se pueden romper si haces eso. ¿Qué pasa con el código de inicio legítimo que no necesita ejecutarse? De todos modos, agregué una opción más que se puede hacer sin modificar el código dentro del controlador listo. Me parece que debes dejar que se ejecute el código de la lista regular y el contenido de la página normal y ENTONCES, después de que se haya ejecutado, reemplazas las cosas en la página. – jfriend00

+0

Sí, entiendo cómo esto parece aterrador, pero tenemos permiso para hacerlo. Estoy abierto a hackear un poco el jquery, pero tenemos otro código que necesita ejecutarse en doc.ready. El segundo ejemplo parece hacer exactamente lo que necesito ... aunque parezca contra-intuitivo - la configuración está lista para ser verdadera me haría pensar que estamos activando doc.ready ... –

0

$ (document) .ready() depende del evento onLoad que se desencadena por el navegador, lo que significa que no puede evitar que ocurra. Si la alerta() está determinada por alguna condición, entonces usaría una instrucción if/else para decidir si se llama.

+1

Este no es el caso. $ (document) .ready() es generado por jQuery y hay formas de evitar que suceda. – jfriend00

1

Esto funciona:

$(document).bind("ready", function() { alert("hey!"); }); 
$(document).unbind("ready"); 

Parece un error para mí - todos los otros eventos en jQuery son capaces de ser unido. Omitir este es inconsistente.

No es una respuesta directa en cuanto a la omisión, pero aquí hay algo de información relacionada desde jQuery docs:

Los tres de las siguientes sintaxis son equivalentes:

  • $(document).ready(handler)
  • $().ready(handler) (esto es no recomendado)
  • $(handler)

También hay $(document).bind("ready", handler). Esto se comporta de manera similar al método listo, pero con una excepción: si el evento listo ya se ha disparado y usted intenta .bind("ready") no se ejecutará el controlador vinculado. Los manejadores listos enlazados de esta manera se ejecutan después de cualquier límite de los otros tres métodos anteriores.

+0

¡Agradable! Entonces me pregunto cuál es la diferencia entre llamar $ (documento). Listo (...) vs. $ (documento) .bind ("listo", ...). Lástima que la documentación de desvinculación dice que solo afecta las devoluciones de llamadas que se han establecido a través de una llamada bind(). –

+0

@ShaneN - La diferencia es que los manejadores '.bind (" ready ", handler)' no serán llamados si el evento 'ready' ya se ha disparado. También se les llama últimos, después de que cualquier controlador se vincule de la manera más común. – gilly3

+0

Lo mejor que puedo decir al buscar en el origen, los manejadores '$ (document) .bind (" ready ")' se llamarán después de los otros manejadores listos y son los únicos que se pueden eliminar con '$ (documento) .unbind() '. No se puede eliminar un controlador '$ (document) .ready()' con desvinculación, ya que se almacenan de manera diferente. – jfriend00

0

Súper vieja pregunta, pero me encontré con la necesidad de hacer esto recientemente para evitar que el código de document.ready no se ejecute en ciertas instancias. Esto puede lograrse al utilizar la función lista de jQuery, como un espía de prueba.El siguiente trabajo: va a ser saltado

var ready = $.prototype.ready; 

// proxy the ready function 
$.prototype.ready = function (fn, allowed) { 
    allowed = allowed || false; 

    if (allowed) { 
     ready.call(this, fn); 
    } 
}; 

Todas las llamadas a $(document).ready. Puede anular este comportamiento pasándole true como el segundo argumento: $(document).ready(fn, true)

Cuestiones relacionadas