2012-10-03 12 views
57

W mojej strony HTML5, Mam div z mousemove przypadku następująco:HTML5 z jQuery - e.offsetX jest niezdefiniowane w Firefoksie

$('#canvas').mousemove(function(e){ 
    xpos = e.offsetX; 
    ypos = e.offsetY; 
    $('#mouse').html("X : " + xpos + " ; Y : " + ypos); 
}); 

Współpracuje z Google Chrome. Ale w Firefoksie oba nadają wartość undefined. Sprawdziłem to za pomocą Firebug, czyli zalogowałem obiekt e do konsoli. Zarówno offsetX, jak iuznano za undefined.

Kiedy szukałem w Google, nie było rozwiązanie mówiąc powinienem użyć layerX i layerY, jeśli zarówno offsetX i offsetY są niezdefiniowane. Ale od Firebuga nie mogłem go znaleźć. I nawet dałem mu spróbować tak:

xpos = (e.offsetX==undefined)?e.layerX:e.offsetX; 
ypos = (e.offsetY==undefined)?e.layerY:e.offsetY; 

Ale to również daje undefined jako wartości.

Używam najnowszej wersji jQuery - v1.8.2. I testuję w Firefoksie v1.0.0.1

Wszelkie pomysły i sugestie?


EDIT

Dzięki dystroy i vusan za pomoc. Rozwiązaniem powyższego problemu jest następujący:

ROZWIĄZANIE

$('#canvas').mousemove(function(e){ 
    $('#cursor').show(); 
    if(e.offsetX==undefined) // this works for Firefox 
    { 
    xpos = e.pageX-$('#canvas').offset().left; 
    ypos = e.pageY-$('#canvas').offset().top; 
    }    
    else      // works in Google Chrome 
    { 
    xpos = e.offsetX; 
    ypos = e.offsetY; 
    } 
    $('#mouse').html("X : " + xpos + " ; Y : " + ypos); 
}); 
+0

Nie wiesz, której wersji Google Chrome używasz, ale wydaje się, że dałeś również niezdefiniowany obiekt w wersji Chrome 26. – cartbeforehorse

+0

@cartbeforehorse: używam Chrome w wersji 26.0.1410.64 m. I działa dobrze. Zobacz go na żywo: http://jsfiddle.net/EEftW/ –

+1

Na pewno zostałem wessany. Używając plików definicji maszynopisów i StronglyTyped jQuery, byłem przekonany, że OffsetX/Y są częściami jquery. Nigdy nie zdawałem sobie sprawy, że są one opcjonalne i są dostępne tylko w niektórych przeglądarkach. Dzięki za twój post, pomogłeś mi znaleźć problem w rozległym bałaganie kodu. – fabspro

Odpowiedz

19

Spróbuj użyć layerX i layerY dla Firefoksa i offsetX dla innej przeglądarki.

Jeśli wydarzenie zwolniony z jQuery:

xpos = e.offsetX === undefined ? e.originalEvent.layerX : e.offsetX; 
ypos = e.offsetY === undefined ? e.originalEvent.layerY : e.offsetY; 

Jeśli wydarzenie zwolniony z javascript:

xpos = e.offsetX==undefined?e.layerX:e.offsetX; 
ypos = e.offsetY==undefined?e.layerY:e.offsetY; 
+2

Dzięki .. Ale to, czego chciałem, dotyczy kontenera ("# canvas"). pageX/Y są względne w stosunku do elementu '' - http://stackoverflow.com/questions/6073505/what-is-the-difference-between-screenx-y-clientx-y-and-pagex-y –

+8

Użyj ' var xInCanvas = e.pageX- $ canvas.offset(). left; ' –

+4

Dzięki chłopaki. Pracowałem, kiedy próbowałem tego, co sugerował @dystroy. Kod jest w następujący sposób: 'if (e.offsetX == niezdefiniowany) \t \t \t \t { \t \t \t \t \t xpos = e.pageX - $ ('# płótno') offsetu() z lewej;.. \t \t \t \t \t ypos = e.pageY - $ ("# canvas"). Offset(). Top; \t \t \t \t} \t \t \t \t \t \t \t \t inny \t \t \t \t { \t \t \t \t \t xpos = e.offsetX; \t \t \t \t \t ypos = e.offsetY; \t \t \t \t} 'znowu Dzięki chłopaki :) –

14

Nie znalazłeś ich, bo jej w originalEvent. try: e.originalEvent.layerX e.originalEvent.layerY

O pageX i pageY nie są obliczenia samo. layerX jest lewą stroną obiektu od pierwszego rodzica względnego/absolutnego. pageX jest po lewej stronie obiektu ze strony.

19

Użyj layerX i layerY w FF i offsetX i offsetY we wszystkich innych przeglądarkach.

$('#canvas').mousemove(function(e){ 
    xpos = e.offsetX === undefined ? e.originalEvent.layerX : e.offsetX; 
    ypos = e.offsetY === undefined ? e.originalEvent.layerY : e.offsetY; 

    $('#mouse').html("X : " + xpos + " ; Y : " + ypos); 
}); 
+1

Ta i druga odpowiedź określająca originalEvent potrzebują więcej upvotes. "Najlepsza odpowiedź" zapewnia rozwiązanie, ale są one dokładniejsze, ponieważ layerX i layerY są bardziej równoważne offsetX i offsetY. Dzięki :) –

0

Działa to dobrze w firefox i innych.

var offsetRequired = (e.offsetX || e.pageX - $(e.target).offset().left); 
0

Firefox rzeczywiście robisupportMouseEvent.offsetX i MouseEvent.offsetY po zwolnieniu 39,0, który jest uwalniany w july 2015.

+0

Ale wartości przesunięciaX/Y w Firefoksie nie są takie same jak w Chrome. Musisz je przekonwertować, ale nie wiesz jak. – scott

+0

Otrzymuję te same wartości w najnowszej wersji obu przeglądarek. –

+0

Mam Chrome 49, ponieważ mój Mac OS to 10.6.8. Nie mogę używać nowszej wersji przeglądarki Chrome, dopóki nie zaktualizuję systemu operacyjnego (lub mój szef kupi mi nową maszynę). – scott

Powiązane problemy