2011-01-04 3 views
0

일부 자바 스크립트를 작성할 때 페이지가로드 될 때 이벤트가 할당 된 일련의 인터페이스 버튼이 있습니다. 내 문제는 이러한 이벤트를 동적으로 생성하지 못하는 것입니다.페이지가로드 된 후 자바 스크립트 처리 이벤트가 발생합니다.

예를 들어 URL 체커를 만들고 있는데 다른 도메인으로 연결되는 링크가 이탈 인터페이스를 표시하여 사용자가 이탈한다는 것을 알립니다. 페이지가로드 된 후 생성 된 모든 링크, 아약스 게시 (의도적 인 말장난 없음) 또는 페이지가로드 될 때 존재했던 것과 같은 자연스럽게 해당 이벤트를 가지지 않는 것.

실제로 새로 생성 된 항목에 이러한 종류의 전역 이벤트가 적용되도록하는 가장 좋은 방법은 무엇입니까?

저는 jQuery를 사용하기를 좋아하지만 이것은 실제로 개념적인 질문입니다.

전체 링크 효과를 다시 적용하는 함수를 만들어야합니까, 아니면 단편적인 방법 외에 더 똑똑한 방법이 있습니까?

+0

누구나 알고 있나요 .live()가 작동합니까? 시간 초과 또는 실제 DOM 이벤트입니까? 또한 href가 일련의 요구 사항을 충족시키는 경우와 같이 더 복잡한 필터를 처리 할 수 ​​있습니까? (http 등으로 시작) –

+2

@Bob : [jQuery의 문서] (http://api.jquery.com/live/#event-delegation)에서 : * .live() 메소드는 이벤트 위임을 사용하여 DOM에 추가되었습니다. 조상 요소에 바인딩 된 처리기는 해당 하위 항목에서 트리거되는 이벤트를 담당합니다. 전달 된 핸들러.live()는 요소에 바인딩되지 않습니다. .live()는 특별한 핸들러를 DOM 트리의 루트에 바인딩합니다. * - 그래서 그것은 delegate()와 비슷하지만 DOM의 루트에서 작동합니다. 그래서 이것이 일반적으로 [ 'delegate()'] (http://api.jquery.com/delegate/). – treeface

+1

@Bob : 셀렉터를 사용하여 "http"로 시작하는 속성 만 선택하는 경우 jQuery의 [selector with selector] (http://api.jquery.com/attribute-starts-with-selector/)를 참조하십시오. 귀하의 경우에는'$ ('a [href^= "http"'). live (...)' – treeface

답변

3

jQuery를 사용하는 경우 .live() 메서드를 사용할 수 있습니다.

일반적으로 이벤트 처리기를 바인딩 할 때 이벤트 처리기는 특정 요소 집합에 바인딩됩니다. 나중에 추가 된 요소는 다시 바인딩되지 않는 한 이벤트 처리기를 수신하지 않습니다.

jQuery의 .live() 메소드는 이벤트 트리에 의존하여 DOM 트리의 루트에 고유 한 특수 이벤트 핸들러를 바인딩하여이 문제를 해결합니다. 요소를 클릭하면 이벤트 핸들러가 직접 연결되어 있지 않으면 이벤트는 DOM 트리를 비 웁니다. jQuery의 특별 이벤트 처리기는 이벤트를 포착하고 대상을보고 .live()를 통해 대상에 할당 된 사용자 지정 이벤트 처리기를 실행합니다.

+0

위대한 설명, 고마워! –

0

jQuery의 live 기능을 살펴보십시오. 로드 중에 제어가 작성 될 때와 새 제어가 작성 될 때마다 이벤트에 첨부 할 수 있습니다. 성능 저하가 있지만 많은 요소를로드하지 않는 한 중요하지 않습니다.

0

.live() jQuery 메서드를 사용하면 페이지로드가 완료된 후에 만들어진 요소에 리스너를 추가 할 수 있습니다. (내가 제대로 이해하는 경우) 출구 링크의 당신의 예를 사용 :

$(function(){ 
    $('a.exitLink').live('click',function(event){ /* do stuff when a link of class exitLink is clicked */); 
}); 

이 관계없이 생성 될 때의, 클래스 exitLink의 링크에 click 이벤트에 응답 할 것이다 (이전 또는 onload 화재 후).

희망이 도움이 :)

0

예는이 전에 있었다 수있는 곳, 간단히 말하면 :

$('selector').click(function() {}); 

하기로 교체 : 호기심으로

$('selector').live('click', function() {}); 
관련 문제