2012-03-06 4 views
6

Stavo cercando di capire cosa potevo dalle funzioni di animazione di jQuery, ma ho finito per imbattersi in tutte le specie di funzioni interne che non comprendevo e alla fine sono arrivato su isWindow. Il codice per isWindow controlla se un oggetto ha la proprietà setInterval e restituisce false altrimenti.jQuery's .isWindow metodo?

Naturalmente, qualsiasi oggetto potrebbe avere la proprietà setInterval senza essere la finestra, e anche se sarebbe quasi dovuto essere un deliberato tentativo di sabotare la funzionalità di jQuery per avere un oggetto con quel nome proprietà esatta, posso immaginare alcuni casi ragionevoli dove potrebbe essere involontario.

Non c'è un modo migliore per verificare se un oggetto è un oggetto finestra? Non potevano usare qualcosa sulla falsariga di

obj.setInterval && obj.setInterval.toString() == 'function setIternval(){ [native code] } 

So che il ritorno di toString di una funzione interna non sta per essere standard in tutti i browser, ma gli scrittori di jQuery sembrano avere una grande comprensione di queste differenze tra browser. Sono anche consapevole che questo non è un metodo infallibile, in quanto qualcuno potrebbe facilmente ignorare il metodo toString per restituire la stessa stringa, ma ciò impedirebbe comunque il problema di avere un oggetto scambiato per una finestra.

non vorrei chiedere se ho pensato che isWindow è stato utilizzato solo su oggetti interni di jQuery, ma era parte di isPlainObject, che viene utilizzato in .extend, che può essere utilizzato su oggetti esterni.

+0

"Naturalmente, qualsiasi oggetto potrebbe avere il setInterval proprietà senza essere la finestra" . Come immagini? – j08691

+0

@ j08691, come fai a capire come immagino? – mowwwalker

+0

Sto dicendo che dal momento che setInterval è una funzione della finestra di base di JavaScript, come può avere un oggetto? Non ha senso per me. – j08691

risposta

3

Che dire:

function isWindow(obj) { 
    var toString = Object.prototype.toString.call(obj); 
    return toString == '[object global]' || toString == '[object Window]' || toString == '[object DOMWindow]'; 
} 

sembra funzionare in Chrome, Firefox, Opera, Internet Explorer e Safari (versioni più recenti)

+0

+1 Perché è meglio che usare toString sulla funzione setInterval, sebbene possa ancora essere facilmente ingannato sovrascrivendo il metodo 'Object.prototype.toString'. – WTK

+0

Sì, ancora meglio. Mi chiedo perché non lo usano. – mowwwalker

+0

Versione più compatta :) 'function isWindow (obj) { return ['[oggetto global]', '[oggetto Window]', '[oggetto DOMWindow]']. IndexOf (Object.prototype.toString.call (obj))> = 0} ' – WTK