.on ( 'click')과 .click ()의 ​​차이점


526

다음 코드간에 차이점이 있습니까?

$('#whatever').on('click', function() {
     /* your code here */
});

$('#whatever').click(function() {
     /* your code here */
});

답변:


761

차이는 사용 패턴에 있다고 생각합니다.

내가 선호하는 것 .on이상의 .click전자가 있기 때문에 동적으로 추가 요소에 대해 적은 메모리와 작업을 사용합니다.

다음 html을 고려하십시오.

<html>
    <button id="add">Add new</button>
    <div id="container">
        <button class="alert">alert!</button>
    </div>
</html>

우리는 통해 새로운 버튼을 추가

$("button#add").click(function() {
    var html = "<button class='alert'>Alert!</button>";
    $("button.alert:last").parent().append(html);
});

"경고!"를 원합니다 경고를 표시합니다. "click"또는 "on"을 사용할 수 있습니다.


우리가 사용할 때 click

$("button.alert").click(function() {
    alert(1);
});

위와 같이 선택기와 일치하는 모든 단일 요소에 대해 별도의 핸들러가 작성됩니다 . 그 의미는

  1. 일치하는 요소가 많으면 동일한 처리기가 많이 생성되어 메모리 사용량이 증가합니다.
  2. 동적으로 추가 된 항목에는 핸들러가 없습니다. 즉, 위의 HTML에서 새로 추가 된 "경고!" 핸들러를 리 바인드하지 않으면 버튼이 작동하지 않습니다.

우리가 사용할 때 .on

$("div#container").on('click', 'button.alert', function() {
    alert(1);
});

위와 같이 동적으로 생성 된 것을 포함하여 선택기와 일치 하는 모든 요소에 대한 단일 처리기 .


... 사용해야 할 또 다른 이유 .on

Adrien이 아래에서 언급했듯이 사용하는 또 다른 이유 .on는 네임 스페이스 이벤트입니다.

처리기를 추가 .on("click", handler)하면 일반적으로 처리기를 제거하면 .off("click", handler)처리기가 제거됩니다. 분명히 이것은 함수에 대한 참조가있는 경우에만 작동하므로 그렇지 않으면 어떻게됩니까? 네임 스페이스를 사용합니다.

$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });

바인딩을 통해

$("#element").off("click.someNamespace");

2
어떻습니까 : $ ( 'button.alert'). on ( 'click', function () {alert (1);}); ?
Matthew

8
@andreister : 내가 틀렸다면 수정하지만 다른 장점은을 사용할 때 네임 스페이스를 사용하는 것 입니다. stackoverflow.com/a/3973060/759452on('click' ...) 참조 그리고 동시에, 내가 사용하는 것 중 하나만 바인딩 해제 할 수 있습니다on('click.darkenallothersections' ...)on('click.displaynextstep' ...).unbind('click.displaynextstep')
Adrien Be

선택기와 일치하는 모든 요소에 대해 별도의 핸들러가 생성되는 것으로 생각하지 않습니다. 나는 1 핸들러가 생성 될 것이라고 생각하지만 오버 헤드는이 핸들러를 여러 요소에 바인딩하고 이러한 모든 요소를 ​​모니터링함으로써 발생합니다. 적어도 나는 문서에서 이것을 찾지 못했습니다.
추적

7
누구든지 왜 .on이 동적으로 추가 된 항목에 대해 작동 할 수 있지만 .click이 작동하지 않는지 설명 할 수 있습니까?
MengT

2
on()jQuery의 트렌드입니다. jQuery 3으로 업그레이드 $(window).load(function() {});$(window).on("load", function (e) {})때 업데이트해야했습니다.
Victor Stoddard

37

다음 코드간에 차이점이 있습니까?

아니오, 귀하의 질문에있는 두 코드 샘플 사이에는 기능상의 차이가 없습니다. .click(fn)의 "바로 가기 방법"입니다 .on("click", fn). 에서 의 문서.on() :

