2011-08-25 4 views
2

사람들이 jQuery가 브라우저가 제공하는 기본 DOM 구현 대신 특수 이벤트 라이브러리를 사용한다고 말한 적이 있습니다.jQuery DOM 구현

정확히 무엇을 의미합니까? 실제적으로 말해서 동일한 것을 강조 표시 할 수있는 몇 가지 예를 제공 할 수 있습니까?

답변

2

매우 일반적으로 인 jQuery에는 클로저를 통해 요소에 대한 참조를 유지하는 요소에 단일 처리기가 연결되는 시스템이 있습니다.

이벤트가 요소에서 발생하면 해당 요소의 컨텍스트에서보다 일반적인 핸들러 (jQuery.event.handle)를 호출하고 수신 한 event 개체를 전달합니다. 핸들러는 이벤트를 분석 그게

는 그 요소의 jQuery1234567...의 expando 속성 통해 jQuery.cache의 요소의 조회를 수행하고, 또한 그 원소의 jQuery.cache 항목에 저장되어 적절한 처리기 (들)를 호출한다.

결과적으로 인 유일한 핸들러는 실제로이라는 요소가 부착 된이 가벼운 것으로서 jQuery 자체가 만들고 첨부합니다. 따라서 DOM 요소에 대한 순환 참조으로 인해 IE 에서 메모리 누수가 발생하지 않습니다. 이벤트 핸들러를 관리 할 수 ​​jQuery를 사용할 때 해야 알고


한 가지 요소와 jQuery.cache의 항목 사이의 링크가의 expando 속성 때문이다.

DOM에서 요소를 제거하기 위해 jQuery 바깥쪽에있는 코드가있는 경우 에 jQuery.cache의 관련 처리기 및 기타 데이터가 제거되어 이전 버전의 IE에만 ​​국한되지 않는 자체 메모리 누수가 발생한다는 알림이 표시되지 않습니다. .

그래서 당신은 jQuery를 통해 연결된 처리기를 가지고 HTML의 섹션을 가지고, 당신은 같은 것을 할 경우 :

element_container.innerHTML = ''; 
... 이제 고아 제거 된 요소와 관련 jQuery.cache의 모든 항목, 브라우저 창이 열려있는 한 존재할 것입니다.

jQuery을 사용하여 이벤트 바인딩을 관리하는 경우 jQuery이 필요한 경우 jQuery.cache을 관리하고 정리할 수 있도록 요소를 삭제할 때 API 내에 있어야합니다.


편집

: 나는 핸들러 주위에 이성을 상실했다. 일반적으로 같은 개념.
/* 
    This is a simplified example of the binding of the generic handler. Notice 
     that it actually invokes an internal function. 
*/ 

elem[0].addEventListener('click', function(e) { 
    _internal_handler.apply(elem, arguments); 
}, false); 
/* 
    This is a simplified example of the internal function. 
*/ 

_internal_handler(e) { 
     // Find out the type of event, like "click", or whatever 
    var event_type = e.type; 

     // Get this element's data from jQuery.cache 
    var data = jQuery.data(this); 

     // If data was found... 
    if(data) { 
      // ...get the "events" stored in the element's data 
     var events = data.events; 

      // If events were found, and events has the current type of event... 
     if(events && events[ event_type ]) { 

       // ...then data.events[ event_type ] will give us the Array of 
       //  handlers for that event type, so iterate the Array, 
       //  and fire the handlers. 
      for(var i = 0; i < events[ event_type ]; i++;) { 

        // handler invoked 
       events[ event_type ][ i ].call(this, e); 

      } 
     } 
    } 
} 

이것은 물론 코드의 극단적 인 단순화이다

/* 
    Here we bind 4 handlers to the same element. 
*/ 

var elem = $('#my_elem'); 

    // This first call to .bind() binds a generic handler to `#my_elem`. 
    // Then it places the handler we passed in jQuery.cache. 
elem.bind('click', function() { alert('click 1'); }); 

    // Generic handler already exists, so these handlers are 
    // just added to jQuery.cache. 
elem.bind('click', function() { alert('click 2'); }); 
elem.bind('mouseenter', function() { alert('mouseenter 1'); }); 
elem.bind('mouseleave', function() { alert('mouseleave 1'); }); 

하지만, 일반적으로는 어떻게되는지 보여줍니다.

+0

Thx 많이 있습니다. 어려운 개념을 설명하기 위해 최선을 다했습니다 ... 더 간단한 용어로 처리기에 대한 첫 번째 부분을 설명 할 수 있습니까? 예를 들어 설명해도 될까요? – testndtv

+0

@testndtv : 기본적으로 jQuery는 요소 당 1 개의 일반 핸들러를 연결합니다. 이 일반 핸들러는 jQuery로 바인드 한 핸들러를 호출 할 수 있으며,이 핸들러는'jQuery.cache'에 저장되어있다. 'jQuery.cache'는 jQuery가 요소와 연관시키는 모든 데이터의 중앙 저장소와 같습니다. 이 데이터에는 이벤트 핸들러가 포함됩니다. 따라서 어떤 요소에 이벤트가 발생하면, 그 요소는'jQuery.cache'에 핸들러가 있는지 확인한 후 핸들러를 호출합니다. – user113716

+0

Ok ..cool..2 Questions; 1) jQuery는 페이지의 각 요소에 일반 요소를 첨부합니까? 2) 당신이 준 DOm과 jQuery 예제를 섞어서 사용하는 경우, 우리는 innerHTML을 대체하고 있습니다. 그렇다면 jQuery 핸들링과 어떻게 충돌합니까? 우리가 요소를 삭제하거나 추가하지 않는다는 것을 의미합니다. – testndtv