48 votes

de l'événement.offsetX dans Firefox

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script language="javascript">
function main(){
    var canvas = document.getElementById("canvas");
    canvas.addEventListener("mousemove", function(e){
        if (!e) e = window.event;
        var ctx = canvas.getContext("2d");

        var x = e.offsetX;
        var y = e.offsetY;

        ctx.fillRect(x, y, 1, 1);
    });
}
</script>
</head>
<body onload="main();">
<div style="width: 800px; height: 600px; -webkit-transform: scale(0.75,0.75); -moz-transform: scale(0.75,0.75)">
    <canvas id="canvas" width="400px" height="400px" style="background-color: #cccccc;"></canvas>
</div>
</body>
</html>

Veuillez considérer ce qui précède rapide et sale exemple. Merci de noter que ma toile est contenue par un div ayant une transformation d'échelle appliqué. Le code ci-dessus fonctionne parfaitement sur n'importe quel navigateur basé sur webkit. Tout en déplaçant la souris, elle attire les points sur la toile. Malheureusement, il n'est pas dans Firefox comme son modèle d'événement ne prend pas en charge la offsetX / Y des propriétés. Comment puis-je transformer les coordonnées de la souris à partir de (peut-être) de l'événement.clientX (qui est pris en charge dans firefox aussi) en toile coordonnées relatives tenant compte de toile de position, de transformer, etc? Merci, Luca.

78voto

danp Points 4502

À partir d'un JQuery bug tracker page - une belle polyfill est ceci:

var offX  = (e.offsetX || e.clientX - $(e.target).offset().left);

.. où e est l'événement retourné à partir d'un événement jquery. Évidemment, seulement si vous avez Jquery déjà sur votre projet, sinon vous allez avoir à faire l' offset() trucs manuellement.

36voto

Musa Points 50000

Essayez layerX, layerY

var x = e.offsetX==undefined?e.layerX:e.offsetX;
var y = e.offsetY==undefined?e.layerY:e.offsetY;

VIOLON

21voto

Malheureusement, aucune solution n'a fonctionné pour moi.

J'ai trouvé une bonne mise en œuvre ici:

var target  = e.target || e.srcElement,
              rect    = target.getBoundingClientRect(),
              offsetX = e.clientX - rect.left,
              ffsetY  = e.clientY - rect.top;

e.offsetX   = offsetX;
e.offsetY   = offsetY;

15voto

Tom Fredian Points 79

Malheureusement offsetX et layerX ne sont pas exactement les mêmes que offsetX est le décalage à l'intérieur de l'élément en cours mais layerX est le décalage à partir de la page. Ci-dessous est une solution que j'utilise actuellement pour cette:

function fixEvent(e) {
    if (! e.hasOwnProperty('offsetX')) {
        var curleft = curtop = 0;
        if (e.offsetParent) {
           var obj=e;
           do {
              curleft += obj.offsetLeft;
              curtop += obj.offsetTop;
           } while (obj = obj.offsetParent);
        }
        e.offsetX=e.layerX-curleft;
        e.offsetY=e.layerY-curtop;
    }
    return e;
}

11voto

Mark Whitaker Points 1654

Il y a un bug dans Musa la solution: pensez à ce qui se passe si e.offsetX === 0 et e.layerX === undefined...

var x = e.offsetX || e.layerX; // x is now undefined!

Une version plus robuste est comme suit:

var x = e.hasOwnProperty('offsetX') ? e.offsetX : e.layerX;
var y = e.hasOwnProperty('offsetY') ? e.offsetY : e.layerY;

Ou, parce que nous pouvons supposer que si offsetX est défini, offsetY trop:

var hasOffset = e.hasOwnProperty('offsetX'),
    x         = hasOffset ? e.offsetX : e.layerX,
    y         = hasOffset ? e.offsetY : e.layerY;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X