2012-03-29 1 views
4

Ich habe dieses Problem. Ich habe ein Skript, das prüft, ob eine Variable existiert, weil einige Skripte asynchron laden, wie FB für Facebook oder twttr für Twitter.JavaScript: Wie überprüft man, ob eine Variable nach dem Variablennamen existiert?

function whenAvailable(name, callback, interval) { 
    interval || (interval = 100); // ms 
    window.setTimeout(function() { 
     if ((window.hasOwnProperty && window.hasOwnProperty(name)) || window[name] || !!eval(name)) { 
      return callback(); 
     } else { 
      window.setTimeout(arguments.callee, interval); 
     } 
    }, interval); 
} 

Sieht aus wie diese

if ((window.hasOwnProperty && window.hasOwnProperty(name)) || window[name] || !!eval(name)) 

funktioniert nicht. IE löst Fehler für Eval (Name) - z. Wenn name = 'FB', heißt es, dass 'FB' nicht definiert werden kann, was undefiniert ist.

window.hasOwnProperty(name) funktioniert nicht, wenn name == 'twttr.widgets'.

Gibt es eine universelle und Cross-Browser-Prüfung auf Existenz von var by var name?

+0

kurze Frage, existieren diese Variablen immer in den Skripten geladen? – Joseph

+1

Es darf keine Variable namens "twttr.widgets" geben. Es kann eine Variable mit dem Namen 'twttr' geben, die eine Eigenschaft' Widgets' hat, aber hoffentlich sieht man, dass es nicht so einfach ist wie "existiert diese Eigenschaft". – Gareth

+0

Joseph - nein, sie könnten niemals existieren. Gareth - technisch haben Sie Recht, aber was ich wollte, muss auch mit Eigenschaften arbeiten. –

Antwort

6

Zunächst einmal, die Sie nicht brauchen, dass eval (Sie fast nie tun), können Sie Index in ein JavaScript-Objekt eine Zeichenfolge verwendet und eingeklammert Notation, zB:

window['FB']; 

oder

name = 'FB'; 
foo = window[name]; 

So zu überprüfen:

if (typeof window[name] === "undefined") 

... außer, dass doesn‘ • Unterscheiden Sie zwischen der Eigenschaft, die überhaupt nicht vorhanden ist oder existiert, aber mit dem Wert undefined.

oder

if (name in window) 

... aber das überprüft den Prototyp sowie das Objekt. Es ist in Ordnung für window, obwohl.

window.hasOwnProperty(name) funktioniert nicht, wenn name == 'twttr.widgets'.

Rechts, müssen Sie es brechen:

var index = 0, 
    parts = name.split('.'), // doesn't handle [] notation 
    result; 
result = window; 
index = 0; 
try { 
    while (typeof result !== "undefined" && result !== null && index < parts.length) { 
     result = result[parts[index++]]; 
    } 
} 
catch (e) { 
} 
if (index < parts.length) { 
    // Didn't find all of it 
} 

... oder etwas in diesem Sinne.

+0

Danke T.J. Ich ändere nur wenn (index

+0

@SODA: Gutes Geschäft. FWIW, wenn 'typeof result ==" undefined "' die Chancen sind sehr hoch (obwohl nicht 100% gegeben, wenn Sie mit Cross-Window Zeug beschäftigen), dass 'Ergebnis === undefined', können Sie wahrscheinlich das zweite Bit fallen lassen und behalten Sie einfach den Typ der Überprüfung. Beachten Sie auch, dass ich aus irgendeinem Grund 'result! == null 'eingefügt habe (typeof' null' ist nicht '" undefined "', aber wenn Sie versuchen, 'null' mit Klammern zu dereferenzieren, erhalten Sie eine Ausnahme). –

0

Was Sie suchen ist:

if ('key' in object)

so in Ihrem Beispiel

if (name in window)

+0

Funktioniert nicht für verkettete Namen wie twttr.widgets –

2

Ich habe immer nur benutzt, um Dinge wie:

if (window[name]) { 
    return 'it exists'; 
} else { 
    return 'nope'; 
} 

EDIT: Das funktioniert, wenn Fenster [Name] nicht ist dort bestimmt das if undefined falsch.

+0

Nein, in meinem Fall, wenn ich var name = 'FB', window.name gibt 'FB' zurück, aber was ich brauche, ist Fenster ['FB'] oder Fenster zurückzukehren .FB –

+0

Ich habe die Parameter dann falsch verstanden. Einfache Lösung - aktualisiert. – kiswa

0

zu beheben twttr.widgets sowie twttr, so etwas wie:

var parts = name.split('.') 
    , aVar = window; 

while(parts.length){ 
    aVar = aVar[ aVar.shift() ]; 
    return setTimeout(...); 
} 

// aVar will now be your resolved variable 
return callback(); 
Verwandte Themen