代码之家  ›  专栏  ›  技术社区  ›  Chris Dutrow

jQuery获取元素中的鼠标位置

  •  156
  • Chris Dutrow  · 技术社区  · 15 年前

    我希望设计一个控件,用户可以在其中单击一个div,然后拖动鼠标,然后松开鼠标,以指示他们想要的东西有多长。(这是一个日历控件,因此用户将指示某个事件的时间长度)

    最好的方法是在父div上注册“mousedown”事件,然后在div上注册“mousemove”事件,直到触发“mouseup”事件。“mousedown”和“mouseup”事件将定义时间范围的开始和结束,当我跟踪“mousemove”事件时,我可以动态更改范围的大小,以便用户可以看到他们在做什么。我基于google日历中事件的创建方式。

    我遇到的问题是jQuery事件似乎只提供了整个页面的可靠鼠标坐标信息。有什么方法可以辨别出父元素的坐标是什么吗?

    编辑:

    这是我要做的事情的照片: alt text

    8 回复  |  直到 12 年前
        1
  •  301
  •   James Watkins    10 年前

    一种方法是使用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;
    });
    
        2
  •  16
  •   Sajjad Ashraf    13 年前

    获取单击相对于当前单击元素的位置
    使用此代码

    $("#specialElement").click(function(e){
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
    }); 
    
        3
  •  11
  •   Maarten Hartman    13 年前

    我使用这段代码,非常好:)

        <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>
    
        4
  •  9
  •   Paulo Bueno    10 年前

    @阿卜杜拉希姆的回答几乎是正确的。但我建议用下面的函数来代替(供以后参考):

    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);
                });
    
        5
  •  7
  •   Abdul Rahim Haddad    12 年前

    此解决方案支持所有主要浏览器,包括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;
        }
    
        6
  •  3
  •   Pointy    15 年前

    如果您将父元素设为“position:relative”,那么它将是您正在跟踪鼠标事件的对象的“offset parent”。因此jQuery“position()”将与此相对。

        7
  •  1
  •   Benn    9 年前

    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>
        8
  •  -1
  •   trincot    9 年前

    我建议:

    e.pageX - this.getBoundingClientRect().left