.click()이벤트 핸들러를 첨부하거나 트리거하는 데 사용할 수있는 일부 이벤트에는 약식 메소드 가 있습니다. 속기 방법의 전체 목록은 events 카테고리를 참조하십시오 .

참고 것이 .on()다릅니다 .click()가 만들 수있는 능력이 있다는 점에서 위임 된 이벤트 핸들러를 통과하여 selector반면, 매개 변수는 .click()하지 않습니다. 때 .on()없이 호출 selector매개 변수, 그것과 완전히 동일하게 동작합니다 .click(). 이벤트 위임을 원하면을 사용하십시오 .on().


4
@andreister가 지적한 성능 문제는 어떻습니까?
rubo77

@ rubo77 기껏해야 무시할 만합니다. 우리는 단일 그림 밀리 초를 사용하고 있습니다.
Rory McCrossan

1
@RoryMcCrossan 그것은 나를 위해 큰 문제입니다-이벤트가 필요한 페이지에 최대 3000 개의 질문이 있기 때문에 이것을 찾고 있습니다. 1 밀리 초마다 페이지 성능이 3 초 더 길어집니다. 댓글이 큰 목록에는 도움이되지 않습니다.
랜디

11
더 큰 문제는 페이지에 3000 개의 질문이있는 이유입니다. 좋은 UI 패턴을 따르는 경우 페이지에 많은 정보가 없어야합니다. 페이징 또는 게으른 로딩을 살펴보십시오. 이벤트 위임을 사용하여 이러한 모든 요소에 대해 단일 이벤트 핸들러를 사용하는 것이 더 좋습니다.
Rory McCrossan 2016 년

5
@ rubo77-성능 향상 은 매개 변수 를 전달 하여 이벤트 위임 을 사용할 때만 나타납니다 selector. 매개 변수 .on()없이 호출하면을 selector사용하는 것보다 성능이 향상되지 않습니다 .click().
gilly3

23

.on()jQuery 1.7부터 모든 이벤트 바인딩을 수행하는 데 권장되는 방법입니다. 다른 매개 변수를 전달할 때 동작을 변경하는 두 가지 기능 .bind().live()하나 의 기능으로 모두 롤링 됩니다.

당신의 예를 썼을 때, 둘 사이에는 차이가 없습니다. 둘 다 핸들러를의 click이벤트에 바인딩합니다 #whatever. 원하는 경우 on()하위에서 발생한 이벤트 #whatever를 단일 핸들러 함수 에 위임 할 수있는 유연성을 제공 합니다.

// Bind to all links inside #whatever, even new ones created later.
$('#whatever').on('click', 'a', function() { ... });

"#에 포함 된 모든 링크에 연결, 나중에 새로 생성 된 링크까지." 정확히 무엇 .live()입니까? 또한 이것은 다른 기능과는 모순되는 것처럼 보이며,의 기능 만 가지고 .click()있으므로 향후 이벤트에는 적용되지 않습니다.
bgcode 2019

3
@babonk - Interrobang가 첫 번째 단락에서 말했듯이 있기 때문에, 다른 답변을 모순되지 않는 .on()일을 할 수있는 .click()수행 일을 .bind()하고 .live()할 - 그것은 당신이 그것을 호출 어떤 매개 변수 따라 달라집니다. (일부 다른 답변도이 문제를 언급했다.) 그 생각 참고 "바인딩을 #whatever 내부의 모든 링크"입니다 하지 어떻게 .live()하지, 그것은 무엇 .delegate()않습니다. 컨테이너를 지정하지 않고 .live()모든 내부에 바인딩합니다 document. 참고 또한 .live()이후 jQuery를 1.7에서 사용되지 않습니다.
nnnnnn

