jQuery의 .bind () 대 .on ()


207

나는 두 위대한 기사가 새로운 기능에 대해 이야기 발견 .on(): jquery4u.com , elijahmanor.com .

(가) 어떤 방법이 .bind()여전히보다 사용하기 더 낫다는 .on()?

예를 들어 다음과 같은 샘플 코드가 있습니다.

$("#container").click( function( e ) {} )

셀렉터가 하나의 항목을 검색했으며 내 경우에는 페이지가로드 될 때 이미 <div>이름 #container이 존재한다는 것을 알 수 있습니다. 동적으로 추가되지 않습니다. 최신 버전의 jQuery를 사용한다는 것을 언급하는 것이 중요합니다 : 1.7.2.

해당 샘플의 경우 함수에서 제공하는 다른 기능을 사용하지 않더라도 .on()대신 .bind()사용해야 .on()합니까?


5
그 두 번째 기사는 쓰레기입니다. .bind()여러 요소를 바인딩 하는 데 나쁜 방법 이 있지만 .on()바인딩 모드에서 사용될 때 정확히 같은 일을 하는 방법에 대해서는 언급 하지 않습니다.
Alnitak

답변:


316

내부적으로 현재 버전의 jQuery에 .bind직접 매핑됩니다 .on. (동일하게 적용됩니다 .live.) 따라서 .bind대신 사용하면 작지만 실질적으로 중요하지 않은 성능 저하가 있습니다 .

그러나 .bind향후 버전에서 언제든지 제거 될 수 있습니다. 계속 사용할 이유가없고 대신 .bind선호하는 모든 이유가 .on있습니다.


5
아마도-기존 함수에 매핑하기 때문에 제거 할 이유가 거의 없습니다. 반면에 메이저 버전 번호로 업그레이드하면 API에 대한 모든 작업을 수행 할 수 있습니다. 그 시점에서 이전 버전과의 호환성이 반드시 보장되는 것은 아닙니다. 그냥 말해
Blazemonger

6
@Esailija 이러한 함수는 모두 특정 유형의 비동기 요청을 처리하는 데 유용한 바로 가기를 제공합니다. .bind.on비 위임 이벤트에 대한 동일하다; .bind같은 바로 가기의 어떤 종류를 제공하지 $.getJSON않습니다이
jackwanders

7
@jbabey는 기술적으로는 어떤 기능도 제거 할 필요는 없지만 기술적으로는 더 이상 사용하지 않으며 사용하지 말라고 조언합니다. 앞으로 그들은 항상 완전히 제거하기로 결정할 수있었습니다 (버전 2.x에서 특정 IE 지원을 어떻게 제거했는지). 더 이상 사용되지 않는 기능은 사용하지 않아야합니다.
한나

8
"jQuery.fn.bind.toString ()"인쇄시 "function (a, b, c) {return this.on (a, null, b, c)}"출력
Jowen

5
바인드 및 바인드 해제는 jQuery 3
Joe Mabel

58

이 스 니펫은 모두 정확히 동일한 기능을 수행합니다.

element.on('click', function () { ... });
element.bind('click', function () { ... });
element.click(function () { ... });

그러나 그것들은 이것들과 매우 다르며, 모두 같은 것을 수행합니다 :

element.on('click', 'selector', function () { ... });
element.delegate('click', 'selector', function () { ... });
$('selector').live('click', function () { ... });

두 번째 이벤트 핸들러 세트는 이벤트 위임을 사용 하며 동적으로 추가 된 요소에 대해 작동합니다. 위임을 사용하는 이벤트 핸들러도 훨씬 성능이 뛰어납니다. 첫 번째 세트는 동적으로 추가 된 요소에는 작동하지 않으며 성능이 훨씬 떨어집니다.

jQuery의 on() 기능은 아직 존재하지 않는 새로운 기능을 도입하지 않으며, jQuery에서 이벤트 처리를 표준화하려는 시도 일뿐입니다 (더 이상 라이브, 바인드 또는 위임 중에서 결정할 필요가 없음).


1
나는 당신 $('selector').live('click', function () { ... });이 결과를 거의 동일하게 유지 한다는 것을 의미한다고 생각 합니다.
andlrc

11

직접적인 방법과 .delegate우수한 API.on 이며 더 이상 사용되지 않을 의사가 없습니다.

코드는 덜 문자열로 입력되므로 직접 메서드를 사용하는 것이 좋습니다. 자동 버그가 아닌 이벤트 이름을 잘못 입력하면 즉시 오류가 발생합니다. 제 생각에는 쓰기 click보다는 읽기 가 더 쉽습니다.on("click"

.delegate보다 우수 .on하기 때문에 인수의 순서 :

$(elem).delegate( ".selector", {
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
});

대의원의 말이 있기 때문에 바로 대의원임을 알 수 있습니다. 또한 선택기를 즉시 볼 수 있습니다.

.on그 즉시 심지어 위임 않다면 분명하지 않다 당신은 선택의 종료를보고 있습니다 :

$(elem).on({
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
}, "selector" );

이제, 명명 .bind은 정말 끔찍하고 액면가보다 낫습니다 .on. 그러나 .delegate위임되지 않은 이벤트를 수행 할 수없고 직접 방법이없는 이벤트가 있으므로 이와 같은 경우는 드물지만 위임 된 이벤트와 위임되지 않은 이벤트를 명확하게 분리하려는 경우에만 사용할 수 있습니다.


8
jQuery 3.0부터 .delegate () 는 더 이상 사용되지 않습니다.
dim


6

jQuery 문서에서 :

jQuery 1.7부터 .on () 메소드는 문서에 이벤트 핸들러를 첨부하는 데 선호되는 메소드입니다. 이전 버전의 경우 .bind () 메소드는 이벤트 핸들러를 요소에 직접 첨부하는 데 사용됩니다. 핸들러는 jQuery 객체에서 현재 선택된 요소에 첨부되므로 .bind ()에 대한 호출이 발생하는 시점에 해당 요소가 존재해야합니다. 보다 유연한 이벤트 바인딩에 대해서는 .on () 또는 .delegate ()에서 이벤트 위임에 대한 설명을 참조하십시오.

http://api.jquery.com/bind/


1
문서의 조언은 구속, 클릭, 라이브, 위임 및 모든 결과 혼란을 가져온 동일한 팀의 조언입니다. 이 문제에 대한 여러 사이트를 읽은 후, 가장 정확한 사이트는 '설탕 코팅'으로 '설탕'을 묘사하고 설탕이 벌레를 끌어 당기 며 대표자가 갈 길이라고 생각합니다.
DaveWalley

4

Jquery 3.0 이상에서 .bind는 더 이상 사용되지 않으며 대신 .on을 사용하는 것을 선호합니다. @Blazemonger가 이전에 대답 했으므로 제거 될 것이고 확실하게 제거 될 것이라고 대답했습니다. 이전 버전의 경우 .bind는 내부적으로 .on을 호출하며 그 사이에는 차이가 없습니다. 자세한 내용은 API를 참조하십시오.

.bind ()에 대한 jQuery API 문서

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