`on`과`live` 또는`bind`의 차이점은 무엇입니까?


172

jQuery v1.7 에는 새로운 방법 on이 추가되었습니다. 설명서에서 :

'.on () 메소드는 이벤트 핸들러를 jQuery 객체에서 현재 선택된 요소 세트에 연결합니다. jQuery 1.7부터 .on () 메소드는 이벤트 핸들러를 연결하는 데 필요한 모든 기능을 제공합니다. '

과의 차이가 무엇 livebind?



물어보기 전에 그런 것을 찾아서 성공하지 못했습니다. 감사!
Diego

답변:


329

on()대부분의 jQuery의 이벤트 바인딩 함수를 하나로 병합하려는 시도입니다. 이것은 livevs로 비 효율성을 정리하는 추가 보너스를가집니다 delegate. jQuery를 향후 버전에서는이 방법이 제거됩니다 만 on하고 one남아있을 것입니다.

예 :

// Using live()
$(".mySelector").live("click", fn);

// Equivalent `on` (there isn't an exact equivalent, but with good reason)
$(document).on("click", ".mySelector", fn);
// Using bind()
$(".mySelector").bind("click", fn);

// Equivalent `on`
$(".mySelector").on("click", fn);
// Using delegate()
$(document.body).delegate(".mySelector", "click", fn);

// Equivalent `on`
$(document.body).on("click", ".mySelector", fn);

내부적으로 jQuery는 이러한 모든 메소드 속기 이벤트 핸들러 세터를 메소드에 맵핑 하며on() , 이제는이 메소드를 무시하고 사용해야합니다 on.

bind: function( types, data, fn ) {
    return this.on( types, null, data, fn );
},
live: function( types, data, fn ) {
    jQuery( this.context ).on( types, this.selector, data, fn );
    return this;
},
delegate: function( selector, types, data, fn ) {
    return this.on( types, selector, data, fn );
},

https://github.com/jquery/jquery/blob/1.7/src/event.js#L965를 참조 하십시오 .


@JamWaffles가 가장 이해하기 쉬운 대답을 말했습니다. 답변을 완료하기 위해 on과 delegate 사이의 비교를 추가 하시겠습니까? 감사!
Diego

lols, 당신이 사초 내 앞에 JQuery와 소스를 추가 : D BTW 라이브 상응하는 상황이되지는 document.body, 문서입니다
Esailija

1
대신 1.7 태그를 참조 할 수도 있습니다. 그렇지 않으면 나중에 변경하면 링크가 유효하지 않을 수 있습니다 (올바른 위치를 가리 키지 않음) : github.com/jquery/jquery/blob/1.7/src/event.js#L965
Felix Kling

3
$(document.body).delegate("click", ".mySelector", fn);해야$(document.body).delegate(".mySelector", "click", fn);
소니

2
@dsdsdsdsd, off 는 바인드 해제, 미사용 및 미완료를 대체하는 역할을합니다.
Andy E

12

on자연과 매우 가깝습니다 delegate. 그렇다면 왜 대리자를 사용하지 않습니까? on혼자 오지 않기 때문 입니다. 거기에 off바인딩을 해제 이벤트와, one한 번만 실행되는 이벤트를 만들 수 있습니다. 이것은 새로운 이벤트의 "패키지"입니다.

주요 문제점은 live"창"에 연결되어 페이지 구조 (돔) 내부의 요소에 대한 클릭 이벤트 (또는 다른 이벤트)를 강제로 발생시켜 이벤트를 찾기 위해 페이지 상단으로 "버블 링"하는 것입니다. 핸들러가 기꺼이 처리합니다. 각 수준에서 모든 이벤트 처리기를 확인해야합니다. 심하게 찌르면 ( <body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...)

그래서, bind같은 click다른 바로 가기 이벤트 바인더는 이벤트 대상에 직접 연결처럼. 1000 줄과 100 열의 표가 있고 각 100'000 셀에는 클릭 할 처리하는 확인란이 있습니다. 100'000 개의 이벤트 처리기를 연결하면 페이지를로드 하는 데 많은 시간 이 걸립니다 . 테이블 수준에서 단일 이벤트를 만들고 이벤트 위임을 사용하는 것이 몇 배나 더 효율적입니다. 이벤트 실행시 이벤트 대상이 검색됩니다. " this"는 표가되지만 함수 에서 event.target" this"는 일반적인 " "입니다 click. 이제 좋은 점 on은 " this"가 첨부 된 컨테이너가 아니라 항상 이벤트 대상 이된다는 것입니다 .


위임이 미정과 함께 제공되지 않습니까?
DaveWalley

1
예. 좋은 스포팅. 매일 배운다;) (문서는 2011 년 이후 크게 향상되었습니다)
roselan

5

.on방법은 할 수있다 .live, .delegate.bind같은 기능을하지만, 함께 .live()에만 .live()가능 (문서에 이벤트를 위임)됩니다.

jQuery("#example").bind( "click", fn ) = jQuery( "#example").on( "click", fn );

jQuery("#example").delegate( ".examples", "click", fn ) = jQuery( "#example" ).on( "click", ".examples", fn )

jQuery("#example").live( fn ) = jQuery( document ).on( "click", "#example", fn )

jQuery 소스에서 직접 확인할 수 있습니다.

