2015-07-31 11 views
5

Im rozwija HTML5 Player. Działa poprawnie we wszystkich przeglądarkach, z wyjątkiem Safari dla osx. (Ten odtwarzacz powinien działać tylko w przeglądarce na komputerze).mouseMove wydarzenie zwrotna nie pokazano, który przycisk myszy jest naciśnięty safari

Mam problem z poszukiwania Bar e pasek głośności.

Zasadniczo jest to slider, ale realizowane z div i rzeczy. Zrobiłem co następuje.

Zarejestrowana wywołania zwrotnego na elemencie do imprezy „” mousemove. Po wywołaniu wywołań zwrotnych sprawdzam zdarzenie pod kątem przycisków. Podczas korzystania z safari ten atrybut jest zawsze "niezdefiniowany".

Kod jest bardzo prosty:

this.controls.$seekBar.on('mousemove', (function(_this){ 
      return function(event){ 
       if (event.buttons == 1) { 
        // Do some stuff 
       } 
      } 
     })(this)) 
      .on('mousedown', (function(_this){ 
       return function(event){ 
        if (event.buttons == 1) { 
         // Do some stuff 
        } 
       } 
      })(this)); 

Ponieważ jest to plugin jQuery, trzeba użyć zamknięć przekazać kontekst wtyczek do wywołania zwrotnego, ale to nie jest problem. Przetestowałem bez bycia wtyczką jQuery i pojawia się ten sam błąd. Obiekt

Zdarzenie generowane w safari: obiekt

altKey: false 
bubbles: true 
button: 0 
buttons: undefined 
cancelable: true 
clientX: 529 
clientY: 674 
ctrlKey: false 
currentTarget: div#seekBar1.vjs-progress-holder vjs-slider 
data: undefined 
delegateTarget: div#seekBar1.vjs-progress-holder vjs-slider 
eventPhase: 2 
fromElement: null 
handleObj: Object 
isDefaultPrevented: function bb() {return!1;} 
jQuery111103980477461591363: true 
metaKey: false 
offsetX: 150 
offsetY: 8 
originalEvent: MouseEvent 
pageX: 529 
pageY: 781 
relatedTarget: null 
screenX: 530 
screenY: 759 
shiftKey: false 
target: div#seekBar1.vjs-progress-holder vjs-slider 
timeStamp: 1438352150671 
toElement: div#seekBar1.vjs-progress-holder vjs-slider 
type: "mousedown" 
view: Window 
which: 1 
__proto__: Object 

Zdarzenie generowane w firefox:

altKey: false 
bubbles: true 
button: 0 
buttons: 1 
cancelable: true 
clientX: 587 
clientY: 563 
ctrlKey: false 
currentTarget: div#seekBar1.vjs-progress-holder.vjs-slider 
data: undefined 
delegateTarget: div#seekBar1.vjs-progress-holder.vjs-slider 
eventPhase: 3 
fromElement: undefined 
handleObj: Object { type="mousedown", origType="mousedown", guid=36, more...} 
jQuery111105827101769842828: true 
metaKey: false 
offsetX: undefined 
offsetY: undefined 
originalEvent: mousedown clientX=587, clientY=563 
pageX: 587 
pageY: 780 
relatedTarget: null 
screenX: 587 
screenY: 665 
shiftKey: false 
target: div#progressBar1.vjs-play-progress 
timeStamp: 1175114810 
toElement: undefined 
type: "mousedown" 
view: Window 561 
which: 1 
isDefaultPrevented: bb() 
isImmediatePropagationStopped: bb() 
isPropagationStopped: bb() 
preventDefault: function() 
stopImmediatePropagation: function() 
stopPropagation: function() 
__proto__: Object { isDefaultPrevented=bb(), isPropagationStopped=bb(), isImmediatePropagationStopped=bb(), more..  
+0

'event.which' nieruchomość jest znormalizowana w przypadku JQ, więc myślę, użyj go ... –

+0

używałem event.buttons aby sprawdzić, które myszy jest wciśnięty. Event.which zawsze jest 1 na safari, nawet gdy nie klikam przycisku myszy. – dvtelles

+0

To exatly cel '' własności which' https://api.jquery.com/event.which/ Event.which jest zawsze 1 w safari' To nie powinno! Może to być błąd, ale chyba nie EDIT: OK, myślałem o wydarzeniu, które wewnątrz mousedown, a nie mousemove, moje złe! –

Odpowiedz

3

Możesz po prostu zmodyfikować kod jak poniżej:

this.controls.$seekBar.on('mousemove', (function(_this){ 
     return function(event){ 
      var buttons = (e.buttons === undefined ? e.which : e.buttons); 
      if (buttons == 1) { 
       // Do some stuff 
      } 
     } 
    })(this)) 
     .on('mousedown', (function(_this){ 
      return function(event){ 
       var buttons = (e.buttons === undefined ? e.which : e.buttons); 
       if (event.buttons == 1) { 
        // Do some stuff 
       } 
      } 
     })(this)); 

Będzie prace dla wszystkie potrzebne przeglądarki.

+0

Ta odpowiedź rozwiązała mój podobny problem. Dzięki. :) –

+0

To powinno być oznaczone jako wybrana odpowiedź –

Powiązane problemy