在过去的几天里,另一个问题一直困扰着我。正如您可能从我的其他问题中看到的那样,我正在创建一些思维导图软件。所以(非常简化)我有两个div。一个是页面上的正方形,另一个在div内部,大约是可拖动的10倍。这样可以将对象放置在屏幕上,然后稍微移动到侧面,同时添加另一个对象等。我通过创建外部div可滚动来完成此操作。
我遇到的问题与java脚本中的鼠标位置有关。如果我将鼠标放在div中的任何位置它将不正确,因为我将内部div的大小减半到顶部和左侧(因此用户有效地看着画布的中间并且可以按照他们喜欢的任何方式) 。我已经尝试了数十种不同的鼠标坐标功能,但这些功能似乎都不起作用。我在网络上找到的一个应该是跨浏览器的例子是:
function getMouse(e) {
var posx;
var posy;
if (!e) var e = window.event;
if (e.pageX || e.pageY) {
posx = e.pageX;
posy = e.pageY;
}
else if (e.clientX || e.clientY) {
posx = e.clientX + document.body.scrollLeft + document.getElementById("canvas").scrollLeft;
posy = e.clientY + document.body.scrollTop + document.getElementById("canvas").scrollTop;
}
} //getMouse
但即使这样也行不通。我几乎可以肯定错误是因为我的内部div是可拖动的。希望我试图解释一下,但如果我没有here is a very simple jsfiddle试图证明我的情况(尽管这里没有鼠标点击,纯粹是为了展示我的div结构)。在我制作的产品中,用户将双击画布并显示一个新对象,因此鼠标坐标需要正确的原因。
我希望有人可以帮助我。
提前致谢。
编辑:无法提及我的部分应用程序,我使用JQuery,所以无论有没有JQuery的解决方案都没问题。再次感谢。
答案 0 :(得分:19)
我希望我能正确理解你的问题。
您可以使用.offset()来确定任何元素相对于根文档的当前偏移量。然后可以将该偏移与鼠标位置进行比较。
您可以使用event.pageX和event.pageY来确定当前的鼠标位置。
您可以使用$ {document} .scrollLeft()和$ {document}。scrollTop()来确定当前的滚动位置。
然后可以使用
获得相对于内部div的鼠标位置$("#outer_canvas").mousemove(function(e) {
var relativePosition = {
left: e.pageX - $(document).scrollLeft() - $('#canvas').offset().left,
top : e.pageY - $(document).scrollTop() - $('#canvas').offset().top
};
$('#mousepos').html('<p>x: ' + relativePosition.left + ' y: ' + relativePosition.top + ' </p>');
});
答案 1 :(得分:3)
我知道这已经很晚了,但我自己遇到了同样的情况,这就是我解决这个问题的方法。
我不想使用jQuery所以我编写了这个递归偏移函数来处理滚动偏移和div放置的问题,例如在多个可滚动的div中。
function recursive_offset (aobj) {
var currOffset = {
x: 0,
y: 0
}
var newOffset = {
x: 0,
y: 0
}
if (aobj !== null) {
if (aobj.scrollLeft) {
currOffset.x = aobj.scrollLeft;
}
if (aobj.scrollTop) {
currOffset.y = aobj.scrollTop;
}
if (aobj.offsetLeft) {
currOffset.x -= aobj.offsetLeft;
}
if (aobj.offsetTop) {
currOffset.y -= aobj.offsetTop;
}
if (aobj.parentNode !== undefined) {
newOffset = recursive_offset(aobj.parentNode);
}
currOffset.x = currOffset.x + newOffset.x;
currOffset.y = currOffset.y + newOffset.y;
console.log (aobj.id+' x'+currOffset.x+' y'+currOffset.y);
}
return currOffset;
}
将它用于真实:
var offsetpos = recursive_offset (this); //or some other element
posX = event.clientX+offsetpos.x;
posY = event.clientY+offsetpos.y;