bind: function( types, data, fn ) {
    return this.on( types, null, data, fn );
},

live: function( types, data, fn ) {
    jQuery( this.context ).on( types, this.selector, data, fn );
    return this;
},

delegate: function( selector, types, data, fn ) {
    return this.on( types, selector, data, fn );
},

jQuery (this.context)? this.context=== document대부분의 경우


3

(질문을 변경하기 전에 내 첫 문장이 더 의미가 있습니다. 원래 "당신과의 차이점은 live무엇입니까?"

on보다 더 비슷 delegate합니다. live기본적으로 통일 된 형태 bind이며 delegate(실제로 팀은 그 목적이 "... 이벤트를 문서에 첨부하는 모든 방법을 통일하는 것" 이라고 말했습니다 . " )

live기본적으로된다 on(또는 delegate) 전체 문서에 첨부. 그것은 것 V1.7 추천되지 사용에 찬성 on또는 delegate. 앞으로, 또는 (또는 )를 on사용하는 대신 코드를 단독으로 사용 하는 것으로 보입니다 .binddelegatelive

실제로는 다음을 수행 할 수 있습니다.

  1. 다음 on과 같이 사용하십시오 bind.

    /* Old: */ $(".foo").bind("click", handler);
    /* New: */ $(".foo").on("click", handler);
  2. 다음 on과 같이 사용하십시오 delegate(주어진 요소에 기반을 둔 이벤트 위임) :

    /* Old: */ $("#container").delegate(".foo", "click", handler);
    /* New: */ $("#container").on("click", ".foo", handler);
  3. 다음 on과 같이 사용하십시오 live(문서에 기반을 둔 이벤트 위임).

    /* Old: */ $(".foo").live("click", handler);
    /* New: */ $(document).on("click", ".foo", handler);

1
링크 된 페이지에서 "새 HTML이 페이지에 주입되는 경우 새 HTML이 페이지에 배치 된 후 요소를 선택하고 이벤트 핸들러를 첨부하십시오. 또는 다음 설명과 같이 위임 된 이벤트를 사용하여 이벤트 핸들러를 첨부하십시오." . 그래서 살아 있지 않고 속박 될 가능성이 더 큽니다. 내가 맞아?
Diego

@ Diego : on과의 조합 bind이며 delegate, 내가 말했듯이별로 좋아하지 않습니다 live. 당신은 사용할 수 있습니다 on처럼 bind(요소에 직접 핸들러를 첨부), 또는 당신이 사용할 수있는 on것처럼 delegate(요소에 핸들러를 연결하지만, 실제 요소가 일치에게 선택을 클릭 한 경우에만 이벤트가 발생하고, 그 요소 것처럼 하나였다 이벤트에 무슨 일이 있었 - 예를 들어, 이벤트 위임), 또는 당신은 같이 사용할 수 있습니다 live( delegate) 루트로 문서를 사용하여. 요소를 동적으로 추가하는 경우 유용하게 만드는 것은 이벤트 위임입니다.
TJ Crowder

1
오래된 라이브는 delegate처럼 사용할 수도 있습니다. $("#id", ".class").live(fn)= $(".class").delegate("#id", fn );실제로 오래된 jQuery 소스에서는 라이브를 일반적인 경우로 사용하고 특수한 경우로 위임했습니다.
Esailija

@Esailija : 충분히 공평합니다. 나는 그것이 delegate바로 빨리 추가 되었지만 여전히 사용 했기 때문에 그것이 알려진 용도라고 생각하지 않습니다 . :-)
TJ Crowder


2

기본 사용 사례는 없습니다. 이 두 줄은 기능적으로 같습니다

$( '#element' ).bind( 'click', handler );
$( '#element' ).on( 'click', handler );

.on ()도 이벤트 위임을 수행 할 수 있으며 선호됩니다.

.bind ()는 실제로 .on ()의 별칭 일뿐입니다. 1.7.1의 바인드 함수 정의는 다음과 같습니다.

bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
},

.on ()을 추가하는 아이디어는 이벤트 바인딩을위한 여러 함수를 갖지 않고 통합 이벤트 API를 작성하는 것이 었습니다. .on ()은 .bind (), .live () 및 .delegate ()를 대체합니다.


0

요소와 연관된 이벤트 핸들러를 가져 오려면 알아야 할 사항-핸들러가 연결된 요소에주의하십시오!

예를 들어 다음을 사용하는 경우 :

$('.mySelector').bind('click', fn);

다음을 사용하여 이벤트 핸들러를 가져옵니다.

$('.mySelector').data('events');

그러나 당신이 사용하는 경우 :

$('body').on('click', '.mySelector', fn);

다음을 사용하여 이벤트 핸들러를 가져옵니다.

$('body').data('events');

(마지막 경우 관련 이벤트 객체는 selector = ". mySelector"를 갖습니다)


events어쨌든 문서화 나는 더 이상 1.9에서 작동 생각하지 않습니다
존 드보락에게

권리. 최신 버전의 데이터 대신 _data를 사용할 수 있습니다. 대답은 "이벤트 소유자"의 차이점에 대한 것이지, 구 버전이나 새 버전의 정확한 구문입니다. 다른 JQuery 버전의 정확한 구문에 대한 다른 게시물이 있습니다. 예를 들어 stackoverflow.com/questions/2518421/…
Alexander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.