如何重叠元素检测点击?(How to detecting a click under an over

2019-10-22 13:15发布

我有两个HTML文档, b.html包含c.html使用iframe

b.html我需要画一些DIV(在我的例子ID =选择),这部分覆盖的内容c.html在可视化iframe

我需要获得DIV选择器下的坐标对应于鼠标DOM元素的ID。

此刻使用document.elementFromPoint()直接在c.html工作部分,因为当鼠标它是DIV选择我不能识别在下属的DOM元素c.html (在本例DIV c)中。

我需要知道:

  • 是否有可能选择下另一元件时,使用document.elementFromPoint()或任何其他方式?
  • 这可能是一个可能的解决方案或者可能使用DOM和原生API?

例如这里(请看在Chrome控制台):

http://jsfiddle.net/s94cnckm/5/

----------------------------------------------- b.html

<!doctype html>

<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>B</title>
    <script type="text/javascript">
        window.app = {
            start: function () {
            }
        };
    </script>
    <style>
        #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;
        }
    </style>
</head>
<body onload="app.start();">
    <div id="selector">SELECTOR</div>
    <iframe id="iframe" src="c.html"></iframe>
</body>
</html>

----------------------------------------------- c.html

<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>C</title>
    <script type="text/javascript">
        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));
            }
        };
    </script>
    <style>
        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;
        }
    </style>
</head>
<body onload="app.start();">
    <h1>Content</h1>
    <div id="a">a</div>
    <div id="b">b</div>
</body>
</html>

Answer 1:

一种可能是soltion的使用pointer-events

CSS属性指针事件允许作者在什么情况下(如果有的话)一个特定的图形元素可以成为鼠标事件的目标控制。 当此属性为指定,visiblePainted值相同的特征应用到SVG内容。

当您申请

#selector {
    /* ... */
    pointer-events: none;
 }

所有内容#selector和元素本身没有更多的互动。 内容可能不会被选中,并像事件:hoverclick不适用。

下面是与上面的CSS演示: http://jsfiddle.net/s94cnckm/6/



Answer 2:

另一种可能的解决方案,是捕获到掩蔽项目(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/



文章来源: How to detecting a click under an overlapping element?