jQuery obtenir la position de la souris dans un élément

j'espérais de l'artisanat de contrôle où un utilisateur peut cliquer à l'intérieur d'un div, puis faites glisser la souris, puis relâchez la souris pour indiquer combien de temps ils veulent quelque chose de l'être. (Ceci est pour un contrôle de calendrier, de sorte que l'utilisateur indiquera la longueur, dans le temps, d'un certain événement)

il semble que la meilleure façon de faire cela serait d'enregistrer un événement" mousedown "sur le div parent qui à son tour enregistre un événement "mousemove" sur le div jusqu'à un événement" mouseup" est déclenchée. Les événements" mousedown "et" mouseup "définiront le début et la fin de la plage de temps et comme je suis les événements" mousemove", je peux dynamiquement changer la taille de la gamme de sorte que l'utilisateur peut voir ce qu'ils font. J'ai basé cela sur la façon dont les événements sont créés dans Google calendar.

le problème que j'ai est que l'événement jQuery semble ne fournir que des informations fiables de coordonnées de souris en référence à la page entière. Est-il possible de discerner ce que l' les coordonnées se rapportent à l'élément parent?

Edit:

Voici une image de ce que j'essaie de faire: alt text

151
demandé sur GEOCHET 2010-11-22 22:58:04

8 réponses

une façon est d'utiliser la méthode jQuery offset pour traduire les coordonnées event.pageX et event.pageY de l'événement dans une position de souris relative au parent. Voici un exemple de référence future:

$("#something").click(function(e){
   var parentOffset = $(this).parent().offset(); 
   //or $(this).offset(); if you really just want the current element's offset
   var relX = e.pageX - parentOffset.left;
   var relY = e.pageY - parentOffset.top;
});
286
répondu jball 2015-11-08 04:35:12

pour obtenir la position du clic par rapport à l'élément courant cliqué

Utilisez ce code

$("#specialElement").click(function(e){
    var x = e.pageX - this.offsetLeft;
    var y = e.pageY - this.offsetTop;
}); 
13
répondu Sajjad Ashraf 2012-11-07 18:17:48

j'utilise ce morceau de code, son assez agréable :)

    <script language="javascript" src="http://code.jquery.com/jquery-1.4.1.js" type="text/javascript"></script>
<script language="javascript">
$(document).ready(function(){
    $(".div_container").mousemove(function(e){
        var parentOffset = $(this).parent().offset();
        var relativeXPosition = (e.pageX - parentOffset.left); //offset -> method allows you to retrieve the current position of an element 'relative' to the document
        var relativeYPosition = (e.pageY - parentOffset.top);
        $("#header2").html("<p><strong>X-Position: </strong>"+relativeXPosition+" | <strong>Y-Position: </strong>"+relativeYPosition+"</p>")
    }).mouseout(function(){
        $("#header2").html("<p><strong>X-Position: </strong>"+relativeXPosition+" | <strong>Y-Position: </strong>"+relativeYPosition+"</p>")
    });
});
</script>
11
répondu Maarten Hartman 2012-08-20 09:55:37

cette solution prend en charge tous les principaux navigateurs, y compris IE. Il prend également soin de défilement. Tout d'abord, il récupère la position de l'élément par rapport à la page efficacement, et sans utiliser une fonction récursive. Puis il obtient les x et y du clic de souris relatif à la page et fait la soustraction pour obtenir la réponse qui est la position relative à l'élément (l'élément peut être une image ou div par exemple):

function getXY(evt) {
    var element = document.getElementById('elementId');  //replace elementId with your element's Id.
    var rect = element.getBoundingClientRect();
    var scrollTop = document.documentElement.scrollTop?
                    document.documentElement.scrollTop:document.body.scrollTop;
    var scrollLeft = document.documentElement.scrollLeft?                   
                    document.documentElement.scrollLeft:document.body.scrollLeft;
    var elementLeft = rect.left+scrollLeft;  
    var elementTop = rect.top+scrollTop;

        if (document.all){ //detects using IE   
            x = event.clientX+scrollLeft-elementLeft; //event not evt because of IE
            y = event.clientY+scrollTop-elementTop;
        }
        else{
            x = evt.pageX-elementLeft;
            y = evt.pageY-elementTop;
    }
7
répondu Abdul Rahim Haddad 2013-07-29 19:11:50

@AbdulRahim la réponse est presque correcte. Mais je suggère la fonction ci-dessous comme substitut (pour une autre référence):

function getXY(evt, element) {
                var rect = element.getBoundingClientRect();
                var scrollTop = document.documentElement.scrollTop?
                                document.documentElement.scrollTop:document.body.scrollTop;
                var scrollLeft = document.documentElement.scrollLeft?                   
                                document.documentElement.scrollLeft:document.body.scrollLeft;
                var elementLeft = rect.left+scrollLeft;  
                var elementTop = rect.top+scrollTop;

                x = evt.pageX-elementLeft;
                y = evt.pageY-elementTop;

                return {x:x, y:y};
            }




            $('#main-canvas').mousemove(function(e){
                var m=getXY(e, this);
                console.log(m.x, m.y);
            });
7
répondu Paulo Bueno 2015-10-27 21:41:01

si vous faites que votre élément parent soit" position: relative", alors ce sera le" parent offset " pour le truc sur lequel vous suivez les évènements de la souris. Ainsi, la "position ()" de jQuery sera relative à cela.

3
répondu Pointy 2010-11-22 20:03:16

voici un qui vous donne également la position du point en pourcentage dans le cas où vous en avez besoin. https://jsfiddle.net/Themezly/2etbhw01 /

function ThzhotspotPosition(evt, el, hotspotsize, percent) {
  var left = el.offset().left;
  var top = el.offset().top;
  var hotspot = hotspotsize ? hotspotsize : 0;
  if (percent) {
    x = (evt.pageX - left - (hotspot / 2)) / el.outerWidth() * 100 + '%';
    y = (evt.pageY - top - (hotspot / 2)) / el.outerHeight() * 100 + '%';
  } else {
    x = (evt.pageX - left - (hotspot / 2));
    y = (evt.pageY - top - (hotspot / 2));
  }

  return {
    x: x,
    y: y
  };
}



$(function() {

  $('.box').click(function(e) {

    var hp = ThzhotspotPosition(e, $(this), 20, true); // true = percent | false or no attr = px

    var hotspot = $('<div class="hotspot">').css({
      left: hp.x,
      top: hp.y,
    });
    $(this).append(hotspot);
    $("span").text("X: " + hp.x + ", Y: " + hp.y);
  });


});
.box {
  width: 400px;
  height: 400px;
  background: #efefef;
  margin: 20px;
  padding: 20px;
  position: relative;
  top: 20px;
  left: 20px;
}

.hotspot {
  position: absolute;
  left: 0;
  top: 0;
  height: 20px;
  width: 20px;
  background: green;
  border-radius: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="box">
  <p>Hotspot position is at: <span></span></p>
</div>
1
répondu Benn 2017-05-11 09:30:27

je suggérerais ceci:

e.pageX - this.getBoundingClientRect().left
-1
répondu Eduard 2016-07-15 20:03:25