2010-02-16 6 views
4

마우스가 눌린 상태에서 (위로) 마우스 버튼의 상태가 변경되었는지 확인해야합니다. 이것은 W3C 모델과 심지어 오래된 넷스케이프 방식 (event.which)에서도 꽤 쉽습니다. 그러나 IE는 나에게 두통을줍니다. IE의 event.button이 비트 마스크라는 것을 알고 있지만 문제는이 비트 마스크에서 어떤 버튼을 눌렀는지 알 수 없다는 것입니다. 만약 IE가 나에게 event.button == 3을 준다면 사용자가 오른쪽 버튼이 이미 내려져있는 동안 또는 왼쪽 버튼이 이미 내려져있는 동안 사용자가 오른쪽 버튼을 누른 경우 사용자가 왼쪽 버튼을 눌렀는지 여부를 알 수 없다.IE event.button을 W3C event.button으로 변환하십시오.

한 번만이 문제를 해결하려면 깨진 IE 이벤트를 W3C 호환 이벤트로 변환하는 훌륭한 일반적인 솔루션을 찾고 있습니다. 어쩌면 누군가가 이미 그것을했고 공유하기를 원했을 것입니까?

답변

3
IMO

(및 quirksmode's)는, IE의 bitmasking는 W3C 버전보다 낫다. 그것은 약간 더 많은 유연성을 제공합니다. 둘 다 (누를 수있는 총 버튼과 최신 버튼 누름) 더 좋을 것입니다.

내가하고있는 것을 이미 수행하고있는 라이브러리 나 스크립트를 모르겠다. 대부분의 개발자는 콤보 클릭에 특정 동작을 적용하고 싶지 않으면 콤보 클릭을 무시할 것이라고 생각한다. 또한 다소 까다 롭습니다. 전체 문서에 대해 onmousedownonmouseup을 모두 감지하고 마우스 버튼의 상태를 기록해야합니다. 그런 다음 마술을하기 원하는 요소에서 이전 마우스 상태를 빼십시오. 뭔가 (테스트 한) :

if (document.attachEvent) 
{ 
    (function() 
    { 
     var mState = 0; 
     document.documentElement.attachEvent("onmousedown", function() 
     { 
      mState += event.button; 
     }); 
     document.documentElement.attachEvent("onmouseup", function() 
     { 
      mState -= event.button; 
     }); 
     document.getElementById("jim").attachEvent("onmousedown", function() 
     { 
      var realButton = event.button - mState; 

      alert(realButton); 
      // Your code here 
     }); 
    })(); 
} 

물론,이 스크립트에는 잘못 될 수있는 내용 만 있습니다. 예를 들어, 나의 예제에서는 실제 버튼 상태와 함께 팝업 창이 나타납니다. 해당 경고 대화 상자가 올라간 상태에서 버튼을 놓으면 문서가 마우스 업을 감지하지 못해 모든 것을 버리게됩니다. 마찬가지로 이 documentElement의 이벤트 핸들러까지 전파를 중지하는 다른 요소에 대한 mouseup 또는 mousedown 이벤트는 중단 될 수 있습니다.

내 조언을 원한다면 "올바른"마우스 버튼을 클릭하거나 모두 무시하고 콤보 마우스를 클릭하여 메시지를 표시하십시오. 이러한 옵션 중 하나가 해킹 방법보다 낫습니다.

+0

비트 마스킹이 좋지 않습니다. 각 버튼은 이미 자체 마우스 이벤트를 전송하기 때문에 하나의 이벤트에서 마우스 이벤트를 동시에 감지 할 필요가 없습니다. 그래서 IE에서는 중복 이벤트가 발생합니다. 먼저 LEFT 버튼을 눌렀다가 LEFT + RIGHT 버튼을 눌렀다는 것을 알려주지 만 LEFT 버튼을 놓지 않고 RIGHT 버튼을 누르는 것뿐입니다. 그것은 큰 차이를 만듭니다. W3C 모델이나 오래된 넷스케이프 모델에서도 완벽하게 작동합니다. 그러나 IE에서는 엉덩이가 고통 스럽습니다. – kayahr

+0

@ kayahr : 불행히도 랩톱에서 작업 중이며 테스트 할 세 번째 마우스 버튼이 없습니다. 하나의 버튼을 누르면 다른 하나는 제안하는 동작을 유발합니다. 정확히 같은 시간에 *를 두 번 누르면 가운데 클릭이 트리거됩니다. 나는 항상 다른 두 버튼에 대해서도 마찬가지라고 생각했습니다. 정확히 같은 시간에 왼쪽 + 가운데를 누르면 버튼 값 5로 이벤트 하나가 트리거됩니다. 비트 마스킹은 수행하려는 작업에 도움이되지 않지만 유연성을 제공한다고 주장합니다. 전체적으로. 예를 들어 웹 앱이 콤보 버튼 클릭에 대한 단축키를 제공 할 수 있습니다. –

3

. 그것은 다음과 같은 I 유용하고 정확한 발견하기 전에 사용하고있는 마우스 버튼 감지에 대한 섹션을 가지고 :

되는 마우스 버튼을 인식 할 브라우저에 독립적 인 방법은 없지만하는 모든 브라우저 조사한 결과, 매우 가까이에 올 수 있습니다. 다음 시험은 오페라 7을 제외한 모든 브라우저 (그것은 오페라 7 의 오른쪽 와 마우스 가운데 버튼을 혼합하지만, 오페라 7은 꽤 오래, 몇 버전이 있었다 위해 일하는 곳 바로 중간 버튼 심지어 작동하고 심지어 다음 사용자가 애매한 옵션을 설정 한 경우에만, 그래서 당신은 정말로 상관 없어.) 또한 IE의 여러 마우스 버튼의 동시 클릭을 올바르게 처리하지 않습니다. 이를 수행하려면 응용 프로그램에서 버튼이 이전에 마우스가 꽂혀 있던 이벤트에있는 것으로보고 된 것을 추적해야합니다. 따라서 은 어느 것이 추가되었는지 파악할 수 있습니다. + 오른쪽 또는 왼쪽 + 중간 왼쪽처럼 당신이 콤보 클릭을 감지 할 수 있기 때문에

if (event.which == null) 
    /* IE case */ 
    button= (event.button < 2) ? "LEFT" : 
      ((event.button == 4) ? "MIDDLE" : "RIGHT"); 
else 
    /* All others */ 
    button= (event.which < 2) ? "LEFT" : 
      ((event.which == 2) ? "MIDDLE" : "RIGHT"); 
+0

한 번의 마우스 클릭만으로도 충분합니다. 그러나 텍스트는 이미 동시 클릭으로는 작동하지 않는다고 말합니다. 그리고 텍스트에 언급 된 마우스 버튼의 추적은 내가 찾고있는 것입니다. – kayahr

+0

글쎄, 그 해결 방법을 제안 : "어떤 응용 프로그램 단추가 이전 mousedown 이벤트에서 다운되었다고보고 추적하여 어떤 항목이 추가되었는지 파악할 수 있어야합니다." –

+0

알아. 나는 이것이 실제처럼 사소한 것이 아니기 때문에 실제 코드를 기대했다. Andy E는 이미 일부 코드를 제공했지만 일부 이벤트가 오지 않을 때 코드가 쉽게 혼란 스럽습니다 (IE에서 특히 자주 발생합니다 (한 번의 마우스를 내리고 두 번의 마우스를 이벤트로 보내는 두 번 클릭을 생각하십시오). .)) – kayahr