iframe内部的页面顶部 - 跨域



希望我在这里没有忽略解决方案,但是我一直在拔出头发,试图弄清楚我在做错什么,希望有人能看到它是什么。这是配置:

我有一个在domain1.com上提供的页面。在大多数情况下是带有提交按钮和大量jQuery的表格。表单可以很长,因此用户需要向下滚动页面以输入表单字段。提交按钮位于此表单的底部,而输出结果位于表单的顶部。当用户单击"提交"按钮时,他/她看不到结果,因为它们不在页面顶部。我想做的是使用jQuery scrollto()单击"提交"按钮后将其定位到页面的顶部。

问题是上面的页面(和提交按钮)在domain2.com上的iframe内部,因此,当单击"提交"按钮时,我有一个我需要克服的跨域情况。

我在这里发布了一个问题,但是我的问题并不准确。该线程演变为有用的信息,并将我指向了一个使用jQuery Postmessage()传达跨域的脚本,但是我在实现建议的解决方案时遇到了问题。这是我的代码:

domain1.com(儿童):

<html>
    <head>
        <!-- Load jquery -->
        <script type="text/javascript" src="./jquery-2.0.3.min.js"></script>
        <!-- Cross-domain scripting goodness (scroll to top) -->
        <script type="text/javascript" src="./jquery.ba-postmessage.js"></script>
        <script type="text/javascript">
            // EVENT Handler - Form Submission
            $(function () {
                $("#btnSubmit").bind('click', function (event) {
                    // Get the parent page URL as it was passed in, 
                    // for browsers that don't support window.postMessage
                    var parent_url = decodeURIComponent(document.location);
                    window.postMessage("scrollTop", parent_url, parent);
                });
            });
        </script>
    </head>
    <body>
        <form>
            ... Lots of form fields resulting in vertical height ...
            <input type="submit" id="btnSubmit" value="Submit" />
        </form>
    </body>
</html>

domain2.com(parent):

<html>
    <head>
        <!-- Load jquery -->
        <script type="text/javascript" src="./jquery-2.0.3.min.js"></script>
        <!-- Cross-domain scripting goodness (scroll to top) -->
        <script type="text/javascript" src="./jquery.ba-postmessage.js"></script>
        <script type="text/javascript">
            // Cross-domain - scroll window to top
            window.addEventListener("message", receiveMessage, false);
            function receiveMessage(event) {
                if (event.data == "scrollTop") {
                    window.scrollTo(0, 0);
                }
            }
        </script>
    </head>
    <body>
        <iframe src="http://domain1.com/index.html"></iframe>
    </body>
</html>

在同一域上运行上面的两个页面提供了理想的结果 - 单击顶部的卷轴。

在上面记录和编码的单独域上运行,该页面不会滚动到顶部,我的输出结果失败,并且jQuery在Firebug中输出此错误消息:

DataCloneError: The object could not be cloned.

如果我更改了代码以在domain1.com上的页面上删除parent参数,则如下:

var parent_url = decodeURIComponent(document.location);
window.postMessage("scrollTop", parent_url);     //, parent);

那么根本没有任何事情发生,也没有输出错误。看来Domain2.com上的receiveMessage()根本没有被调用。

任何人都可以看到我可能做错了什么,这阻止了该代码工作跨域?

我认为现在很晚,但是对于其他人可能会起作用。

你几乎在那里;您需要使用

window.postMessage("scrollTop","#domain of parent page exact page");

而不是代码段:

 window.postMessage("scrollTop", parent_url, parent);

如果计划将事件派发时,hostname或eleytwindow文档的端口与靶向寄生虫提供的内容不匹配,则该事件将不由DOM发送。在此处阅读文档

在父页面中使用以下代码段。

window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
  if (event.origin !== "#domain of iframe")
    return;
  if (event.data == "scrollTop"){
  window.scrollTo(0,0);
  }
}

相关内容

  • 没有找到相关文章

最新更新