如何在 iframe 本身内关闭 iframe

IT技术 javascript jquery iframe
2021-02-20 07:49:12

如何使用 javascript 或 jQuery 关闭 iframe 本身内的 iframe?我试过了,<a href="javascript:self.close()">但没有用。

5个回答

“关闭”当前 iFrame 是不可能的,但您可以告诉父级操作 dom 并使其不可见。

在 IFrame 中:

parent.closeIFrame();

在父级:

function closeIFrame(){
     $('#youriframeid').remove();
}
父对象非常有效.. 我认为这就是 iframe 与其父页面相关联的方式?
2021-04-20 07:49:12
@citizenconn 如果 IFRAME 是跨域的,我们是否必须设置“x-frame-options”?
2021-04-22 07:49:12
哦,这是跨域?如果不进入一个全新的痛苦世界,您将无法操纵 dom。
2021-05-01 07:49:12
@citizen,如果我无法控制父域。这可以在 iframe 本身中处理吗?就像在 iframe 中一样,通过 parent.getElementByID("iFrameID").remove(); 引用 iframe 本身。
2021-05-12 07:49:12
对于它的value,我能够关闭一个 iframe: document.getElementById("iframeID").remove();
2021-05-14 07:49:12
function closeWin()   // Tested Code
{
var someIframe = window.parent.document.getElementById('iframe_callback');
someIframe.parentNode.removeChild(someIframe));
}


<input class="question" name="Close" type="button" value="Close" onClick="closeWin()" tabindex="10" /> 
太棒了,但实际上,您可以删除第二个 get 元素。
2021-04-20 07:49:12
晚了几年,我知道,但我只想指出您不必要地调用 getElementById 两次。第二行closeWin()应该是someIframe.parentNode.removeChild(someIframe);.
2021-04-28 07:49:12
这确实有效!在几秒钟内实施它。我推荐它!
2021-05-11 07:49:12

使用它从 iframe 本身内的父级中删除 iframe

frameElement.parentNode.removeChild(frameElement)

它仅适用于相同来源(不允许使用交叉原点)

由于我在跨域场景中创建了像 Pinterest 的 Pin It 这样的书签,因此这些解决方案都不适合我。

我在 GitHub https://gist.github.com/kn0ll/1020251上找到了一个书签模板,它解决了关闭 Iframe 从其中发送命令的问题。

由于我无法从 IFrame 中的父窗口访问任何元素,因此只能使用 window.postMessage 在两个窗口之间发布事件来进行这种通信

所有这些步骤都在 GitHub 链接上:

1- 您必须在父页面上注入一个 JS 文件。

2- 在注入到父级的这个文件中,添加一个窗口事件监听器

    window.addEventListener('message', function(e) {
       var someIframe = window.parent.document.getElementById('iframeid');
       someIframe.parentNode.removeChild(window.parent.document.getElementById('iframeid'));
    });

此侦听器将处理关闭和您希望的任何其他事件

3- 在 Iframe 页面内,您通过 postMessage 发送关闭命令:

   $(this).trigger('post-message', [{
                    event: 'unload-bookmarklet'
                }]);

按照https://gist.github.com/kn0ll/1020251上的模板操作,你会没事的!

希望能帮助到你,

偶数侦听器函数的第二行(第 2 步)使用与以前相同的参数第二次不必要地调用 getElementById。这一行应该是: someIframe.parentNode.removeChild(someIframe);
2021-05-07 07:49:12
另外,我认为您的代码中有错误。如果事件侦听器被注入到父窗口并在其上下文中运行,那么您不应该编写window.parent.document.getElementById(...)而是只编写document.getElementById(...),因为它已经父窗口中了。
2021-05-09 07:49:12

它有点hacky,但效果很好

 function close_frame(){
    if(!window.should_close){
        window.should_close=1;
    }else if(window.should_close==1){
        location.reload();
        //or iframe hide or whatever
    }
 }

 <iframe src="iframe_index.php" onload="close_frame()"></iframe>

然后在框架内

$('#close_modal_main').click(function(){
        window.location = 'iframe_index.php?close=1';
});

如果你想通过一个

if(isset($_GET['close'])){
  die;
}

在框架页面的顶部,使重新加载不明显

所以基本上第一次框架加载它不会隐藏自己但是下次加载它会调用onload函数并且父级将有一个导致框架关闭的窗口变量