根据x和y位置获取DIV ID
我要解决的问题是"这个职位是什么?"
获得DIV的x / y位置(偏移)相当琐碎,但是相反呢?给定x / y位置,如何获取DIV(或者任何元素)的ID?
解决方案
回答
使用JQuery选择器过滤所有DIV列表,以匹配位置标准吗?
回答
JQuery选择器非常有用,但是(除非我在文档中错过了一些东西),实际上没有任何选择器可以做到这一点。我无法根据其他任何条件进行过滤,因为我需要处理的只是x和y位置。
回答
创建鼠标事件侦听器,然后在该位置触发鼠标事件。这应该为我们提供该位置的整个元素堆栈。
或者,查看Firebug的来源。
回答
这可能会占用大量处理器资源,但会遍历页面上的整个div元素列表,找到它们的位置和大小,然后测试它们是否在鼠标下面。我不认为我想对浏览器执行此操作。
回答
谢谢MattMitchell。我希望它是如此简单-我已经知道如何获得DIV的位置,这有点棘手。
尼克和约翰不幸的是,我不能使用鼠标位置。
我认为该解决方案涉及创建一些逻辑,该逻辑接受该职位,进行一些数学运算并输出DIV id。似乎没有简单的答案。
回答
一种选择是构建一个" div维"对象数组。 (不要与div本身混淆。当我们读取对象的尺寸时,IE7性能令人沮丧。)
这些对象包括一个指向div的指针,它们的尺寸(四个点,分别是顶部,左侧,底部和右侧),并且可能还有脏点。 (只有大小更改时才真正需要脏位。
然后,我们可以遍历数组并检查维度。它要求O(n)在每次鼠标移动时执行此操作。使用二进制搜索样式方法,我们也许可以做的更好一些……也许。
如果我们执行二进制搜索样式方法,则一种方法是存储4个数组。每个都有一个维度点,然后对所有四个点进行二进制搜索。 O(4logn)= O(logn)。
我并不是说我推荐其中任何一种,但它们可能会起作用。
回答
如果我们只有X和Y位置(并且我们无法跟踪我们提到的鼠标移动),那么我们将不得不遍历DOM,并遍历每个DIV。对于每个DIV,我们需要将其X和Y坐标与我们拥有的坐标进行比较。这是一项昂贵的操作,但这是唯一的方法。我建议我们最好重新考虑问题,而不是提出解决方案。
回答
我们可能会发现,在页面加载后遍历DOM树,获取所有元素的位置和大小并将它们存储在array / hash / etc中会更有效。如果设计良好的数据结构,那么以后需要时,我们应该能够相当快地在给定坐标处找到一个元素。
考虑一下我们将需要多久检测一次元素,并将其与页面上元素的改变频率进行比较。我们将需要重新计算所有元素位置的次数(昂贵的计算)与实际使用计算信息的次数(我希望相对便宜)之间取得平衡。
回答
我认为John在说的是我们可以使用document.createEvent()在想要的位置模拟鼠标移动。如果捕获该事件,可以通过向主体添加事件侦听器来查看event.target并查看该位置处的元素。我不确定IE支持此方法的程度,也许其他人知道吗?
http://developer.mozilla.org/en/DOM/document.createEvent
更新:
这是一个模拟事件的jquery插件:
http://jquery-ui.googlecode.com/svn/trunk/tests/simulate/jquery.simulate.js
回答
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; }
回答
不幸的是,触发人为制造/模拟的鼠标事件将不起作用,因为在分派鼠标事件时,必须提供目标元素。由于该元素是我们要找出的元素,因此我们所能做的就是将它分发到主体上,好像它已经冒泡了一样。
我们真的可以独自完成操作,即手动遍历我们感兴趣的元素,并将它们的位置/大小/ zIndex与x / y点进行比较,看看它们是否重叠。除了IE和最近的FF3,我们可以在其中使用
var el = document.elementFromPoint(x, y);
看
http://developer.mozilla.org/En/DOM:document.elementFromPoint
http://msdn.microsoft.com/zh-CN/library/ms536417(VS.85).aspx