javascript - 允许两个站点通信以了解 iframe 的当前 URL

标签 javascript php jquery iframe 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>

问题

如果我刷新 example.com 上的页面 (iframe),它会刷新并忘记用户所在/曾经所在的页面...

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

解决方案?

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

我希望网站 website.website.com 获取用户所在页面的当前路径/url(正在通过 iframe 查看)并发送此路径/通过 url 到 example.com 然后 example.com 将更新 session /临时 cookie/临时本地存储/变量...等,这意味着它将调整查询字符串以将其自身指向正确的用户刷新页面时的 URL,导致刷新正确记住他们所在的页面。

尝试

我尝试通过将以下代码放在各自的站点上来使用 postMessage 函数:

网站 1 额外代码

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

网站 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);

但是什么也没有发生,没有控制台消息或错误……什么也没有。

我什至尝试过复制 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");
    }
}

Uncaught DOMException: Blocked a frame with origin "http://website.website.com" from accessing a cross-origin frame at 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/ 上但是有必要附加一个查询字符串,以便可以共享链接。

就这么简单。

最佳答案

出于安全原因,只要 iframe 的内容和引用的 javascript 从同一域提供,您就只能获取 url。

如果这两个域不匹配,您将遇到跨站点引用脚本安全限制。

关于javascript - 允许两个站点通信以了解 iframe 的当前 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55235639/

相关文章:

php - 比较 PHP 中的字符串,如果它们相似,则从数组中删除其中一个

php - 如何让 PhpMyAdmin 删除/截断而不要求确认

javascript - 如果事件没有发生jquery/javascript,如何记录 react 时间?

javascript - 即使集合中没有元素,JQueryeach() 函数代码也会运行

javascript - 将向左滚动设置为在刷新时从零开始不起作用

javascript - 使用可编辑的 div 上传图像

javascript - 如何随机替换特定 URL 的 HREF? innerHTML 影响延迟加载

javascript - 在 html 中创建对象并在 oop 中使用函数被认为是不好的做法吗?

javascript - 如何从 AWS Lambda node.js 异步函数返回数据?

php - 设置 apache RewriteMap 以从数据库中提取的正确方法是什么? (PHP/APACHE/MySQL)