위임 된 이벤트의 경우 +1 : "위임 된 이벤트 처리기가 연결될 때 존재하도록 보장 된 요소를 선택하면 위임 된 이벤트를 사용하여 이벤트 처리기를 자주 연결하고 제거 할 필요가 없습니다." api.jquery.com/on
jimasp

19

다른 답변에서 언급했듯이 :

$("#whatever").click(function(){ });
// is just a shortcut for
$("#whatever").on("click", function(){ })

그럼에도 불구하고 이벤트 위임을 처리 할 수 ​​있지 않은 .on()여러 가지 다른 매개 변수 조합 을 지원합니다 .click()(superceding .delegate().live()).

(그리고 분명히 "키업", "포커스"등에 대한 다른 유사한 단축키 방법이 있습니다.)

추가 답변을 게시하는 이유는 .click()매개 변수없이 호출하면 어떻게되는지 언급하는 것입니다 .

$("#whatever").click();
// is a shortcut for
$("#whatever").trigger("click");

.trigger()직접 사용하는 경우 추가 매개 변수 또는 jQuery 이벤트 객체를 전달할 수 있습니다 .click().

나는 또한 당신이 (JQuery와-1.7.1.js 단위)의 jQuery 소스 코드를 보면 당신이 내부적으로 볼 수 있음을 언급하고 싶었다 .click()(또는 .keyup(), 등) 함수가 실제로 호출 .on()또는 .trigger(). 분명히 이것은 그들이 실제로 동일한 결과를 가지고 있음을 확신 할 수 있지만, 사용하는 것이 .click()약간 더 많은 오버 헤드 를 가지고 있음을 의미합니다 . 대부분의 상황에서 걱정하거나 생각할 것이 아니라 이론적으로는 특별한 상황에서 중요 할 수 있습니다.

편집 : 마지막으로 .on()여러 이벤트를 한 줄에서 동일한 함수에 바인딩 할 수 있습니다.

$("#whatever").on("click keypress focus", function(){});

두 가지 방법을 모두 메모리에로드하여 사용하지 않습니까? 상관 없습니다. 그리고 가독성을 위해 더 편할까요?
Vince V.

@VinceV. - 예. "표준"위임되지 않은 이벤트 처리기의 경우 두 방법 모두 동일한 작업을 수행하며 성능 차이는 무시할 수 있으므로 사용하는 방법은 실제로 개인 취향의 문제입니다. (보통을 선택합니다 .click().)
nnnnnn

9

아닙니다.
요점은 on()다른 과부하와 바로 가기 방법이없는 이벤트를 처리하는 기능입니다.


1
@arigold : 다른 과부하입니다.
SLaks

9

그들은 같은 것으로 보인다 ... click () 함수의 문서 :

이 메소드는 .bind ( 'click', handler)의 단축키입니다.

on () 함수 의 문서 :

jQuery 1.7부터 .on () 메소드는 이벤트 핸들러를 첨부하는 데 필요한 모든 기능을 제공합니다. 이전 jQuery 이벤트 메소드에서 변환하는 데 도움이 필요하면 .bind (), .delegate () 및 .live ()를 참조하십시오. .on ()으로 바인드 된 이벤트를 제거하려면 .off ()를 참조하십시오.


두보기가 병합되어야합니다. Click ()은 .Bind () 및 .On ()의 단축키입니다. JQUERY 1.7.0 +에 따라 Trigger ( 'click')의 단축키이기도합니다. [ api.jquery.com/click/]
Dhanasekar

이것은 문서에서 매우 간단 설명이지만, 대답 아래 하나가 더 나은 다른 것보다에서 왜의 좋은 본보기가 .click.on
phatskat

@phatskat-나는 당신에게 동의합니다 :)
dana

8

.click 이벤트는 요소가 렌더링 될 때만 작동하며 DOM이 준비 될 때로드 된 요소에만 연결됩니다.

