$ (document) .on ( 'click', '#id', function () {}) vs $ ( '# id'). on ( 'click', function () {}) [닫기]


82

나는 차이점이 무엇인지 찾으려고 노력했다.

$(document).on('click', '#id', function(){});

$('#id').on('click', function(){});

나는 둘 사이에 어떤 차이가 있는지, 그렇다면 그 차이가 무엇인지에 대한 정보를 찾을 수 없었습니다.

어떤 차이가 있다면 누군가 설명해 주시겠습니까?


2
설명서를 읽었습니까? 아니면이 사이트에서 검색 했습니까? 선택할 수있는 몇 백만 개의 답변이 있어야합니까?
adeneo

9
명확하게 문서화되어 있음에도 불구하고 이에 대해 답하는 "배고픈 하마"를 얻게 될 것입니다. 첫 번째 코드는 "문서를 클릭 할 때 ID가 #id 인 항목이면이 코드를 트리거합니다"라고 말합니다. 두 번째는 "현재 ID가 #id 인 항목을 클릭하면이 코드를 트리거합니다"라고 말합니다. 첫 번째는 해당 시점에 존재하지 않지만 앞으로 수행 될 요소에 이벤트를 할당하는 것입니다. 두 번째는 나중에 추가 된 요소에 대해 실행되지 않습니다.
분석 재개 모니카 Cellio

6
나는 둘 다했지만 분명히 충분히 철저하지 않았습니다. 무엇을 검색해야할지 몰랐기 때문에 검색이 어렵습니다. 나는 이것이 무엇이라고 부르는지 모릅니다.
Styphon 2013

1
에 대한 설명서에 설명되어 on()있습니다. :) 할 읽기 그냥 꽤
분석 재개 모니카 Cellio

8
이것이 건설적이지 않거나 문서가 존재하기 때문에 닫아야하는 경우 스택 오버플로 질문의 약 99.9 %를 닫아야합니다.이 경우 나머지 0.1 %는 아마도 폐업 할 것이므로 행운을 빕니다. 경멸적인 "배고픈 하마 포인트"발언도 마찬가지입니다.
cesoid

답변:


68

첫 번째 예는 이벤트 위임을 보여줍니다 . 이벤트 핸들러는 DOM 트리의 상위 요소 (이 경우)에 바인딩되며 document이벤트가 선택자와 일치하는 요소에서 시작된 해당 요소에 도달 할 때 실행됩니다.

이것은 대부분의 DOM 이벤트 가 원점에서 트리를 버블 링 하기 때문에 가능합니다 . #id요소 를 클릭하면 모든 조상 요소를 통해 버블 링되는 클릭 이벤트가 생성됩니다 ( 참고 : 이벤트가 트리에서 아래로 내려올 때 실제로 '캡처 단계'라고하는이 단계가 있습니다. 타겟 ). 해당 조상에서 이벤트를 캡처 할 수 있습니다.

두 번째 예제는 이벤트 핸들러를 요소에 직접 바인딩합니다. 이벤트는 여전히 버블 링되지만 (처리기에서 방지하지 않는 한) 처리기가 대상에 바인딩되어 있으므로이 프로세스의 효과를 볼 수 없습니다.

이벤트 핸들러를 위임하면 바인딩시 DOM에 없었던 요소에 대해 실행되도록 할 수 있습니다. #id두 번째 예제 이후에 요소가 생성 된 경우 핸들러가 실행되지 않습니다. 실행시 DOM에있는 것으로 알고있는 요소에 바인딩하면 핸들러가 실제로 무언가에 연결되고 나중에 적절하게 실행될 수 있습니다.


1
어느 쪽이 이벤트를 더 빨리 위임하는지 알고 싶습니다. 내 jquery 코드의 품질을 향상시키고 싶습니다. DOM의 위임 이벤트는 #Element의 이벤트 위임보다 약간의 시간이 걸립니다. 여러분의 생각을 공유 해주세요
Arun G

1
@James Allardice-후자의 방법을 사용하여 $(document).on('click', $('#id'), function()...어떻게 $(this)참조 할 수 $('#id')있습니까? $(this)현재 참조하고 있습니다 document-내가 이해합니다.
cheshireoctopus

13

다음 코드를 고려하십시오.

<ul id="myTask">
  <li>Coding</li>
  <li>Answering</li>
  <li>Getting Paid</li>
</ul>

자, 여기에 차이가 있습니다

// Remove the myTask item when clicked.
$('#myTask').children().click(function () {
  $(this).remove()
});

이제 myTask를 다시 추가하면 어떨까요?

$('#myTask').append('<li>Answer this question on SO</li>');

이 myTask 항목을 클릭해도 이벤트 핸들러가 바인딩되어 있지 않으므로 목록에서 제거되지 않습니다. 대신을 사용 .on하면 새 항목이 추가 노력없이 작동합니다. .on 버전의 모습은 다음과 같습니다.

$('#myTask').on('click', 'li', function (event) {
  $(event.target).remove()
});

요약:

차이 .on().click()그 것 .click()와 연관된 DOM 요소 때 작동하지 않을 .click()때 이벤트 이후 시점에 동적으로 추가 .on()와 연관된 DOM 요소의 상황에서 사용될 수있는 .on()통화 이후 시점에서 동적으로 생성 될 수있다.


Bhushan, 후자보다 전자를 사용할 이유가 있습니까?
Sean Magyar

내 생각 @SzilardMagyar 나는 내 대답의 요약 섹션에 있다고 대답했다 ..
Bhushan Firake

좋은 정보!
Abdul Aziz Al Basyir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.