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);
});
non so quale versione di Google Chrome stavi usando, ma sembra dare un oggetto non definito anche nella versione di Chrome v26. – cartbeforehorse
@cartbeforehorse: sto utilizzando Chrome versione 26.0.1410.64 m. E funziona bene. Guardalo dal vivo: http://jsfiddle.net/EEftW/ –
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