15

我有一个 javascript 应用程序,它在文档中添加了一个 mousemove 侦听器。问题:当鼠标移到 iframe 上时,不会调用该函数。

有没有办法将此类事件传递给根文档?

4

6 回答 6

39

放入pointer-events: none;框架的样式。

我自己也遇到了这个问题,发现这个解决方案效果很好,而且非常简单!

于 2011-04-19T20:14:31.587 回答
5

您应该查看将父document事件绑定与 document.getElementById('iFrameId').contentDocument事件结合起来,巫婆允许您访问 iFrame 内容元素。

https://stackoverflow.com/a/38442439/2768917

function bindIFrameMousemove(iframe){
    iframe.contentWindow.addEventListener('mousemove', function(event) {
        var clRect = iframe.getBoundingClientRect();
        var evt = new CustomEvent('mousemove', {bubbles: true, cancelable: false});

        evt.clientX = event.clientX + clRect.left;
        evt.clientY = event.clientY + clRect.top;

        iframe.dispatchEvent(evt);
    });
};

bindIFrameMousemove(document.getElementById('iFrameId'));
于 2017-03-28T09:33:20.037 回答
4

如果 iframe 中的文档在同一个 document.domain 上,您可以很容易地做到这一点。

如果您有相同的 document.domain,则还必须在 iframe 中设置 mousemove 侦听器并将值传递给父页面。

如果文档不在同一个 document.domain 上,它会变得相当复杂,并且您将需要 iframe 页面来运行设置 mousemove 事件侦听器的 javascript 本身。然后您可以按照此处所述进行跨帧通信:http: //softwareas.com/cross-domain-communication-with-iframes

否则,由于浏览器执行的原始策略相同,您将不走运。

于 2011-03-10T14:47:01.200 回答
3

我刚才遇到了同样的问题,我想出了这个:

$("iframe").contents().find("body").mousemove(function(cursor){
        $("#console").html(cursor.pageX+":"+cursor.pageY);
    });
    $(document).mousemove(function(cursor){
        $("#console").html(cursor.pageX+":"+cursor.pageY);
    });

.contents().find("body")抓取 iframe 内的内容,.mousemove()可用于添加事件侦听器

测试html...

<div id="console"></div>
于 2012-04-08T09:18:12.467 回答
2

虽然指针事件:无;在框架的样式中可以解决这个问题,但它禁用了 iframe 中的任何其他事件,我的解决方案是切换值,如:

{{pointer-events : isMoving? 'none' : 'all' }}
于 2018-02-07T08:08:28.980 回答
1

这对我有用,将父文档事件绑定与 document.getElementById('iFrameId').contentDocument 事件结合起来,女巫允许您访问 iFrame 内容元素。

https://stackoverflow.com/a/38442439/2768917

function bindIFrameMousemove(iframe){
    iframe.contentWindow.addEventListener('mousemove', function(event) {
        var clRect = iframe.getBoundingClientRect();
        var evt = new CustomEvent('mousemove', {bubbles: true, cancelable: false});

        evt.clientX = event.clientX + clRect.left;
        evt.clientY = event.clientY + clRect.top;

        console.log(evt);
        iframe.dispatchEvent(evt);
    });
};

bindIFrameMousemove(document.getElementById('iFrameId'));
于 2019-03-14T14:31:20.813 回答