JQuery получить положение мыши внутри элемента - PullRequest
158 голосов
/ 22 ноября 2010

Я надеялся создать элемент управления, в котором пользователь мог бы щелкнуть внутри элемента div, затем перетащить мышь, затем отпустить кнопку мыши, чтобы указать, как долго они хотят, чтобы что-то было. (Это для элемента управления календаря, поэтому пользователь будет указывать длительность определенного события)

Похоже, что лучший способ сделать это - зарегистрировать событие "mousedown" в родительском div, которое, в свою очередь, регистрирует событие "mousemove" в div, пока не будет запущено событие "mouseup". События «mousedown» и «mouseup» будут определять начало и конец временного диапазона, и, следуя событиям «mousemove», я могу динамически изменять размер диапазона, чтобы пользователь мог видеть, что он делает. Я основал это на том, как события создаются в календаре Google.

Проблема, с которой я столкнулся, заключается в том, что событие jQuery, по-видимому, предоставляет только надежную информацию о координатах мыши в отношении всей страницы. Есть ли способ узнать, какие координаты относятся к родительскому элементу?

Edit:

Вот картина того, что я пытаюсь сделать: alt text

Ответы [ 8 ]

296 голосов
/ 22 ноября 2010

Один из способов - использовать метод jQuery offset для перевода координат event.pageX и event.pageY из события в положение мышипо отношению к родителю.Вот пример для дальнейшего использования:

$("#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;
});
15 голосов
/ 07 ноября 2012

Чтобы получить позицию клика относительно текущего кликаемого элемента
Используйте этот код

$("#specialElement").click(function(e){
    var x = e.pageX - this.offsetLeft;
    var y = e.pageY - this.offsetTop;
}); 
11 голосов
/ 20 августа 2012

Я использую этот кусок кода, это довольно приятно :)

    <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>
7 голосов
/ 28 октября 2015

@ AbdulRahim ответ почти правильный.Но я предлагаю функцию ниже в качестве замены (для дальнейшего использования):

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 голосов
/ 29 июля 2013

Это решение поддерживает все основные браузеры, включая IE.Это также заботится о прокрутке.Во-первых, он извлекает позицию элемента относительно страницы эффективно, без использования рекурсивной функции.Затем он получает x и y щелчка мыши относительно страницы и выполняет вычитание, чтобы получить ответ, который представляет собой позицию относительно элемента (например, элемент может быть изображением или элементом div):

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;
    }
3 голосов
/ 22 ноября 2010

Если вы сделаете свой родительский элемент «position: относительным», то он будет «родительским смещением» для материала, по которому вы отслеживаете события мыши.Таким образом, jQuery "position ()" будет относительным к этому.

1 голос
/ 11 мая 2017

Вот тот, который также дает вам процентное положение точки в случае, если вам это нужно.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>
0 голосов
/ 15 июля 2016

Я бы предложил это:

e.pageX - this.getBoundingClientRect().left
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...