2012-10-03 7 views
57

Nella mia pagina HTML5, ho un div con mousemove evento come segue:HTML5 con jQuery - e.offsetX non è definito in Firefox

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

Funziona bene con Google Chrome. Ma in Firefox, entrambi stanno dando il valore undefined. L'ho verificato usando Firebug, ovvero, ho registrato l'oggetto e in console. Entrambi offsetX e offsetY sono trovati per essere undefined.

Quando ho cercato in Google, ci fosse una soluzione dicendo che dovrei usare layerX e layerY, se entrambi offsetX e offsetY sono indefiniti. Ma da Firebug, non ero in grado di trovarlo. E anche io avevo dato una prova come questa:

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

, ma che è anche dando undefined come valori.

Sto utilizzando il più recente jQuery - v1.8.2. E sto testando il mio Firefox v14.0.1

Qualche idea o suggerimento?


EDIT

Grazie a dystroy e vusan per avermi aiutato. La soluzione al problema di cui sopra è il seguente:

SOLUZIONE

$('#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

non so quale versione di Google Chrome stavi usando, ma sembra dare un oggetto non definito anche nella versione di Chrome v26. – cartbeforehorse

+0

@cartbeforehorse: sto utilizzando Chrome versione 26.0.1410.64 m. E funziona bene. Guardalo dal vivo: http://jsfiddle.net/EEftW/ –

+1

Sono sicuro di averlo risucchiato. Usando i dattiloscritti e i file di definizione jQuery StronglyTyped, sono stato indotto a credere che OffsetX/Y fossero parti di jquery. Non ho mai realizzato che fossero facoltativi e inclusi solo in determinati browser. Grazie per il tuo post, mi hai aiutato a trovare il problema in un caos di codice in espansione. – fabspro

risposta

19

Provare a utilizzare layerX e layerY per Firefox e offsetX per altro browser.

Se evento sparato con jQuery:

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

Se evento si verificava con javascript:

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

Grazie .. Ma quello che volevo è relativo a un contenitore ('# canvas'). pageX/Y sono relativi all'elemento '' - http://stackoverflow.com/questions/6073505/che-è-la differenza-dati-schermox-y-clientx-y-e-pagex-y –

+8

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

+4

Grazie ragazzi. Ho funzionato quando ho provato ciò che aveva suggerito @dystroy. Il codice è il seguente: 'se (e.offsetX == undefined) \t \t \t \t { \t \t \t \t \t xpos = e.pageX - $ ('# canvas') offset() a sinistra;.. \t \t \t \t \t ypos = e.pageY - $ ('# canvas'). Offset(). Top; \t \t \t \t} \t \t \t \t \t \t \t \t altro \t \t \t \t { \t \t \t \t \t xpos = e.offsetX; \t \t \t \t \t ypos = e.offsetY; \t \t \t \t} ' Grazie ancora ragazzi :) –

14

non li trovate, perché la sua nel originalEvent. prova: e.originalEvent.layerX e.originalEvent.layerY

Chi l'pageX e Pagey non stanno calcolando la stessa cosa. layerX è il sinistro dell'oggetto dal primo genitore relativo/assoluto. pageX è la sinistra dell'oggetto dalla pagina.

19

Utilizzare layerX e layerY in FF e offsetX e offsetY in tutti gli altri browser.

$('#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

Questa e l'altra risposta che specifica l'originaleEvent hanno bisogno di più upvotes. La "risposta migliore" fornisce una soluzione, ma questi sono più accurati in quanto layerX e layerY sono più equivalenti a offsetX e offsetY. Grazie :) –

0

Questo funziona bene in Firefox e altri.

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

Firefox in realtà fasupportMouseEvent.offsetX e MouseEvent.offsetY dopo il rilascio 39.0, che viene rilasciato in july 2015.

+0

Ma i valori per offsetX/Y in Firefox non sono gli stessi di quelli in Chrome. Hai bisogno di convertirli ma non so come. – scott

+0

Ricevo gli stessi valori con la versione più recente di entrambi i browser. –

+0

Ho Chrome 49 perché il mio Mac OS è 10.6.8. Non posso utilizzare una versione più recente di Chrome finché non aggiorno il mio sistema operativo (o il mio capo mi compra una nuova macchina). – scott