2009-07-02 31 views
60

Bu konuda herhangi bir bilgi bulamıyorum; neden aşağıdaki kod IE'de çalışmıyor? "Bir" bu eylemi desteklemiyor "hatası bildiriyor IE IE sorununda pencere özellikleri üzerinde yinelenen bir şey var mı?IE'de bir pencere özelliğini silme

+25

Ve sadece açık olmak gerekirse, çünkü hiç kimse bunun yanıtlarda herhangi birinin gerçekte söylediğine benzemiyor: Internet Explorer'da bu bir * hatadır *. 1999 (3. baskı) belirtiminde, özellik silinmemiş veya silinemez olsa bile ('window.x' 'in her durumda olmaması gerekir) bile' delete 'dışında bir istisna atmaya izin veren hiçbir şey yoktur. yeni 5. baskı özelliği sadece yeni silme modunda 'silme 'den atılan istisnalara izin verir. Bu konuda 'pencere' hakkında özel bir şey yok. Ve yine de, IE8'deki JScript motoru * hala * bu hatayı 2010'da sergiliyor. * İç çek * –

+2

[İyi ilgili makale] (http://perfectionkills.com/understanding-delete/). – alex

+0

T.J. Crowder, pencere bir nesne değildir, kök ad alanının bir erişimcisidir. Böyle özelliklere sahip değildir, bu nedenle, bu durumda olduğu gibi silme işlemini çalıştırdığınızda, bunların herhangi bir nedenle kaldırılması zorunlu değildir. Nesnenin isminde undefined ayarı yapmak iyi bir şeydir çünkü gc gelip ilgisiz nesnelere neden olur. Umarım buradaki asıl meseleyi anlamanıza yardımcı olur ve bu neden bu kadar fazla bir hata değildir, çünkü bu durum yavaş yavaş modernize etmek için –

cevap

31

ben bu şekilde yapardı:

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

teşekkürler, sonunda yaptım. IE'de bir istisna atar, ancak yakalanır ve hiçbir hasar yapılmaz. –

+0

Gördüğüm silme konusundaki en kapsamlı açıklama burada, burası IE bölümü. (Gelecekte bunun daha karmaşık bir konuyla birisinin gelmesi durumunda) http://perfectionkills.com/understanding-delete/#ie_bugs –

2

Bu yardımcı olur mu?

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

Bunu IE'de denedim ve window.x ayarlanabileceğini kanıtlayan bir değere sahipti. Değeri null olarak ayarlamak, onu temizlemek için en iyi seçimdir.

+0

modernizasyonunu güncellemektedir. Ne yazık ki bu hafızadaki değişkeni ortadan kaldırmaz. boş bir değer, ama söyleyebileceğim kadarıyla tek seçenek bu. –

+1

Teşekkürler. Bir adım daha ileri gittim ve window.x = undefined kullanıyorum. Bu hala istediğim şey değil, ama yapacak.Bu konuda web hakkında hiçbir yararlı bilgi bulamadığım garip. –

48

Gasper o bitmiş solüsyonu ile bir yorum yaptı, ama sanırım onun gerçek bir cevap olarak seslendiğini değer:

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

İlginç bir konu Sadece bu gece kafama çarpıyordum. İstisna IE'ye atıldı ama Firefox değil. Bu geçici çözümün bellek sızıntısından şüphelenirim, bu yüzden dikkatli kullanın.

Neden sorulmamış, neden sadece tanımlanmamış? Anahtarları daha sonra yeniden numaralandırmak isterseniz önemlidir (bununla birlikte, geçici çözüm yöntemine güveniyorsanız, anahtar numaralandırma istediğinizi yapmayacaktır ...). Ama her neyse, silme arasındaki farkı vurgulamak için ve sadece tanımsız (http://jsfiddle.net/fschwiet/T4akL/) atama:

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

Bir meslektaşım onlara bu çözümü gösterdiğimde iyi bir soru sordu: neden orta adamı atlamıyorsunuz? ve silme çağrısını tanımsız atama ile değiştirin? –

+0

İyi bir soru, farkın önemli olduğu bir davaya girmem bir yıl sürdü. –

1

kendi verileri önbelleğe ile uğraşırken ben bu çözümü hayata - Veri değildim:

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')); 

çıktı üretir Önbellek sıklığı, bellek sızıntısı bir sorun haline gelmiş olabilirdi. Pahalı, ama periyodik olarak nesnenin tekrar eşleştirilmesi, elden çıkmadığından emin olmam için en kolay yoldu.

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} 

Umarım, bu biraz yararlıdır!

+2

'Object.keys()' <= IE8'de (ilk etapta "delete" ile sorun oluşturanlar) çalışmayacaktır. Ayrıca, muhtemelen yakalama bloğu içinde 'obj [key] = undefined' anlamına geliyordu. ; – WynandB

+0

bu olurdu! Revize. – Mikebert4