2013-09-26 32 views
5

nếu tôi thêm xử lý sự kiện trên bất kỳ phần tử trong javascript nhưjavascript xử lý sự kiện sau khi gỡ bỏ nút

var link = document.createElement("a"); 

document.body.appendChild(link); 


link.addEventListner("click",function(){ 

    alert("do something"); 

}); 

và sau đó tôi loại bỏ các liên kết

link.parrentNode.removeChild(link); 

sau đó điều gì về sự kiện mà tôi gắn liền với liên kết sẽ nó cũng được loại bỏ hoặc nó sẽ vẫn còn trong bộ nhớ (một chút nhầm lẫn với cách thức sự kiện được lưu trữ trong bộ nhớ và trong bao lâu) hoặc tôi nên loại bỏ các xử lý sự kiện đầu tiên và sau đó tôi loại bỏ các nút liên kết.

+0

Bạn không đính kèm sự kiện, bạn đính kèm một người nghe cho một sự kiện (do đó tên của phương thức). Trình lắng nghe chỉ tồn tại miễn là đối tượng (phần tử DOM) được gắn vào tồn tại. – RobG

Trả lời

1

Trong các biểu thức hàm javascript (trong trường hợp sự kiện ràng buộc của bạn) phân bổ một đối tượng và do đó tiêu thụ bộ nhớ. Bạn nên loại bỏ hoặc xử lý nó đúng cách. Kiểm tra liên kết này giải thích chi tiết về quản lý bộ nhớ.

Js Memory Management

Kiểm tra phần thu gom rác.

3

Hầu như tất cả các trình duyệt sẽ xóa trình xử lý sự kiện khỏi bộ nhớ khi trình thu thập rác được gọi. Tuy nhiên, IE6 và dưới đây có lỗi đã biết có thể khiến trình xử lý sự kiện không bị thu gom rác khiến trang bị rò rỉ bộ nhớ.

Nó từng được coi là thực hành tốt để làm sạch trình xử lý sự kiện trước khi xóa phần tử (thực sự, các thư viện như YUI và JQuery có chức năng cho việc này). Nhưng những ngày này tôi chỉ nói lo lắng về điều này nếu bạn quan tâm đến IE6.


Lưu ý: trong trường hợp bạn đang tự hỏi về lỗi. Đó là do thực tế là bộ thu gom rác của IE không thể xử lý các tham chiếu vòng tròn nếu nó liên quan đến DOM (trên IE cũ hơn, nó không thể xử lý các tham chiếu vòng tròn ngay cả khi nó không liên quan đến DOM).

Vì vậy, ví dụ, nếu bạn có mã như thế này:

myDiv.onclick = function() { myDiv.style.backgroundColor = 'red' } 
//        ^
//        | 
//      circular reference 

sau đó IE6 và dưới đây có thể không giải phóng các xử lý sự kiện. Nhưng nếu trình xử lý sự kiện của bạn không chứa bất kỳ tham chiếu vòng tròn nào đối với đối tượng DOM, nó sẽ được gắn vào sau đó IE sẽ thu thập dữ liệu đó.

+0

Liên kết đến một câu hỏi liên quan: http://stackoverflow.com/questions/10092619/precise-explanation-of-javascript-dom-circular-reference-issue – slebetman

+0

IE 6 và 7 không hỗ trợ * addEventListener * anyway, do đó, trường hợp này họ sẽ chỉ ném một lỗi. ;-) – RobG