Chr*_*row 160 jquery mouseevent
我希望能够创建一个控件,用户可以在div中单击,然后拖动鼠标,然后放开鼠标以指示他们想要的内容.(这是用于日历控件,因此用户将指示特定事件的时间长度)
看起来最好的方法是在父div上注册一个"mousedown"事件,然后在div上注册一个"mousemove"事件,直到触发"mouseup"事件."mousedown"和"mouseup"事件将定义时间范围的开始和结束,当我按照"mousemove"事件时,我可以动态地更改范围的大小,以便用户可以看到他们正在做什么.我的基础是谷歌日历中如何创建事件.
我遇到的问题是jQuery事件似乎只提供参考整个页面的可靠鼠标坐标信息.有没有办法辨别参考父元素的坐标是什么?
编辑:
下面是我正在尝试做的事情的照片:

jba*_*all 300
一种方法是使用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;
});
Run Code Online (Sandbox Code Playgroud)
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)
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)
@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)
该解决方案支持包括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)