.on 이벤트는 DOM 요소에 동적으로 연결됩니다. 이는 이벤트가 Ajax 요청 또는 기타 사항 (DOM 준비 후)에서 렌더링되는 DOM 요소에 연결하려는 경우에 유용합니다.


5

다음은 클릭 이벤트를 적용하는 다양한 방법 목록입니다. 적절하게 선택 가능하거나 클릭이 작동하지 않는 경우 대안 중 하나를 시도하십시오.

$('.clickHere').click(function(){ 
     // this is flat click. this event will be attatched 
     //to element if element is available in 
     //dom at the time when JS loaded. 

  // do your stuff
});

$('.clickHere').on('click', function(){ 
    // same as first one

    // do your stuff
})

$(document).on('click', '.clickHere', function(){
          // this is diffrent type 
          //  of click. The click will be registered on document when JS 
          //  loaded and will delegate to the '.clickHere ' element. This is 
          //  called event delegation 
   // do your stuff
});

$('body').on('click', '.clickHere', function(){
   // This is same as 3rd 
   // point. Here we used body instead of document/

   // do your stuff
});

$('.clickHere').off().on('click', function(){ // 
    // deregister event listener if any and register the event again. This 
    // prevents the duplicate event resistration on same element. 
    // do your stuff
})

3

이제 click ()을 더 이상 사용하지 않으므로 on ( 'click')


이전 click () 동작을 지금 원한다면 어떻게해야합니까?
bgcode

1

인터넷과 일부 친구로부터 멀어지면 동적으로 요소를 추가 할 때 .on ()이 사용됩니다. 그러나 클릭 이벤트가 node.js에 AJAX를 보내고 간단한 새 요소를 추가 할 때 간단한 로그인 페이지에서 사용하면 다중 AJAX 호출을 시작했습니다. 클릭 ()으로 변경하면 모든 것이 올바르게되었습니다. 실제로 나는 전에이 문제에 직면하지 않았다.


0

새로운 요소

클릭이 새로운 요소에 첨부되기를 원하는 경우 위의 포괄적 인 답변에 대한 부록으로 중요한 포인트를 강조하십시오.

  1. 첫 번째 선택기에서 선택한 요소 (예 : $ ( "body"))는 선언 할 때 존재해야합니다. 그렇지 않으면 첨부 할 것이 없습니다.
  2. 대상 요소에 대한 올바른 선택기를 포함하여 .on () 함수에서 세 개의 인수를 두 번째 인수로 사용해야합니다.

-1
$('.UPDATE').click(function(){ }); **V/S**    
$(document).on('click','.UPDATE',function(){ });

$(document).on('click','.UPDATE',function(){ });
  1. $ ( '. UPDATE'). click (function () {});보다 효과적입니다.
  2. 더 적은 메모리를 사용하고 동적으로 추가 된 요소에 대해 작동 할 수 있습니다.
  3. 편집 및 삭제 버튼이있는 동적 인출 된 데이터는 행 데이터의 데이터를 편집하거나 삭제할 때 JQuery 이벤트를 생성하지 않습니다.이 시간 $(document).on('click','.UPDATE',function(){ });은 jquery를 사용하여 동일한 페치 된 데이터처럼 효과적으로 작동합니다. 업데이트 또는 삭제시 버튼이 작동하지 않는 경우 :

여기에 이미지 설명을 입력하십시오


$ (document) .on ( 'click', '. UPDATE', function () {}); 1) $ ( '. UPDATE'). click (function () {})보다 효과적입니다. 2) 적은 메모리를 사용하고 동적으로 추가 된 요소를 사용할 수 있습니다. 3) 편집 및 삭제 버튼이있는 시간 동적 인출 된 데이터는 행 데이터의 데이터를 편집하거나 삭제할 때 JQuery 이벤트를 생성하지 않습니다. {}); jquery를 사용하여 가져온 데이터와 같은 방식으로 효과적으로 작동합니다. 업데이트 또는 삭제시 버튼이 작동하지 않음
Devang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.