如何检测重叠元素下的点击?
我有两个HTML文档, b.html
包含使用iframe
c.html
。
在b.html
我需要绘制一些DIV(在我的示例中为id = selector),它部分覆盖了iframe
可视化的c.html
内容。
我需要在DIV选择器下获取与鼠标坐标对应的DOM元素的ID。
目前在c.html
直接使用document.elementFromPoint()
可以部分工作,就像鼠标在DIV选择器上时一样,我无法识别c.html
中的c.html
DOM元素(在本例中为DIV c)。
我需要知道:
- 是否可以使用document.elementFromPoint()或任何其他方法选择另一个元素?
- 什么是可能的替代解决方案可能使用DOM和本机API?
这里的示例(请查看Chrome中的控制台):
http://jsfiddle.net/s94cnckm/5/
———————————————– b.html
B window.app = { start: function () { } }; #selector { position: absolute; top: 150px; left: 150px; width: 250px; height: 250px; -webkit-box-shadow: 0px 0px 0px 5px yellow; -moz-box-shadow: 0px 0px 0px 5px yellow; box-shadow: 0px 0px 0px 5px yellow; } #iframe { width: 500px; height: 500px; border: none; } SELECTOR
———————————————– c.html
C window.app = { start: function () { document.querySelector('body').addEventListener('mousemove', function (event) { //console.log(event.pageX, event.pageY, event.target.id); var item = document.elementFromPoint(event.pageX, event.pageY); console.log(item.id); }.bind(this)); } }; body { background-color: lightslategray; } #a { position: absolute; top: 50px; left: 50px; width: 100px; height: 100px; background-color: green; z-index: 2; } #b { position: absolute; top: 100px; left: 100px; width: 100px; height: 100px; background-color: #ffd800; z-index: 1; } Content
a b
可能的解决方法是使用pointer-events
。
CSS属性指针事件允许作者控制特定图形元素在什么情况下(如果有的话)可以成为鼠标事件的目标。 如果未指定此属性,则visiblePainted值的相同特征将应用于SVG内容。
申请时
#selector { /* ... */ pointer-events: none; }
#selector
和元素本身的所有内容都不再具有交互性。 可能未选择内容,并且以下事件:hover
或click
不适用。
以下是上述css的演示: http : //jsfiddle.net/s94cnckm/6/
另一种可能的解决方案是捕获在屏蔽项(DIV.selector)上触发的鼠标事件的文档坐标,暂时隐藏该屏蔽项,然后询问文档在该坐标位置下的内容(使用document.elementFromPoint(x, y))再次显示屏蔽项目之前。
对document.elementFromPoint()的支持也涵盖了旧版本的IE。 不幸的是, 指针事件对旧版IE的支持有限。
这是一个工作示例:
http://jsfiddle.net/s94cnckm/14/
document.getElementById('iframe').contentDocument.addEventListener('click', function (event) { alert(event.target.id); }.bind(this)); document.getElementById('selector').addEventListener('click', function (event) { var selector = document.getElementById('selector'); selector.style.display = 'none'; var item = document.getElementById('iframe').contentDocument.elementFromPoint(event.pageX, event.pageY); selector.style.display = ''; alert(item.id); }.bind(this));
关于pointer-events
的使用我链接提到一些相关的文章,包括解决旧版本的IE。
如何使Internet Explorer模拟指针事件:无?
https://css-tricks.com/almanac/properties/p/pointer-events/
http://davidwalsh.name/pointer-events
http://robertnyman.com/2010/03/22/css-pointer-events-to-allow-clicks-on-underlying-elements/
此解决方案受到本文的启发:
http://www.vinylfox.com/forwarding-mouse-events-through-layers/