Löschen einer Fenstereigenschaft im IE

Lesezeit: 4 Minuten

Benutzer-Avatar
gasper_k

Ich kann keine Informationen zu diesem Problem finden; Warum funktioniert der folgende Code nicht im IE?

window.x = 45;
delete window.x;
// or delete window['x'];

IE meldet den Fehler „Objekt unterstützt diese Aktion nicht“. Hat es etwas mit dem Iterieren über Fenstereigenschaften im IE-Problem zu tun?

  • Und nur um das klarzustellen, weil es nicht so aussieht, als hätte das jemand in irgendeiner der Antworten gesagt: Dies ist ein Insekt im Internet-Explorer. In der Spezifikation von 1999 (3. Ausgabe) gibt es nichts, was das Auslösen einer Ausnahme erlaubt deleteauch wenn die Eigenschaft nicht vorhanden oder nicht löschbar ist (was Ihre window.x sollte auf keinen Fall sein), und die neue Spezifikation der 5. Ausgabe erlaubt nur Ausnahmen, die von ausgelöst werden delete im neuen strikten Modus. Daran ist nichts Besonderes window diesbezüglich. Und doch ist die JScript-Engine in IE8 still zeigt diesen Fehler im Jahr 2010. seufzen

    – TJ Crowder

    28. März 2010 um 12:44 Uhr


  • Guter relevanter Artikel.

    – Alex

    18. November 2011 um 5:31 Uhr

  • TJ Crowder, window ist kein Objekt, es ist ein Zugriff auf den Root-Namespace. Es hat keine Eigenschaften als solche. Wenn Sie also delete darauf ausführen, wie in diesem Fall, ist es nicht verpflichtet, sie aus irgendeinem Grund tatsächlich zu entfernen. Das Festlegen von undefined für den Namen des Objekts ist in Ordnung, da der GC durchkommt und nicht referenzierte Objekte eliminiert. Ich hoffe, dies hilft, das eigentliche Problem hier zu verstehen und warum dies weniger ein Fehler als vielmehr eine schlechte Implementierungswahl für die Sprache ist, die langsam aktualisiert wird, um sich zu modernisieren

    – Jeffrey Gilbert

    27. Oktober 2015 um 20:12 Uhr

Benutzer-Avatar
Frank Schwietermann

Gasper machte einen Kommentar mit der Lösung, mit der er fertig war, aber ich denke, es lohnt sich, als tatsächliche Antwort zu rufen:

try { 
    delete window.x; 
} catch(e) { 
    window["x"] = undefined; 
}

Interessantes Problem, ich habe mir heute Abend nur den Kopf dagegen geschlagen. Die Ausnahme wird im IE, aber nicht im Firefox ausgelöst. Ich würde vermuten, dass diese Problemumgehung Speicherlecks verursacht, also verwenden Sie sie sparsam.

Es wurde gefragt, warum nicht einfach undefined zuweisen? Es spielt eine Rolle, ob Sie die Schlüssel später aufzählen möchten (wenn Sie sich jedoch auf die Problemumgehung verlassen, wird die Schlüsselaufzählung immer noch nicht das tun, was Sie wollen …). Aber trotzdem, um den Unterschied zwischen dem Löschen und dem einfachen Zuweisen von undefined (http://jsfiddle.net/fschwiet/T4akL/):

var deleted = {
    a: 1
};

var cleared = {
    a: 1
};

delete deleted["a"];
cleared["a"] = undefined;

for(var key in deleted) {
    console.log("deleted has key", key);
}

for(var key in cleared) {
    console.log("cleared has key", key);
}

console.log("deleted has a?", deleted.hasOwnProperty('a'));
console.log("cleared has a?", cleared.hasOwnProperty('a'));

Erzeugt Ausgabe:

cleared has key a
deleted has a? false
cleared has a? true 

  • Ein Kollege fragte einen guten, als ich ihm diese Lösung zeigte: Warum nicht den Mittelsmann überspringen und den Löschaufruf durch die undefinierte Zuweisung ersetzen?

    – Seth Battin

    13. November 2012 um 22:12 Uhr

  • Gute Frage, ich habe ein Jahr gebraucht, um auf einen Fall zu stoßen, bei dem es auf den Unterschied ankommt.

    – Frank Schwietermann

    26. November 2013 um 22:58 Uhr

Ich würde es so machen:

    window[x] = undefined;
    try{
        delete window[x];
    }catch(e){}

  • danke, so habe ich es letztendlich gemacht. Es löst eine Ausnahme im IE aus, aber es wird abgefangen und es wird kein Schaden angerichtet.

    – gasper_k

    13. August 2009 um 11:26 Uhr

  • Die ausführlichste Erklärung zum Löschen, die ich gesehen habe, ist hier, das ist der IE-Abschnitt. (Falls jemand in Zukunft mit einem komplizierteren Problem dazu kommt) perfectionkills.com/understanding-delete/#ie_bugs

    – Patrick McGuire

    18. November 2016 um 16:18 Uhr

Hilft das?

window.x = 45;
alert(window.x);
window.x = null;

Ich habe dies im IE ausprobiert und window.x hatte einen Wert, der beweist, dass er eingestellt werden kann. Setzen Sie den Wert auf null, um ihn zu löschen.

  • Leider entfernt dies die Variable nicht aus dem Speicher, sondern gibt ihr nur einen Nullwert, aber dies ist die einzige Option, soweit ich das beurteilen kann.

    – Andi E

    2. Juli 2009 um 11:50 Uhr

  • Vielen Dank. Ich bin noch einen Schritt weiter gegangen und habe window.x = undefined verwendet. Das ist immer noch nicht das, was ich will, aber es wird reichen. Seltsam, dass ich dazu keine nützlichen Informationen im Internet gefunden habe.

    – gasper_k

    2. Juli 2009 um 17:28 Uhr

  • Object.keys() funktioniert nicht in <= IE8 (die Probleme mit verursachen delete an erster Stelle). Außerdem meinten Sie wahrscheinlich obj[key] = undefined innerhalb des Fangblocks. ;]

    – WynandB

    7. November 2014 um 5:41 Uhr


  • das wäre es! überarbeitet.

    – Mikebert4

    6. Februar 2015 um 0:44 Uhr

1054400cookie-checkLöschen einer Fenstereigenschaft im IE

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy