jQuery`click`,`bind`,`live`,`delegate`,`trigger` 및`on` 함수의 차이점은 무엇입니까?


139

에 대한 각 함수의 설명서를 읽었 jQuery official website지만 아래 함수 사이에는 비교 목록이 없습니다.

$().click(fn)
$().bind('click',fn)
$().live('click',fn)
$().delegate(selector, 'click', fn)
$().trigger('click') // UPDATED
$().on('click', selector ,fn); // more UPDATED

참조 링크를 피하십시오.

위의 모든 기능은 어떻게 작동하며 어떤 상황에서 어떤 기능을 선호해야합니까?

참고 : 동일한 기능 또는 메커니즘을 가진 다른 기능이있는 경우 자세히 설명하십시오.

최신 정보

나는 또한 $.trigger기능을 보았다 . 위의 기능과 유사하게 작동합니까?

추가 업데이트

이제 v1.7에.on 추가 되었으며이 기능이 위의 모든 기능 요구 사항을 함께 다루고 있다고 생각합니다.


3
@I PHP처럼, 사람들은 매뉴얼로 대답 할 수없는 질문이거나 숙제 질문 인 것 같은 느낌이 들지 않는 경우 투표를합니다. 걱정하지 마십시오. 다른 사람들이 유용하다고 생각하면 투표 할 것입니다.
typeoneerror

@Typeoneerror-지원 주셔서 감사합니다, 나는 이미 매뉴얼을 읽었으며 명확한 차이점을 이해하지 못하면 여기에 게시합니다.
diEcho

3
@I Like PHP-약간의 정리에 대한 질문을 편집했습니다 ... 이것은 종종 요청되지만 거의 이런 식으로 거의 가치가없는 Google 지원 리소스가 될 수 있습니다. 나는 특히 함께이 문제를 해결 혼란을 참조, 이런 일의 위키 틱 항목이 매우 도움이 될 것입니다 동의 .live()하고 .delegate()거의 매일, 완벽하게 유효한 질문 하나.
Nick Craver

@Nick Craver 편집 해 주셔서 감사합니다. 에 어떻게 질문을 게시해야하는지에 대한 약간의 언급이 있습니까 SO? 그것은 단지 경험에 의해왔다
diEcho

@I는 PHP를 좋아합니다. 둘 다입니다. 여기 SO에 대한 포괄적 인 FAQ가 있습니다. 올바른 키워드를 사용하고 적절하게 태그를 지정하면 생각, 코드> 설명을 전달할 수 있습니다. 생각보다 오래 오면 시간이 지남에 따라 많은 포스터가 개선되는 것을 볼 수 있습니다. 편집 내용 .trigger()은 이벤트 핸들러를 호출합니다 ... 아래에 내 답변에 설명을 추가하겠습니다.
Nick Craver

답변:


162

페이지 를 읽기 전에 다른 페이지에서이 이벤트 목록을 가져 오면 API 자체가 매우 유용하며 아래에서 논의하는 모든 내용이이 페이지에서 직접 연결됩니다 .

먼저 .click(function)말 그대로 바로 가기입니다 .bind('click', function). 다음 과 같이 핸들러 를 요소에 직접 바인딩 할 때 사용하십시오 .

$(document).click(function() {
  alert("You clicked somewhere in the page, it bubbled to document");
});

이 요소가 바뀌거나 버려지면 더 이상 처리기가 없습니다. 또한 핸들러를 연결하기 위해이 코드를 실행할 때 존재하지 않은 요소 (예 : 선택기가 발견 한 요소)는 핸들러를 가져 오지 않습니다.

.live().delegate()유사하게 관련되어 .delegate()실제로 사용 .live()둘 다 거품으로 이벤트를 수신, 내부적으로. 이것은 새로운 요소와 오래된 요소 에서 작동 하며 동일한 방식으로 이벤트를 버블 링합니다. 요소가 변경 될 때 (예 : 새 행, 목록 항목 추가 등) 사용할 수 있습니다. 페이지에 남아 있고 어느 시점에서도 교체되지 않는 부모 / 공통 조상이없는 경우.live() 하십시오.

$(".clickAlert").live('click', function() {
  alert("A click happened");
});

그러나 대체되지 않는 어딘가에 부모 요소가있는 경우 (이벤트 핸들러는 안녕히 가십시오) 다음과 .delegate()같이 처리해야 합니다.

$("#commonParent").delegate('.clickAlert', 'click', function() {
  alert("A click happened, it was captured at #commonParent and this alert ran");
});

이것은와 거의 동일하게 작동 .live()하지만 캡처 및 처리기가 실행되기 전에 이벤트 버블 링 횟수가 줄어 듭니다. 둘 다의 또 다른 일반적인 용도는 요소에서 클래스가 변경되어 더 이상 원래 사용한 선택기와 더 이상 일치하지 않는다는 것입니다. 이러한 메소드를 사용 하면 이벤트가 발생할 때 선택기가 평가 되고 핸들러가 실행되면 처리기가 실행됩니다. . 따라서 요소가 더 이상 선택기와 일치하지 않아 더 이상 실행되지 않습니다. 와.click() 하지만, 이벤트 처리기가 DOM 요소에 바인딩 된 권리이며, 그것을 찾는 데 사용 된 어떤 선택 일치하지 않는다는 사실은 무관하다 ... 이벤트가 바인딩하고 해당 요소가 사라 때까지 머물고, 또는 핸들러 를 통해 제거됩니다 .unbind().

그러나 또 다른 일반적인 사용 .live()하고 .delegate()있다 성능 . 많은 요소를 다루는 경우 각 요소에 직접 클릭 핸들러를 연결하면 많은 비용과 시간이 소요됩니다. 이 경우 단일 핸들러 를 설정하고 버블 링 작업을 수행하는 것이 더 경제적입니다 .이 질문을 살펴보면 큰 차이가 생겼습니다. . 응용 프로그램의 좋은 예입니다.


트리거링 -업데이트 된 질문

가능 2 메인 이벤트 핸들러 트리거 기능이있다, 그들은 API에서 동일한 "이벤트 핸들러 첨부 파일"범주에 속하는 이들이다 .trigger().triggerHandler(). .trigger('eventName')일반적인 이벤트에 대한 바로 가기가 내장되어 있습니다 (예 :

$().click(fn); //binds an event handler to the click event
$().click();   //fires all click event handlers for this element, in order bound

여기에서 이러한 단축키를 포함한 목록을 볼 수 있습니다 .

차이점은 .trigger() 대해서는 이벤트 핸들러를 트리거합니다 (그러나 대부분의 경우 기본 조치는 <textarea>아님). 이벤트 핸들러가 바인드 된 순서대로 (기본 이벤트의 순서대로) 발생하고 기본 이벤트 조치를 실행하며 DOM을 버블 링합니다.

.triggerHandler()일반적으로 다른 목적으로 사용됩니다. 여기서는 바인딩 된 핸들러를 실행하려고합니다. 예를 들어 양식 제출과 같은 기본 이벤트가 실행되지 않습니다. DOM을 버블 링하지 않으며 체인화 할 수 없습니다 (해당 이벤트에 대한 마지막 바인딩 이벤트 핸들러가 반환하는 것을 반환합니다). 예를 들어focus 이벤트 싶지만 실제로 객체에 초점을 맞추고 싶지 않다면 바인딩하려는 코드 .focus(fn)를 실행 하고 싶을 .trigger()것입니다.

실제 예는 다음과 같습니다.

$("form").submit(); //actually calling `.trigger('submit');`

jQuery 유효성 검사 플러그인 과 같은 제출 핸들러를 실행 한 다음을 제출하려고합니다 <form>. 그러나 만약 당신 그것이를 통해 엮은 이후, 확인하려면 원하는 submit이벤트 핸들러하지만를 제출하지 <form>이후에, 당신은 사용할 수 있습니다 .triggerHandler('submit')다음과 같이 :

$("form").triggerHandler('submit');

플러그인은 유효성 검사가 통과되지 않으면 처리기가 양식을 제출하지 못하게하지만이 방법을 사용하면 처리 방식에 신경 쓰지 않습니다. 양식 이 중단되었는지 여부에 관계없이 양식을 제출 하지 않으려 는 경우 양식을 다시 확인하고 다른 작업을 수행 하지 않으려 고 했습니다. ( 면책 조항 : 이것은 불필요한 예입니다..validate() 플러그인에 메소드가 이지만 의도를 잘 보여줍니다.)


매우 철저합니다. 하나의 작은 수정 : trigger기본 이벤트를 발생시키지 않습니다. 기본적으로 fireEvent(IE) 또는 dispatchEvent(w3c)로 시뮬레이션 된 이벤트를 의미합니다 .
초승달 신선한

@Crescent - 덜 모호한로 업데이트, 나는 그것이 기본 이벤트가 발생 것을 의미 작업을 다음과 같은 형태로 제출, 링크 등을 등 ... 희망이 업데이트는 명확 :)
닉 Craver

내가 읽고있는 것에서 @Nick, 당신의 테이크 live()가 당신이 나에게 준 것과 다른 것 같습니다 : stackoverflow.com/questions/3981762/… 사용할 때 '무게'는 여전히 문제 live()입니까?
Yahel

@yahelc-예, 물론 ...이 답변은 이벤트 핸들러 옵션과 특정 목적을 엄격하게 비교합니다. 가중치 선택 대 초기 바인딩 수 대 동적으로 추가하는 경우와 초기 선택기 모두 여전히 유효한 관심사입니다. 당신이 경우있는 거 페이지 구조가 아닌 것을 큰 당신이없는 에게 다음있는 거 벌금을 많은 이벤트를 ... 무게를 통해 관심사는 (당신의 구조의 크기 / 깊이와 이벤트의 수에 비례 .live()호출이 수신 하는 유형 ( 예 click:)은 각각에 대해 선택기를 실행하기 때문에 생성되고 있습니다.
Nick Craver

1
jQuery 1.7에서는 $ (document) .on ()에 찬성하여 live ()가 더 이상 사용되지 않습니다.
Synchro

28

처음 두 가지는 동일합니다.

// The following two statements do the same thing:
$("blah").click( function() { alert( "Click!" ); } );
$("blah").bind( "click", function() { alert( "Click!" ); } ); 

그러나 두 번째는 공백으로 구분 된 여러 이벤트 이름을 지정하여 동시에 둘 이상의 이벤트에 바인드하는 데 사용할 수 있습니다.

$("blah").bind( "click mouseover mouseout", function() { alert( "Click! Or maybe mouse moved." ); } ); 

.live방법은 더 흥미 롭습니다. 다음 예제를 고려하십시오.

<a class="myLink">A link!</a>
<a id="another">Another link!</a>

<script>
    $("a.myLink").click( function() { alert( 'Click!' ); } );

    $("a#another").addClass( "myLink" );
</script>

스크립트의 두 번째 줄이 실행 된 후 두 번째 링크에는 "myLink"의 CSS 클래스도 있습니다. 그러나 이벤트가 연결될 때 클래스가 없었기 때문에 이벤트 핸들러가 없습니다.

"myLink"클래스가있는 링크가 페이지의 어딘가에 나타날 때마다 동일한 이벤트 핸들러를 자동으로 갖기를 원합니다. 이것은 행이나 셀을 동적으로 추가하지만 모두 같은 방식으로 동작하기를 원하는 일종의 목록이나 테이블이있을 때 매우 일반적입니다. 매번 새로 이벤트 핸들러를 할당해야하는 번거 로움 대신에 다음 .live방법을 사용할 수 있습니다 .

<a class="myLink">A link!</a>
<a id="another">Another link!</a>

<script>
    $("a.myLink").live( "click", function() { alert( 'Click!' ); } );

    $("a#another").addClass( "myLink" );
</script>

이 예제에서 두 번째 링크는 "myLink"클래스를 가져 오면 이벤트 핸들러를 가져옵니다. 마법! :-)

물론, 그것은 문자 그대로가 아닙니다. 무엇 .live진짜로하는 것은 지정된 요소 자체에 있지만, HTML 트리 (이하 "body"원소)의 매우 루트에 핸들러를 연결합니다. DHTML의 이벤트에는 "버블 링"이라는 재미있는 기능이 있습니다. 이걸 고려하세요:

<div> <a> <b>text</b> </a> </div>

"text"를 클릭하면 먼저 <b> 요소에 "click"이벤트가 발생합니다. 그 후 <a> 요소는 "click"이벤트를받습니다. 그리고 나서 <div> 요소는 "click"이벤트를받습니다. 그리고 <body> 요소까지 계속됩니다. 그리고 여기서 jQuery는 이벤트를 잡아서 이벤트를 발생시킨 요소에 적용되는 "라이브"핸들러가 있는지 확인합니다. 산뜻한!

그리고 마지막으로 .delegate방법입니다. 주어진 선택자를 따르는 요소의 모든 자식을 가져 와서 "실시간"처리기를 연결합니다. 구경하다:

$("table").delegate( "td", "click", function() { alert( "Click!" ); } );

// Is equivalent to:
$("table").each( function() {
    $(this).find( "td" ).live( "click", function() { alert( "Click!" ); } );
} );

질문이 있으십니까?


