2011-03-09 12 views
6

JSONP geliştirmesinde yeniyim ve IE 7/8'in JSONP komut dosyasının belleğini temizlemeyeceğini öğrendim. Bu, sayfamda birkaç saat çalıştıktan sonra çok yüksek bellek tüketimine yol açıyor.Internet'te JSONP belleği nasıl temizlenir Exploreor

İnternete baktım ve düzeltmelerin çoğunun, Neil Fraser numaralı ipucuna dayanarak bulunduğunu gördüm. blogdan size Maalesef silme IE "Nesne bu eylemi desteklemiyor" hatasını yaratacak

var tmp; 
    while (tmp = document.getElementById('JSONP')) { 
     tmp.parentNode.removeChild(tmp); 

     // this deletion will create error in IE. 
     for (var prop in tmp) delete tmp[prop]; 
     tmp = null; 
    } 

gibi kodunu kullanarak komut tüm özelliklerini silmek gerektiğini söyledi ve serbest olmayacak hafıza.

Sorularım, JSONP betiğimin belleğini gerçekten nasıl kaldıracak? İki dosya yapıştırarak tarafından bellek sızıntısı yeniden oluşturabilirsiniz

Testing.html

<html><head></head><body><script> 
var script, 
head = document.getElementsByTagName('head')[0], 
loadCount= 0, 
uuid= 1, 
URL= "memleaktest.js?uuid=", 

clearConsole = function() { 
    var con= document.getElementById("console"); 
    while (con.childNodes.length) 
     con.removeChild(con.childNodes[0]); 
}, 

log = function(msg) { 
    var div= document.createElement("DIV"), 
     text= document.createTextNode(msg), 
     con= document.getElementById("console"); 

    div.appendChild(text); 
    con.appendChild(div); 
}, 

test = { "msg" : null, "data" : null }; 

var loaded= function() { 
    if (!test.msg) 
     return setTimeout(loaded,10); 

    log("loaded #" + loadCount + ": " + test.msg); 

    var tmp; 
    while (tmp = document.getElementById('JSONP')) { 
     tmp.parentNode.removeChild(tmp); 

     // not working in IE 7/8 
     // for (var prop in tmp) delete tmp[prop]; 
     tmp = null; 
    } 

    test.msg = test.data = null; 

    if (--loadCount) 
     setTimeout(load, 100); 
}; 

var load = function(){ 
    var url= URL + (uuid ++); 
    log("load via JSONP: "+url); 

    script= document.createElement('script');  
    script.id = 'JSONP'; 
    script.type = 'text/javascript'; 
    script.charset = 'utf-8'; 
    script.src = url; 
    head.appendChild(script); 
    setTimeout(loaded,1000); 
}; 
</script> 
<div> 
<button onclick="loadCount=3; load();" name="asd" value="asdas">jsonp load</button> 
<button onclick="clearConsole();" name="asd" value="asdas">clear Console</button> 
</div> 
<div id="console"></div> 
</body></html> 

memoryleaktest.js

test.msg = "loaded #"+loadCount; 
test.data = "test data with 1MB size"; 

:

Ben aşağıda benim test kodu koymak Testing.html'yi açın.

Sızıntıları izlemek için Damlayı kullandım ve Damlama'da belleğin sürekli olarak arttığını ve "<" komut dosyasının ">" silinmediğini görebilirsiniz.

Yardımlarınız için çok teşekkür ederim!

+0

Büyük ilk soru. SO'ya hoşgeldiniz. –

cevap

2

Sorunuz, bağlandığınız blog yayında zaten yanıtladı. Son paragrafa bakın.

Her zamanki gibi IE özel bir durum gerektiren tek tarayıcıdır. IE, DOM düğümlerinden yerel özellikleri silmeyi sevmez. Neyse ki bu önemli değil, çünkü IE komut dosyalarının yeniden kullanılmasına izin veriyor. Sadece SRC özelliğini değiştir ve yeni sayfayı hemen getir. Böylece sadece IE'de tek bir komut dosyası etiketine ihtiyaç vardır.

kod IE dışındaki tüm tarayıcılarda çalışmalarını sağladı ve sadece komut etiketinin src özelliğini değiştirebilir ve refire beri IE bir sorun değil. Bu yüzden kodunuz (sadece IE için):

var script = document.getElementById('JSONP'); 
if (!script) { 
    [create it once] 
} 
script.src = URL + (uuid ++); 
+0

Teşekkürler Neil, gerçekten sorunu çözüyor! – zyzyis