2012-10-17 19 views
5

Ho una variabile objtypeof in IE <= 8 per funzioni native

obj può essere qualsiasi cosa, e voglio rilevare se obj è una funzione. Normalmente farei

typeof obj === 'function' 

Il problema è in IE < = 8 quando obj è una funzione nativa (almeno so accade con window.open e window.alert). In IE typeof obj quando object is window.open === 'object'

Esiste un modo affidabile per verificare se window.open è effettivamente una funzione o no?

vedo jQuery fallisce anche in questo

$.isFunction(window.open) => false //in IE 

questo apperantly ottenuto rimosso in jQuery 1.3 o qualcosa, non so come hanno testato prima di quello.

Aggiunto: Un modo sembra essere di chiamare

Function.prototype.apply.apply(window.open) 

Se questo non genera un errore, allora la finestra aperta è una funzione. Se si utilizza

Function.prototype.apply.apply({}) 

Quindi IE genera un errore "Funzione prevista". Ma non è certo una buona soluzione per aprire una finestra per controllare se una variabile è una funzione ..

+2

Quindi questo è solo un problema per le funzioni native in IE restituendo il tipo di oggetto, ma le funzioni definite dall'utente restituiscono il tipo di funzione? Perché non è sufficiente controllare che esista la funzione nativa i.e 'window.open! == undefined'? Perché hai bisogno delle funzioni native, che sono documentate per fare questo? Mi spiace solo cercando di capire il tuo processo di pensiero. – Scott

+0

Dai uno sguardo a @ 1.2 e il suo test per la "funzione" letterale; http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.js –

+0

^Codice pertinente da @ AlexK.'s link 'return !! fn && typeof fn! =" string "&& ! fn.nodeName && fn.constructor! = Array && /function/i.test (fn + ""); 'dove fn è il nome della funzione – Scott

risposta

0

Quando si tratta di funzioni native del browser, funzione di rilevamento dovrebbe essere sufficiente:

if (window.open) { 
    window.open(...) 
} 

Se qualcuno sovrascrive nativo funzioni, quindi non usare il loro codice. Non dovrebbero farlo, e tu stai chiedendo dei problemi.

È anche difficile rispondere a questa domanda senza alcun contesto. Stai passando in obj e invocandolo come una funzione. Se si passano più tipi di dati e si fa qualcosa di diverso in base al tipo, direi che non dovresti passare qui le funzioni. A causa delle stranezze del browser, creare esplicitamente una funzione per chiamare dinamicamente un'altra funzione e non eseguire il controllo degli errori.

+0

Onestamente non ricordo più quale fosse il motivo per cui lo chiedevo. –