정확하기 .live()에 바인딩 document하지가 <body>: 당신은 여기 데모를 볼 수 있습니다, 단지 검사 콘솔을 끌어 : jsfiddle.net/aJy2B
닉 Craver

3
이런 식으로 설명하는 것이 더 편리했습니다. :-)
Fyodor Soikin 2018 년

4
"body"부분에서는 충분히 공정하지만 "<body> 요소까지 모든 방법"은 잘못되어 이벤트가 계속해서 .live()지나가고 처리기가 있는 곳이 아니며 그 위에 document있습니다. 여기 데모 : jsfiddle.net/S2VBX
Nick Craver

8

jQuery 1.7부터 .live () 메소드는 더 이상 사용되지 않습니다. jQuery 버전 <1.7을 사용하는 경우 공식적으로 .live () 대신 .delegate ()를 사용하는 것이 좋습니다.

.live ()는 이제 .on ()으로 대체되었습니다.

자세한 내용은 jQuery 사이트로 직접 이동하는 것이 가장 좋지만 .on () 메서드의 현재 버전은 다음과 같습니다.

.on( events [, selector] [, data], handler(eventObject) )
.on( events-map [, selector] [, data] )

http://api.jquery.com/on/


2

$().click(fn)그리고 $().bind('click', fn)첫눈에 동일하지만 $.bind버전은 두 가지 이유 더 강력 :

  1. $().bind()예를 들어 하나의 핸들러를 여러 이벤트에 할당 할 수 있습니다 $().bind('click keyup', fn).
  2. $().bind() 네임 스페이스 이벤트를 지원합니다-요소가 바인딩 된 특정 이벤트 핸들러 만 제거 (바인드 해제)하려는 경우 강력한 기능-자세히 알아보기 네임 스페이스 이벤트 .

실시간 대의원 : 이것은 다른 답변에서 이미 답변되었습니다.


1

API를 읽는 것이 도움이 될 수 있습니다. 그러나 나는 내 머리 꼭대기를 알고 있으므로 계속 게으르게 될 수 있습니다 (예!).

$('#something').click(fn);
$('#something').bind('click',fn);

여기에는 차이가 없습니다 (내가 아는 것). .click단순히 편의 / 도우미 방법입니다.bind('click'

// even after this is called, all <a>s in
// <div class="dynamic_els"> will continue
// to be assigned these event handlers

$('div.dynamic_els a').live(‘click’,fn);

.live전달하는 선택기에 이벤트를 추가하고 (여기서는 보이지 않은) 노드가 삽입 / 제거 될 때 DOM을 계속 확인하므로 이는 매우 다릅니다.

$('#some_element').delegate('td','click',fn);

이것은 이벤트 핸들러를 할당하는 방식 때문에 다릅니다. .delegateDOM 이벤트 버블 링을 중심으로합니다. 기본 원칙은 모든 이벤트가 루트 요소에 도달 할 때까지 DOM 트리를 통해 위로 버블 링하는 것입니다 ( document또는 windowor <html>또는 <body>정확히 기억할 수 없음).

어느 쪽이든, 당신은 바인딩하고 onclick모두에 핸들러 <td>내에서의 $('#some_element')(당신이 말할 수 있지만 당신은 선택기를 지정해야합니다 $(document)). 자식 중 하나를 클릭하면 이벤트가<td> 됩니다. 그런 다음 이벤트의 소스 요소를 추출 할 수 있습니다 (jQuery가 자동으로 수행함).

이것은 많은 요소가있을 때 유용하며 이러한 이벤트가 진행할 몇 가지 (또는 하나의 중앙) 포인트 만 있습니다. 이렇게하면 이러한 이벤트 처리기를보다 적은 수의 개체로 통합하기위한 브라우저 노력과 메모리가 절약됩니다.


1
.live() 또한 사실에서, 이벤트 버블 링 오프 작동 .delegate()에 대한 래퍼입니다 .live(), 그냥 컨텍스트를 추가하고 요소에 결합하는 것 , 다른 것보다 document거품을 캡처가. 버블 링 처리기가 작동하는 방식에 대한 이해가 다소 부족하다고 생각합니다 (jQuery 1.4의 가장 일반적으로 오해 된 부분입니다). 핸들러는 당신이 바인딩 한 요소 에만 있기 때문에 호출 .delegate()한 요소 또는 document의 경우 .live()이벤트가 버블 링 될 때 대상이 선택기와 일치하는지 확인하고 실행되는지 확인합니다.
Nick Craver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.