滚动包含来自其他域的页面的iframe

时间:2011-05-04 21:39:22

标签: javascript jquery iframe cross-domain

我目前正在开发一个clicktail克隆。我已经记录了所有鼠标交互和窗口滚动,我的计划是通过打开已经记录到iframe中的URL然后将鼠标图像移动到捕获的坐标来回放它们,图像指示点击发生的时间和iframe滚动到捕获的滚动位置

当我在iframe中查看我的域中的页面时,这很有效,但是当我从不同的域显示页面时,我从FF控制台获得访问被拒绝的错误以及来自IE的相同问题

这是由于JavaScript的同源策略。

我一直在读这篇文章 - > Ways to circumvent the same-origin policy

对于许多开发人员而言,这似乎已经成为一个问题,并且有很多方法可以解决这个问题。

任何人都可以建议适合我的情况吗?

2 个答案:

答案 0 :(得分:1)

你总是可以假装它。也许你可以把你的iframe放在容器div(css:overflow: hidden; height: /* some height */)中,iframe元素设置为页面的整个高度,然后滚动div?

答案 1 :(得分:1)

您可以在您的域上使用PHP代理,(a)将目标URL读取为字符串,(b)添加base标记,以便图像,链接等正常工作,然后(c)打印字符串。

最终结果是一个与外部域中的页面相同但在您的域上托管的页面。这意味着您可以从父框架中在子框架中执行JavaScript。

代理的代码如下:

<?php
    ini_set("user_agent", $_SERVER['HTTP_USER_AGENT']); // temporarily override CURLs user agent with the user's own

    $page = file_get_contents($_REQUEST["www"]);
    $page = preg_replace("/<[\s]*head[^>]*>/i", "<head><base href='".$_REQUEST["www"]."' /><base target='_blank' />", $page);
    echo $page;
?>

使用此方法时的一个注意事项是,当用户(或JavaScript)单击代理页面中的链接时,用户将被带到原始域(或其他位置)上的页面。这意味着您的JavaScript将无法再访问或执行iframe中的脚本。

为了使此结果更加透明,请在上面的代码中将链接设置为target='_blank'