2016-05-04 8 views
0

Wenn ich window.onresize (in einer einzelnen Seite App) abonniere, muss ich mich abmelden, um ein Speicherleck zu vermeiden? Wenn ja, wie mache ich das?Destroy window.onresize Event Subscriber

<script type="text/javascript"> 
    var heightOutput = document.querySelector('#height'); 
    var widthOutput = document.querySelector('#width'); 

    function resize() { 
    heightOutput.textContent = window.innerHeight; 
    widthOutput.textContent = window.innerWidth; 
    } 

    window.onresize = resize; 
</script> 

https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onresize

Antwort

1

-Mail, können Sie:

// Subscribe 
window.onresize = resize; 

// Unsubscribe 
window.onresize = null; 

Diese Methode erlaubt Ihnen nur eine Funktion bereitzustellen auf resize ausgeführt werden.

Alternativ können Sie verwenden:

// Subscribe 
window.addEventListener("resize", resize); 

// Unsubscribe 
window.removeEventListener("resize", resize); 

Mit diesem Ansatz können Sie mehrere Event-Listener auf das gleiche Ereignis anhängen. Sie tun müssen einen Verweis auf die Methode behalten, die Sie anhängen, um es jedoch entfernen zu können.

Wenn Sie kein Abonnement für ein Ereignis ablegen, werden nicht unbedingt Speicherlecks erzeugt. Wenn Sie beispielsweise eine <button> mit einer Ereignissubskription click erstellen, wird die Subskription entfernt, sobald die <button> aus dem DOM entfernt wird und keine Verweise in Code enthält. (zumindest in modernen Browsern)

Dennoch ist es immer schön, sich Gedanken über die Art und Weise zu machen, wie Sie Abonnements verwalten und unnötige Listener entfernen.

+0

* window.onresize = null * hat nicht für mich funktioniert! – coderz

+0

Ob es funktioniert, hängt davon ab, wie Sie Abonnenten angehängt haben. Wenn Sie 'addEventListener' oder jQuery' .resize' verwendet haben, funktioniert 'onresize = null' nicht. – user3297291

0

In Bezug auf Speicherlecks:

Während einige schwere Bedenken mit Speicherlecks und dem DOM dort verwendet, um zu den besten meines Wissens kein moderner Browser hat Probleme mit, dass mehr.

(Dies ist früher meist ein IE-Problem sein.)

ich eine Diskussion über die DOM-Speicherlecks gefunden, wenn Sie in dem Verständnis interessiert sind, was sie verursachte - aber auch hier in Arbeit heute würde ich nicht zu viele Sorgen machen.

http://javascript.info/tutorial/memory-leaks

Mit der Resize-Ereignis erwarte ich, dass Sie gehen zu sein, nur sie es Anbringen einmal - und es gibt nur ein window Objekt, so würde ich es nicht einen zweiten Gedanken geben.

+0

Wenn Sie im Browser eine Anwendung mit mehreren Komponenten verwenden, sind Sie möglicherweise an die Fenstergröße von buchstäblich hunderten von Widgets gebunden. Da wir momentan so etwas machen, hat dein letzter Satz keinen Komfortwert ;-) "Ich nehme an, du wirst ihn nur einmal anhängen" Der Speicherlecks Link ist tot – PandaWood