2010-12-05 6 views
8

요소가 페이지에서 제거되면 자동으로 바인딩 해제됩니까? 아니면 jquery의 바인딩 해제를 사용하여 바인딩을 해제해야하는 시나리오입니까? 당신이 remove 또는 empty를 사용하여 요소를 제거하면 나는 자동으로 이루어집니다 가정jQuery에서 바인딩 해제

...

+0

@martym dom에서 elment를 제거하고 페이지를 다시로드하면 해당 요소를 찾을 수 없으므로 다시 바인드되지 않습니다. 그것은 다음 페이지로드에서 발생합니다. – kobe

+0

새로 고침하지 않고 왜 다른 페이지로드를 수행합니까? 나는 당신의 대답에 조금 혼란 스럽다 ... – Matrym

답변

6

는 이벤트 핸들러가 자동으로 메모리 누수를 방지하기 위해 제거됩니다. 그렇지 않으면 요소를 제거하기 전에 명시 적으로 바인딩 해제되지 않은 경우 그대로 유지됩니다.

EDIT : 내부 .cleanData 메서드 (5177 줄에 선언되어 있음)를 호출하여 .html이 이벤트 핸들러를 제거합니다. 당신은 source에서 확인 가능 :

html: function(value) { 
    ... 

    for (var i = 0, l = this.length; i < l; i++) { 
        // Remove element nodes and prevent memory leaks 
        if (this[i].nodeType === 1) { 
         jQuery.cleanData(this[i].getElementsByTagName("*")); 
         this[i].innerHTML = value; 
        } 
       } 
    ... 

그래서, 메모리 누수를 방지하기 위해, 직접 jQuery를 이벤트 핸들러를 첨부 DOM 요소를 대체 할 innerHTML를 사용하지 마십시오.

+0

.html ("stuff")를 사용하여 div의 내용을 바꾼다면, 이전에 그 안에 있던 요소들이 바운딩 된 채로 있다는 것을 이해하고 있는가? 나중에 바인드를 해제 할 수 있습니까? 아니면 DOM에서 제거하기 전에 언 바인딩해야합니까? – Matrym

+0

@ karim79 학습 목적으로 만 바인딩 요소와 관련된 메모리 누수를 예로들 수 있습니다. 클릭 또는 마우스 오버 – kobe

+0

@martym .html은 기존의 일부 elemnt에 html을 적용하므로 agian을 바인딩 할 필요가 없습니다. 몇 가지 바인딩이 필요하다면 jquery.live를 사용해야하고 그렇게해야합니다. – kobe

관련 문제