2011-07-19 87 views
33

如何使用javascript或jQuery關閉iframe內的iframe?我試過<a href="javascript:self.close()">但它沒有奏效。如何在iframe內關閉iframe

+0

如果你不想依靠入侵嘗試我的答案在http://stackoverflow.com/questions/6086986/how-do-i-remove-an-iframe-from -within-that-that-been-dynamic-created – Rhys

回答

58

「關閉」當前的iFrame是不可能的,但您可以告訴父母操縱dom並使其不可見。

在IFrame:請

parent.closeIFrame(); 

在父:

function closeIFrame(){ 
    $('#youriframeid').remove(); 
} 
+0

@citizen,如果我沒有控制權的父域。這可以在iframe中處理嗎?像在iframe中一樣,通過parent.getElementByID(「iFrameID」)。remove();引用iframe本身。 – Stan

+9

哦,它是跨域?如果不進入一個全新的痛苦世界,你將無法操縱dom。 –

+0

父對象是相當有效的..我認爲這是如何與iframe關聯其父母頁面? – efirat

11
function closeWin() // Tested Code 
{ 
var someIframe = window.parent.document.getElementById('iframe_callback'); 
someIframe.parentNode.removeChild(window.parent.document.getElementById('iframe_callback')); 
} 


<input class = question name="Close" type ="button" value = "Close" onClick = "closeWin()"  tabindex="10" /> 
+1

這不會工作!幾秒鐘內完成。我推薦它! – Laci

+1

這個工作,但不跨域:( –

+0

年後,我知道,但我只想指出,你不必要地調用getElementById兩次。'closeWin()'的第二行應該是'someIframe.parentNode。 removeChild(someIframe);'。 – Doin

2

使用此功能可以從母公司的iframe本身

frameElement.parentNode.removeChild(frameElement) 

它與同一產地內刪除IFRAME只(不允許與十字架杜松子酒)

1

同類哈克,但它工作得很好十歲上下

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; 
} 

獲得幻想在你的框架頁面的頂部,使重新加載不明顯

所以基本上在第一時間框架加載它不隱藏自身,但它加載ITLL調用的onload函數和家長將有下一次的窗口VAR導致框架關閉

1

這個解決方案沒有工作了因爲我在跨域的方案創建像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模板,你會沒事的!

希望它能幫助,

+0

你的偶數監聽器函數的第二行(第2步)不必要地再次調用getElementById,它的參數和之前一樣。 ' – Doin

+0

另外,我認爲你的代碼存在一個錯誤,如果事件監聽器被注入並且在父窗口的上下文中運行,那麼你不應該寫'window.parent.document.getElementById(... )'而只是'document.getElementById(...)',因爲它已經在*父窗口中。 – Doin