70 votes

Suppression d'une propriété de fenêtre dans IE

Je ne trouve aucune information sur ce problème ; pourquoi le code suivant ne fonctionne-t-il pas dans IE ?

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

IE signale une erreur du type "object doesn't support this action". Cela a-t-il un rapport avec le problème de l'itération sur les propriétés des fenêtres dans IE ?

49voto

Frank Schwieterman Points 13519

Gasper a fait un commentaire avec la solution sur laquelle il a terminé, mais je pense que cela vaut la peine de le rappeler comme une réponse réelle :

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

Question intéressante, je m'y suis justement heurté ce soir. L'exception est levée sur IE mais pas sur Firefox. Je soupçonne que cette solution de contournement fait perdre de la mémoire, donc à utiliser avec parcimonie.

Il a été demandé, pourquoi ne pas simplement assigner undefined ? C'est important si vous voulez énumérer les clés plus tard (bien que si vous vous fiez à la solution de contournement, l'énumération des clés ne fera toujours pas ce que vous voulez...). Mais quoi qu'il en soit, pour mettre en évidence la différence entre supprimer et simplement assigner 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'));

produit des résultats :

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

38voto

user155314 Points 246

Je le ferais de cette façon :

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

2voto

Steve Fenton Points 55265

Cela vous aide-t-il ?

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

J'ai essayé dans IE et window.x avait une valeur, ce qui prouve qu'elle peut être définie. Mettre la valeur à null est votre meilleure chance de l'effacer.

1voto

Mikebert4 Points 112

J'ai mis en œuvre cette solution lorsque j'ai eu à gérer la mise en cache de mes propres données - les données n'étaient pas nombreuses et la fréquence de la mise en cache était telle que la fuite de mémoire aurait pu devenir un problème. C'est coûteux, mais remapper périodiquement l'objet était le moyen le plus simple pour moi de m'assurer que cela ne devenait pas incontrôlable.

obj = {a: 1, b: 2, c: 3};
var max;

function unset(obj, key) {
    try {
        delete obj[key];
    } catch (e) {
        obj[key] = undefined;
    }

    max++;

    if(max > 200) {
        var keys = Object.keys(obj);
        var len = keys.length;
        var n_obj = {};
        for(var i = 0; i < len; i++) {
            if(obj.hasOwnProperty(keys[i]) && obj[keys[i]] !== undefined) {
                n_obj[keys[i]] = obj[keys[i]];
            }
        }
        return n_obj;
    }
    return obj;
}

obj; //{a: 1, b: 2, c: 3}
obj = unset(obj, "b"); //{a: 1, b: undefined, c: 3} OR {a: 1, c: 3}
//and then eventually we'll garbage collect and...
obj = unset(obj, "b"); //{a: 1, c: 3}   

J'espère que cela sera utile à certains !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X