我想解决的问题是“这个位置是什么?”
获得DIV的x / y位置(偏移量)相当简单,但反过来呢?如何获得给定x / y位置的DIV(或任何元素)的id?
答案 0 :(得分:4)
不幸的是,触发制造/模拟鼠标事件将无法工作,因为当您发送它时,您必须提供目标元素。因为那个元素是你想要弄清楚的元素,所以你所能做的就是将它分配到身体上,就像它已经冒出来一样。
你真的只能自己动手,即手动浏览你感兴趣的元素,并将它们的位置/大小/ zIndex与你的x / y点进行比较,看看它们是否重叠。除了IE和最近的FF3,你可以使用
var el = document.elementFromPoint(x, y);
见
http://developer.mozilla.org/En/DOM:document.elementFromPoint
http://msdn.microsoft.com/en-us/library/ms536417(VS.85).aspx
答案 1 :(得分:2)
创建鼠标事件侦听器,然后在该位置触发鼠标事件。这应该为您提供该位置的整个元素堆栈。
或者,看看Firebug的来源。
答案 2 :(得分:2)
如果你拥有的只是X和Y位置(并且你不能像你提到的那样跟踪鼠标移动)那么你必须遍历DOM,循环遍历每个DIV。对于每个DIV,您需要将其X和Y坐标与您拥有的坐标进行比较。这是一项昂贵的操作,但这是唯一的方法。我建议你最好不要重新考虑你的问题,而不是想出一个解决方案。
答案 3 :(得分:2)
function getDivByXY(x,y) {
var alldivs = document.getElementsByTagName('div');
for(var d = 0; d < alldivs.length; d++) {
if((alldivs[d].offsetLeft == x) && (alldivs[d].offsetTop == y)) {
return alldivs[d];
}
}
return false;
}
答案 4 :(得分:1)
使用JQuery选择器过滤符合您的位置标准的所有DIV列表?
答案 5 :(得分:1)
一种选择是构建一个“div-dimension”对象数组。 (不要与div本身混淆......当你从对象上读取尺寸时,IE7的表现令人沮丧。)
这些对象包括指向div的指针,它们的尺寸(四个点......比如顶部,左侧,底部和右侧),可能还有一个脏位。 (如果尺寸发生变化,只需要很脏的位。
然后,您可以遍历数组并检查尺寸。它需要O(n)才能在每次移动鼠标时执行此操作。使用二分搜索样式方法可能会稍微好一点......也许。
如果采用二进制搜索样式方法,一种方法是存储4个数组。每个维度都有一个点,然后对所有四个点进行二元搜索。 O(4logn)= O(logn)。
我不是说我推荐任何这些,但他们可能会工作。
答案 6 :(得分:1)
我认为John所说的是你可以使用document.createEvent()在你想要的位置模拟一个鼠标移动。如果捕获该事件,通过向正文添加eventlistener,您可以查看event.target并查看该位置的元素。我不确定IE支持这种方法的程度,也许其他人都知道?
http://developer.mozilla.org/en/DOM/document.createEvent
<强>更新强> 这是一个模拟事件的jquery插件:
http://jquery-ui.googlecode.com/svn/trunk/tests/simulate/jquery.simulate.js
答案 7 :(得分:0)
JQuery选择器非常有用,但是(除非我错过了文档中的某些内容)确实没有任何选择器可以执行此操作。我不能根据任何其他标准过滤掉,因为我必须使用的是x和y位置。
答案 8 :(得分:0)
这可能是处理器密集程度太大,但会遍历页面上的整个div元素列表,找到它们的位置和大小,然后测试它们是否在鼠标下面。我不认为我想在浏览器上这样做。
答案 9 :(得分:0)
谢谢MattMitchell。我希望就这么简单 - 我已经知道如何获得DIV的位置 - 这有点棘手。
尼克和约翰 - 不幸的是,我无法使用鼠标位置。
我认为解决方案涉及创建一些接受位置的逻辑,做一些数学运算,并输出DIV id。看起来没有简单的答案。
答案 10 :(得分:0)
您可能会发现在加载页面时遍历DOM树更有效,获取所有元素的位置和大小,并将它们存储在数组/散列/等中。如果你很好地设计数据结构,你应该能够在以后需要时快速找到给定坐标的元素。
考虑您需要检测元素的频率,并将其与页面上元素的更改频率进行比较。你将平衡你必须重新计算所有元素位置的次数(一个昂贵的计算)与你实际使用计算信息的次数(我希望相对便宜)。