2014-11-09 2 views
2

연습으로 ebay.com 요소에 이벤트 리스너를 추가하려고합니다.이벤트 핸들러 이해

예상 결과 : 경고를 표시하고 웹 페이지가 다음 URL로 이동하지 못하도록합니다.

경고 : 경고가 표시되지만 다음 URL이 표시됩니다.

preventDefault, stopPropagtion 및 stopImmediatePropagation을 테스트하고있는 제품 페이지에서 흥미로운 것을 발견했습니다.

내가 어떤 조합을 사용하든 관계없이 아무 것도 작동하지 않는 것 같습니다.

$('#binBtn_btn').click(function(evt){ 
    alert('hi'); 
    evt.stopPropagation(); //or any other option. 
}); 

것은 내가 경고를받을 것입니다,하지만 난 전파를 결코 멈추지 않았다 것처럼 여전히 다음 페이지로 이동 -

기본 코드입니다.

이벤트 처리에 관한 많은 기사를 읽었지만 대답을 찾을 수 없습니다. 귀하의 도움을 많이 주시면 감사하겠습니다. 이 같은 evt.preventDefault()를 사용

+0

요소 모양은 어떻게됩니까? – PeterKA

+0

이것은 장바구니에 추가 버튼입니다. – alexunder

+1

JSFiddle에서 먼저 문제의 예제를 작성하는 것이 어떻습니까?임의의 사이트에 이벤트를 첨부하는 것은 JavaScript에서 이벤트를 이해하는 생산적인 방법이 아닙니다. – istos

답변

1

내 생각에 Button에는 자체 클릭 핸들러가 있으며 내 앞에 놓여 있습니다.

$('#binBtn_btn').data("events")은 실제로 click 이벤트가 있음을 보여줍니다. off을 사용하여 제거하십시오.

$('#binBtn_btn').off('click'); 

버튼을 클릭하면 제출하는 양식이 계속 표시됩니다. 이제는 페이지를 탐색하는 것뿐입니다. 버튼은 실제로는 a 태그입니다.

$('#binBtn_btn').click(function(e){ 
    alert('Gotcha!'); 
    e.preventDefault(); 
}); 

우리를 추가,의 우리가 자신의 핸들러를 제거하면 어떻게되는지 보자, 다음 자신의 일 ...

var existing = $('#binBtn_btn').data('events').click[0]; 
$('#binBtn_btn').off('click'); 
$('#binBtn_btn').click(function(e){ alert('foo'); e.stopImmediatePropagation(); return false; }); 
$('#binBtn_btn').data('events').click.push(existing); 

동일하지만, 단지의 기능을보고 다시 추가

var existing = $('#binBtn_btn').data('events').click[0].handler; 
$('#binBtn_btn').off('click'); 
$('#binBtn_btn').click(function(e){ alert('foo'); e.stopImmediatePropagation(); e.preventDefault(); }); 
$('#binBtn_btn').click(existing); 

으로 예상 (오히려 ... 직접 events.click 배열을 조정 제외) 클릭 처리기 이제 두 번째 처리기 인 처리기가 먼저 처리되지 않습니다. (e.preventDefault();이 아닌 e.preventDefault();을 추가했습니다.)

중단 점을 배치하고 위의 existing var를 보면 무엇을하는지 확인할 수 있습니다. 기능이 끝나면 실제로는 e.preventDefault();으로 전화를 걸음을 알 수 있습니다.

희망이 도움이됩니다.

+0

감사합니다. Dave! 너는 남자 야 !! – alexunder

+0

아직 명확하지 않은 부분이 있습니다. 아마도 나를 위해 그것을 분명히 할 수 있습니다. 내 이해에 따르면, e.stopImmediatePropagation(); 즉각적인 전달을 중지해야합니다. 그래서 근본적으로, 나의 경고가 발사되면, 그것은 다른 것을 발사한다고 가정하지 않는다. 설명을 도와 주시겠습니까? 감사합니다. . – alexunder

+0

@alex 걱정할 필요가 없습니다. 나는 이것이 클릭 핸들러의 주문 때문이라고 생각한다. 첫 번째 것은 당신이'stopImmediatePropagation();'에 도달하기 전에 해고됩니다. 내 대답을 테스트로 업데이트했습니다. 이는 이것이 사실 일 수 있음을 보여줍니다. 먼저 화재가 발생하면 기존 화재가 발생하지 않습니다 (귀하의 화재 후에 다시 추가하는 경우). –

1

시도 :

$('#binBtn_btn').click(function(evt){ 

    evt.preventDefault(); 
    alert('hi'); 

}); 

는 그 다음 다음 페이지로 이동하지 않습니다.