从iframe内部获取绝对鼠标位置

时间:2015-01-22 19:15:20

标签: javascript jquery iframe mouseover

我有一个带有iframe的网页呈现另一个页面(同一个域)。我需要获取与父文档相关的鼠标位置。请注意,iframe可以双向滚动。我尝试过使用偏移而没有运气。

$('#iframe').contents().find('html').on('mousemove', function (e) {

     //gives me location in terms of the iframe but not the entire page. 
     var y = e.pageY; 

     //gives me 0
     var y = $(this).offset().top;

     //more code here....
 })

2 个答案:

答案 0 :(得分:7)

一种方法是在父窗口中获取iframe的位置,并将其添加到相对于iframe本身的鼠标位置。在下面扩展您的代码,

var iframepos = $("#iframe").position();

$('#iframe').contents().find('html').on('mousemove', function (e) { 
    var x = e.clientX + iframepos.left; 
    var y = e.clientY + iframepos.top;
    console.log(x + " " + y);
})

答案 1 :(得分:0)

event.clientX,event.clientY并非在所有浏览器中都起作用。但是,jQuery有一个解决方案。另外,当您的iframe位于另一个iframe中时,该怎么办?我有一个可以在跨浏览器中使用嵌套iframe的解决方案。

GetPosition: function (event) {
    var $body = $("body");

    var offsetLeft = event.pageX - $body.scrollLeft();
    var offsetTop = event.pageY - $body.scrollTop();

    if (window != parent.window) {
        // event was fired from inside an iframe
        var $frame = parent.$("iframe#" + window.frameElement.id);
        var framePos = $frame.position();
        offsetLeft += framePos.left;
        offsetTop += framePos.top;
    }

    if (parent.window != parent.parent.window) {
        // event was fired from inside an iframe which is inside another iframe
        var $frame = parent.parent.$("iframe#" + parent.window.frameElement.id);
        var framePos = $frame.position();
        offsetLeft += framePos.left;
        offsetTop += framePos.top;
    }

    return [offsetLeft, offsetTop];
}

我希望这是一个完美的解决方案。如果您将iframe定位在固定布局中,或者将其绝对定位为模式对话框,则可以使用它。但是,如果您的iframe位于另一个绝对定位的容器内,则还必须获取该容器的.position()并将其添加到总偏移量中。