2010-11-04 135 views
4

我想用jquery做些事情。jquery從iframe內容訪問iframe ID

我有這樣的代碼1.html;

<html> 
<head> 
<script language="javascript" type="text/javascript" src="jquery.js"></script> 
</head> 
<body> 
<iframe src="2.html" id="frame1"></iframe> 
<iframe src="3.html" id="frame2"></iframe> 
</body> 
</html> 

在2.html文件中。我試圖訪問iframe容器ID。 2.html文件內容;

<html> 
<head> 
<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
$(document).ready(function(){ 
    $('#btnIdKim').click(function(){ 
    }); 

}); 
</script> 
</head> 
<body> 
<input type="button" name="btnIdKim" id="btnIdKim" value="Id Kim" /> 
</body> 
</html> 

當用戶點擊btnIdKim按鈕。我需要訪問包含按鈕的父級iframe id。

但我不知道如何。

感謝每一個誰感興趣

回答

8

有一個HTML5上window(原IE擴展)屬性frameElement

alert(frameElement.id); 

但這不是全球支持;您不會在Google Chrome(撰寫本文時;版本7)或其他流行的非IE瀏覽器的舊版本中獲得它。

沒有此擴展名,您必須手動完成。轉到父窗口,搜索通過其所有的I幀,看是否包含在該文件是自己的文檔:

function getFrameElement() { 
    var iframes= parent.document.getElementsByTagName('iframe'); 
    for (var i= iframes.length; i-->0;) { 
     var iframe= iframes[i]; 
     try { 
      var idoc= 'contentDocument' in iframe? iframe.contentDocument : iframe.contentWindow.document; 
     } catch (e) { 
      continue; 
     } 
     if (idoc===document) 
      return iframe; 
    } 
    return null; 
} 

alert(getFrameElement().id); 

(該contentDocument解決方法是必要的,因爲IE < 8不支持它; try...catch是需要避免安全異常在滿足來自不同域的幀時停止循環。)

2

基本的jQuery搜索功能將把範圍作爲第二參數。它默認爲當前文檔,但您可以指定一個不同的文檔來跨iframe邊界進行搜索。我爲之前的一個項目完成了這項工作;這可能不是你正在尋找的東西,但希望提供一些提示。

從一個iframe,您可以訪問上面的窗口裏的文件這樣的範圍內:

$('#iframe2', top.document) 

這聽起來像你想確定在哪個iframe沒有click事件發生,對不對? 我不知道究竟是如何做到這一點,因爲我只有一個

對於獎金的樂趣,這裏是爲調整基礎上的iframe文檔的大小在父文檔的IFRAME元素我的事件處理程序:

$(document).bind('ResultsFrameSizeChanged:hybernaut', function(event){ 
    var iframe = $('#results', top.document)[0]; 

    if(iframe.contentDocument){ // IE 
     var height = iframe.contentDocument.body.offsetHeight + 35; 
    } else { 
     var height = iframe.contentWindow.document.body.scrollHeight; 
    } 

    // konsole.log("Setting iframe height to " + height); 
    $(iframe).css('height', height); 

    }); 

你再觸發可能改變文件的高度事件自定義事件(如AJAX加載):

$(top.document).trigger('ResultsFrameSizeChanged:hybernaut'); 

起初我是事件綁定到$(「IFRAME」)準備就緒()。但是這在瀏覽器中是不一致的,我最終觸發了來自ajax完成處理程序中的幾個地方。

另一個重要的注意事項是,如果你在你的iframe中加載jQuery,那麼你有幾個單獨的jQuery實例,並且你對jQuery如何工作的許多假設不再正確(現在是什麼全球?)。這可能非常具有挑戰性。我不確定,但我相信如果您使用命名空間事件並在特定文檔(即top.document)上觸發它們,那麼它們將在正確的上下文中處理。

+0

你是如何得到解決的*不安全的JavaScript嘗試訪問帶有URL的幀...域,協議和端口必須匹配*? – Josh 2011-01-19 21:03:27