2009-09-28 5 views
9

내가 jQuery를에 live() 기능의 이상한 행동을 발견했습니다 : "라이브"에 마우스 오른쪽 버튼으로 클릭 할 때까지 벌금과 멋쟁이의jQuery를이에 대한 발사를 ('클릭') 살 마우스 오른쪽 단추로 클릭

<a href="#" id="normal">normal</a> 
<a href="#" id="live">live</a> 

$('#normal').click(clickHandler); 
$('#live').live('click', clickHandler); 

function clickHandler() { 
    alert("Clicked"); 
    return false; 
} 

을 링크를 클릭하면 처리기가 실행되고 컨텍스트 메뉴가 표시되지 않습니다. 이벤트 핸들러가 "정상"링크에서 예상대로 실행되지 않습니다.

나는이에 핸들러를 변경하여 해결 할 수있었습니다 :

function clickHandler(e) { 
    if (e.button != 0) return true; 
    // normal handler code here 
    return false; 
} 

하지만 그 모든 이벤트 핸들러에 그것을 추가 할 필요가 정말 짜증나. 이벤트 처리기를 일반 클릭 핸들러 처럼만 사게하는 더 좋은 방법이 있습니까?

+1

앞으로 어떻게 질문하나요? – PetersenDidIt

+0

여기에 귀하의 해결 방법을 보게되어 매우 기뻤습니다. 즉시이 도구를 내 응용 프로그램에서 시도해 보았습니다. 현재 마우스 오른쪽 버튼으로 클릭하고있는 링크를 잡아서 무시할 수는 있지만 마우스 오른쪽 버튼 클릭 컨텍스트 메뉴가 표시되지 않습니다. 이들. 또한 마우스 가운데 버튼 클릭 (새 탭에서 열림)도 작동하지 않습니다. 그러나 적어도 핸들러는 일찍 돌아올 수 있습니다! – Funka

+0

사실, 마우스 오른쪽 버튼을 반복해서 빠르게 누르면, 가끔 상황에 맞는 메뉴가 나타나기도합니다. 흠. – Funka

답변

9

그것은 known issue입니다 : 파이어 폭스의 요소에 대한 클릭 이벤트가 발생하지 않는 것처럼

그것은 보이는 마우스 오른쪽 단추로 클릭 그것은 mousedown과 mouseup에를 발생하지만,. 그러나 에게 보내면 document에 클릭 이벤트가 발생합니다! .live은 문서 수준의 이벤트를 캐치하기 때문에 요소의 클릭 이벤트도 이긴하지만 입니다. 마우스 업과 같은 이벤트를 사용하는 경우 p 요소와 document 요소 모두 이벤트가 표시됩니다.

해결 방법은 현재 할 수있는 최선의 방법입니다. 그것은 파이어 폭스에만 영향을 미치는 것으로 보입니다 (실제로 파이어 폭스에서는 jQuery가 아닌 버그라고 생각합니다).

어제 질문 함 this question도 참조하십시오.

0

이것은 live이 구현 된 방법의 불행한 결과입니다. 실제로는 이벤트 버블 링을 사용하므로 앵커 요소의 클릭 이벤트에 바인딩하지 않고 문서의 클릭 이벤트에 바인딩합니다.

+0

는 아니, 파이어 폭스 마우스 오른쪽 버튼을 클릭 거품 방식에 결함이있다. http://unixpapa.com/js/mouse.html –

+0

@crescentfresh를 참조하십시오 : 나는 매킨토시 때문에, "매킨토시 사파리의 버전, 물론 말한다 기사에 배치 얼마나 믿음이 확실하지 않다 이러한 문제에 면역 단 하나의 마우스 버튼 만 "- TBL이 웹을 발명하기 전 언젠가는 단일 버튼 마우스로 Mac을 사용했습니다. – NickFitz

+0

@NickFitz : touché. –

4

해결책을 찾았습니다. live() 코드 자체를 "수정"합니다.

2989 줄 주변의 jQuery 1.3.2의 근원이없는 곳에서 liveHandler()이라는 함수가 있습니다. 한 줄을 추가하는 코드를 수정 :

2989: function liveHandler(event) { 
2990:  if (event.type == 'click' && event.button != 0) return true; 

이 마우스 왼쪽 버튼을하지만 아무것도 발사에서 클릭 이벤트를 중지합니다. 당신이 원한다면, "rightclick"이벤트를 허용하도록 코드를 아주 쉽게 수정할 수 있습니다.하지만 이것은 저에게 달려 있습니다.

3

당신은 실제로으로 다시 작성할 수 있습니다 :

function reattachEvents(){ 
    $(element).unbind('click').click(function(){ 
     //do something 
    }); 
} 

하고, 새로운 DOM 요소를 추가 할 때 호출, 그것은 예상 된 결과 (오른쪽 클릭 이벤트에 대한 더 발사)을 가져야한다.

+1

네,하지만 그건'live()'의 목적을 무효로하지 않습니까? – nickf

+0

사실, 그러나 사는 당신이 눌러 진 버튼을 감지하면 해결할 수 있습니다 정상 클릭() 다르게 작동,하지만 당신이 사용 된 브라우저 정확히 알 필요 (IE의 모든 최신 버전 및 이전 버전에서 다르게 작용 (클릭) 다른 브라우저는 '올바른'방식으로 작동합니다.) 당분간 이것은 훨씬 더 우아한 해결책입니다. – SeanJA

0

나는 mousedown 이벤트를 사용하여이를 해결했습니다. 내 상황에서는 마우스 클릭과 클릭의 구분이 중요하지 않았습니다.

관련 문제