jQuery在元素中获取鼠标位置

Chr*_*row 160 jquery mouseevent

我希望能够创建一个控件,用户可以在div中单击,然后拖动鼠标,然后放开鼠标以指示他们想要的内容.(这是用于日历控件,因此用户将指示特定事件的时间长度)

看起来最好的方法是在父div上注册一个"mousedown"事件,然后在div上注册一个"mousemove"事件,直到触发"mouseup"事件."mousedown"和"mouseup"事件将定义时间范围的开始和结束,当我按照"mousemove"事件时,我可以动态地更改范围的大小,以便用户可以看到他们正在做什么.我的基础是谷歌日历中如何创建事件.

我遇到的问题是jQuery事件似乎只提供参考整个页面的可靠鼠标坐标信息.有没有办法辨别参考父元素的坐标是什么?

编辑:

下面是我正在尝试做的事情的照片: 替代文字

jba*_*all 300

一种方法是使用jQuery offset方法将事件中的坐标event.pageXevent.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;
});
Run Code Online (Sandbox Code Playgroud)

  • 根据文档,[offset](http://api.jquery.com/offset/)不考虑"对于body元素上的边框,边距或填充集".我在发布的答案中没有遇到问题,但检查那些设置可能会有好处. (9认同)
  • 是的,如果父元素的布局不能/不应该改变,这是一个好主意! (2认同)
  • 这个答案是否考虑了填充/边框? (2认同)
  • 这不必工作.`offset()`也是相对的,所以如果父是其他元素的子元素,这将给出错误的结果.请改用`position()`. (2认同)

Saj*_*raf 16

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

$("#specialElement").click(function(e){
    var x = e.pageX - this.offsetLeft;
    var y = e.pageY - this.offsetTop;
}); 
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,您的回答对我有帮助,接受的答案没有。谢谢 :) 我实际使用的是这个,而不是:`var y = e.pageY - $(this).offset().top;` 但是你的回答让我走上了正确的道路。 (2认同)

Maa*_*man 11

我用这段代码,很不错:)

    <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>
Run Code Online (Sandbox Code Playgroud)


Pau*_*eno 9

@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);
            });
Run Code Online (Sandbox Code Playgroud)


Abd*_*dad 7

该解决方案支持包括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;
    }
Run Code Online (Sandbox Code Playgroud)