从iframe接收mousemove事件

时间:2011-03-10 14:45:15

标签: javascript mousemove event-passthrough

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

有没有办法将这些事件传递给根文档?

6 个答案:

答案 0 :(得分:35)

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

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

答案 1 :(得分:4)

如果iframe中的文档位于同一document.domain中,则可以非常轻松地执行此操作。

如果你有相同的document.domain,你也必须在iframe中设置一个mousemove监听器,并将值传递给父页面。

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

否则,由于浏览器执行的原始政策相同,您运气不佳。

答案 2 :(得分: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>

答案 3 :(得分:2)

您应该查看将父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'));

答案 4 :(得分:1)

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

{{pointer-events : isMoving? 'none' : 'all' }}

答案 5 :(得分:0)

这对我来说很有效,将父文档事件绑定与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'));