【问题标题】:Opening link of iframe in a pop up in parent window of pop up在弹出窗口的父窗口中打开 iframe 的链接
【发布时间】:2019-02-12 13:03:15
【问题描述】:

我在弹出窗口中有一个指向 url 的 iframe。

iframe 的 url 与我的应用程序的域相同。

iframe 的页面有一些我想在主窗口中打开的链接,而不是用户点击它时的弹出窗口。

我试过下面的代码:

    $(document).ready(function (e) {
    var links = document.getElementsByTagName('a');
    for (var i = 0; i < links.length; i++) {
        links[i].setAttribute('target', '_parent');
    }
    }); 

链接确实将目标作为父级,但是当我单击链接时,窗口会在 iframe 本身中打开。
我尝试将目标从 _parent 更改为 _top,但仍然无法正常工作。

有什么帮助吗?

【问题讨论】:

    标签: javascript iframe popup


    【解决方案1】:

    如果 iframe 的内容是不同的域,那么您对它执行的 JavaScript 数量将非常有限。你可以在这里https://www.cakemail.com/blog/the-iframe-cross-domain-policy-problem/了解更多关于为什么在这篇文章中。

    我个人发现使用postMessage API 是一种有用的解决方法,因为它适用于正确的用例(例如,您必须能够让 iframe 内容提供商托管的代码来处理消息)。这往往适合我的工作用例与其他软件公司的合作伙伴集成。

    您可以在此处找到此方法的示例: https://codepen.io/wickdninja/pen/oygwNL?editors=1111

    // parent js
    console.log('1 - parent');
    var iframe = document.getElementById('iframe');
    iframe.addEventListener("load", function(event){
      console.log('3 - parent on iframe load');
      iframe.contentWindow.postMessage('testing','*')
    }, false);
    
    iframe.contentWindow.addEventListener('message', function(event){
      console.log('recieved message event from child')
      console.log(event.data);
    });
    
    
    // parent html
    <h1>Parent Frame</h1>
    <iframe id="iframe" src="https://s.codepen.io/wickdninja/debug/GGgEKE/DqkDdKzORQXk"></iframe>
    
    // child js
    console.log('2 - child');
    window.addEventListener('message', function(event){
      console.log('4 - on child message')  
      console.log('child postMessage with * origin')
    }, false);
    
      window.parent.postMessage('test from child', '*')
    
    
    
    // child html
    <h1>Child Frame</h1>
    
    // console output from parent 
    "1 - parent"
    "3 - parent on iframe load"
    "recieved message event from child"
    "testing"
    

    【讨论】:

    • 我没有得到你的解决方案。你能解释一下吗? iframe 和父窗口的内容都属于同一个域。
    • iframe 很“奇怪”,很难使用。这就是为什么我建议使用postMessage API 将信号从 iframe 发送到父应用程序(其中 JS 的行为符合预期)在父应用程序中有一个事件侦听器侦听 iframe 消息(在您的情况下可能包含 URL您想导航到),当父级收到事件时导航到消息中的 URL。这更有意义吗?
    • 我的示例代码只是演示了从父级向子级以及从子级向父级发送消息。
    • 这是一个类似的 SO 问题,可能比我更好地传达信息stackoverflow.com/questions/2161388/…
    • 问题是我什至无法收集 iframe 的 href。我确实通过 var iframe = document.getElementById('iframeTest'); 得到了 iframe 元素但是当我做 var innerDoc = (iframe.contentDocument) 时? iframe.contentDocument : iframe.contentWindow.document;我得到一个空的文件。有什么帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多