2011-10-18 16 views
6

Come si eliminano le funzioni anonime impostate per l'attivazione tramite una chiamata jquery document.ready()?Cancellare un jquery document.ready() chiamare

Ad esempio:

<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> 

L'avviso si verifica indipendentemente dei miei tentativi di aggirare esso. C'è un modo per fare questo??

+0

È possibile impostare più di una funzione '' 'ready''', quindi non sono sorpreso che' '' unbind''' non lavoro. Una soluzione hacky sarebbe quella di impostare una variabile globale e avvolgere tutto all'interno della funzione '' 'ready''' in un' '' if''' per testare il valore - basta cambiare il valore e mentre '' 'ready' '' la funzione verrà comunque eseguita, il suo contenuto non sarà ... – JoLoCo

risposta

5

Probabilmente otterresti la risposta più appropriata se hai descritto quale problema stai davvero cercando di risolvere.

jQuery non dispone di un modo pubblicamente documentato per annullare o bloccare i gestori document.ready(). Se controlli il codice, è possibile utilizzare una variabile globale e un condizionale come questo:

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

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

Oppure, se si vuole incidere in jQuery un po '(al di là delle interfacce documentate), si può fare questo:

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

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

Potete vedere quest'ultimo lavoro qui: http://jsfiddle.net/jfriend00/ZjH2k/. Questo funziona perché jQuery utilizza la proprietà: $.isReady per tenere traccia di se ha già attivato i gestori pronti o meno. Impostarlo su true fa pensare che li abbia già generati in modo che non tutti lo facciano di nuovo.

+0

Non controllo il codice. Sto creando uno snippet javascript che può essere incluso nel sito web di un cliente che sostituirà parte del loro contenuto. Sfortunatamente hanno dei callback che si aspettano che alcuni dei contenuti sostituiti siano lì, quindi un errore. Ho pensato che se avessi potuto ignorare in qualche modo le chiamate del tuo doc, allora questo avrebbe risolto il problema. –

+0

Wow - stai provando a bloccare tutto il codice di inizializzazione jQuery.ready. Spero che tu sappia cosa stai facendo perché molte cose possono rompersi se lo fai. Che dire del codice init legittimo che deve essere eseguito? Ad ogni modo, ho aggiunto un'altra opzione che può essere eseguita senza modificare il codice all'interno del gestore pronto. Mi sembra che dovresti lasciare che il normale codice pronto e il contenuto regolare della pagina vengano eseguiti e POI, dopo che è stato eseguito, sostituisci i contenuti nella pagina. – jfriend00

+0

Sì, capisco come questo sembri spaventoso, ma abbiamo il permesso di farlo. Sono aperto all'hacking in jquery un po ', ma abbiamo un altro codice che deve essere eseguito su doc.ready. Il secondo esempio sembra fare esattamente ciò di cui ho bisogno ... anche se sembra contro-intuitivo - l'impostazione è vera per il vero mi farebbe pensare che stiamo attivando doc.ready ... –

0

$ (document) .ready() dipende dall'evento onLoad attivato dal browser che significa che non è possibile impedirlo. Se l'alert() è determinato da qualche condizione, allora userei una dichiarazione if/else per decidere se è stata chiamata.

+1

Questo non è il caso. $ (document) .ready() è generato da jQuery e ci sono modi per impedirlo. – jfriend00

1

Questo funziona:

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

Sembra come un insetto per me - tutti gli altri eventi in jQuery sono in grado di essere legato. Omettere questo è incoerente.

Non è una risposta diretta alla omissione, ma ecco alcune informazioni correlate da jQuery docs:

Tutti e tre i seguenti sintassi sono equivalenti:

  • $(document).ready(handler)
  • $().ready(handler) (questo è non consigliato)
  • $(handler)

C'è anche $(document).bind("ready", handler). Ciò si comporta in modo simile al metodo ready ma con un'eccezione: se l'evento ready è già stato attivato e si prova a .bind("ready") il gestore associato non verrà eseguito. I gestori pronti in questo modo vengono eseguiti dopo qualsiasi vincolo dagli altri tre metodi precedenti.

+0

Bello! Quindi mi chiedo quale sia la differenza tra chiamare $ (document) .ready (...) vs. $ (document) .bind ("ready", ...). Peccato che la documentazione di unbind dice che riguarda solo quei callback che sono stati impostati tramite una chiamata bind(). –

+0

@ShaneN - La differenza è che i gestori '.bind (" ready ", handler)' non saranno chiamati se l'evento 'ready' è già stato attivato. Sono anche chiamati per ultimi, dopo che tutti gli handler sono stati vincolati nel modo più comune. – gilly3

+0

Come meglio posso dire guardando il sorgente, i '' (document) .bind ("ready") 'gestori verranno chiamati dopo gli altri gestori pronti e sono gli unici che possono essere rimossi con' $ (documento) .unbind() '. Non è possibile rimuovere un gestore '$ (document) .ready()' con unbind dato che sono memorizzati in modo diverso. – jfriend00

0

Super vecchia domanda, ma si è imbattuto nella necessità di farlo di recente per impedire il codice document.ready che non ho controllato dall'esecuzione in determinate istanze. Questo può essere ottenuto mediante il proxy della funzione ready di jQuery, piuttosto come una spia di prova.Quanto segue funziona:

var ready = $.prototype.ready; 

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

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

Tutte le chiamate alla $(document).ready saranno ora ignorati. Puoi sovrascrivere questo comportamento passando true come secondo argomento: $(document).ready(fn, true)

Problemi correlati