允许两个网站进行通信以了解iframe的当前URL

Ryf*_*lex 10 javascript php iframe jquery postmessage

我正在尝试找到一种解决方案,以允许网站通过iframe知道用户使用的URL。

网站1 :( http://website.website.com远程网站,只能将javascript和html添加到网页中)

网站2 :( https://example.com完全可编辑,php,html,js等)

当前代码:(属于网站2(Example.com)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Website.com</title>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body class="body_blank">
    <script type="text/javascript">

        jq = jQuery.noConflict();

        jq(document).ready(function() {

            var currentFramePath = '';
            var iframe = '<iframe src="{src}" id="#iFrameContainer" style="position:fixed; top:0px; bottom:0px; right:0px; width: 100%; border: none; margin:0; padding:0; overflow: hidden; z-index:999999; height: 100%;">';

            var urlFrame = getUrlParameter('currentFrame');

            if(urlFrame != null && urlFrame != ''){
                console.log("Frame not found");
                jq('#iFrameContainer').html(iframe.replace('{src}', urlFrame));
                currentFramePath = urlFrame;
            }

            jq('#iFrameContainer').click(function(){
                console.log("Clicked in frame");
                currentFramePath = jq(this).attr('href');
                console.log(currentFramePath);
            });

            setInterval(function(){
                window.location = window.location.href.split('?')[0] + '?currentFrame=' + currentFramePath;
                console.log("Update Query");
            }, 5000);

        });

        function getUrlParameter(sParam) {
            var sPageURL = decodeURIComponent(window.location.search.substring(1)),
                sURLVariables = sPageURL.split('&'),
                sParameterName,
                i;
            console.log("Get Query");   
            for (i = 0; i < sURLVariables.length; i++) {
                sParameterName = sURLVariables[i].split('=');

                if (sParameterName[0] === sParam) {
                    return sParameterName[1] === undefined ? true : sParameterName[1];
                }
            }
        };
    </script>
    <div id="wrapper" class="wrapper_blank">
        <iframe src="http://website.website.com" id="#iFrameContainer" style="position:fixed; top:0px; bottom:0px; right:0px; width: 100%; border: none; margin:0; padding:0; overflow: hidden; z-index:999999; height: 100%;">
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

问题

如果我刷新页面(iframe),example.com则会刷新并忘记用户正在/正在访问的页面...

如您所见,我试图通过iFrame检测他们的页面来使其正常工作,但是由于它位于不同的域,因此这是不可能的。

解?

我正在寻找某种解决方案来执行如下所述的操作,但请记住,可能会有更好的解决方案。

我希望网站website.website.com获取用户所在页面的当前路径/ URL(正在通过iframe进行查看),并通过该路径/ URL发送至example.comexample.com,以更新会话/临时Cookie /临时本地存储/变量...等,这将意味着它将调整查询字符串,以在用户刷新其页面时将自身指向正确的URL,从而使刷新正确地记住他们所在的页面。

尝试

我试图postMessage通过将以下代码放在各自的站点上来使用该功能:

网站1附加代码

<script type="text/javascript">
    setInterval(function() {
        parent.postMessage(window.location.pathname, "https://website.com");
    },1000);
</script>
Run Code Online (Sandbox Code Playgroud)

网站2附加代码:

var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

eventer(messageEvent, function(e) {
    console.log('Parent Message: ', e.data);
}, false);
Run Code Online (Sandbox Code Playgroud)

但是没有任何反应,没有控制台消息或错误……什么也没有。

我什至尝试过复制https://blog.teamtreehouse.com/cross-domain-messaging-with-postmessage之类的东西,但没有任何帮助:(

有什么想法我做错了什么以及解决该问题的方法吗?

谢谢

编辑

我在http://website.website.com内尝试了以下js,但没有用:

localStorage.setItem('CurrentURLChecker', window.location.href)

if (localStorage.getItem('CurrentURLChecker')) {
    if (window.parent.location.href == "https://website.com/" ) {
        console.log("URL FOUND");
    }
}
Run Code Online (Sandbox Code Playgroud)

未捕获的DOMException:阻止了源为“ http://website.website.com ” 的框架访问位于http://website.website.com/:251:44的跨域框架

编辑-一个例子

网站1 =“ http://stackoverflow.serviceprovider.com

网站2 =“ https://stackoverflow.com

网站2包含一个iframe,可准确显示网站1所显示的内容。

我永远不会访问网站1,所有点击都是在网站2上完成的

如果我要单击iframe内的链接,然后导航至:http : //stackoverflow.serviceprovider.com/this-new-page/,则网站1应该能够检测到这一点并存储iframe的位置并记住它。

现在,如果我刷新浏览器,而不是将iframe加载到http://stackoverflow.serviceprovider.com,它将加载他们实际刷新的页面,即http://stackoverflow.serviceprovider.com/this-new-page/

选项卡/窗口URL将始终保留在https://stackoverflow.com/上,但是有必要附加查询字符串,以便使链接可共享。

就这么简单。

Mar*_*lar 0

由于您可以将 javascript 添加到网站 1 ( http://website.website.com),因此您可以使用 javascript 创建会话并将用户访问的当前页面保存在 cookie 中(如此处所述。当用户访问网站的主页时(当用户重新加载网站 2 时发生这种情况),您可以使用 javascript 获取此值并加载保存的页面 ( window.location.href = 'http://website.website.com/YourSavedPage')。

如果您不希望每次用户访问网站 1 的主页时都进行重定向,您可以考虑创建一个自己的页面,将用户重定向到最后打开的页面,并在加载 iframe 时打开该页面一次。