2010-11-04 106 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