嵌套的iframe,AKA Iframe Inception

使用jQuery我试图访问div id =“element”。

   
...

所有iframe都在同一个域中,没有www /非www问题。

我已经成功选择了第一个iframe中的元素,但没有成功选择第二个嵌套的iframe。

我尝试了一些事情,这是最近的事情(也是一次非常绝望的尝试)。

 var iframe = jQuery('#upload').contents(); var iframeInner = jQuery(iframe).find('iframe').contents(); var iframeContent = jQuery(iframeInner).contents().find('#element'); // iframeContent is null 

编辑:为了排除计时问题,我使用了点击事件并等了一会儿。

 jQuery().click(function(){ var iframe = jQuery('#upload').contents().find('iframe'); console.log(iframe.find('#element')); // [] null }); 

有任何想法吗? 谢谢。

更新:我可以像这样选择第二个iframe ……

 var iframe = jQuery('#upload').contents().find('iframe'); 

现在的问题似乎是src是空的,因为iframe是用javascript生成的。 因此选择iframe但内容长度为0。

事实是,您提供的代码将无法工作,因为元素必须具有“src”属性,如:

  

可以使用.contents()来获取内容:

$('#uploads).contents()将允许您访问第二个iframe,但如果该iframe为“INSIDE”, http://domain/page.html文档会加载#uploads iframe。

为了测试我是对的,我创建了3个名为main.html,iframe.html和noframe.html的html文件,然后选择div#元素就好了:

 $('#uploads').contents().find('iframe').contents().find('#element'); 

由于您需要等待iframe加载资源,因此元素将无法延迟。 此外,所有iframe都必须位于同一个域中。

希望这可以帮助 …

这里是我使用的3个文件的html(用你的域和url替换“src”属性):

main.html中

     main.html example       

Iframe.html的

     iframe.html example     

noframe.html

     noframe.html example   
some content

var iframeInner = jQuery(iframe).find('iframe').contents();

var iframeContent = jQuery(iframeInner).contents().find('#element');

iframeInner包含来自的元素

 
other markup goes here

iframeContent将找到里面的元素

  
other markup goes here

(find不搜索当前元素)这就是它返回null的原因。

嘿,我得到的东西似乎正在做你想做的事情。 它涉及一些脏的复制,但有效。 你可以在这里找到工作代码

所以这是主要的html文件:

        
Hello!!!!

如您所见,一旦加载了第一个Iframe,我将获得第二个并克隆它。 然后我将它重新插入dom中,这样我就可以访问onload事件了。 一旦加载了这个,我从非克隆的内容中检索内容(必须加载,因为它们使用相同的src)。 然后,您可以使用内容来监视您想要的内容。

这是Test_Iframe.html文件:

      
Test_Iframe

和Test_Iframe2.html文件:

      
I am the second nested iframe

你可能有时间问题。 你的document.ready commend可能在加载第二个iFrame之前触发。 你没有足够的信息来帮助我们进一步提供帮助 – 但是如果这似乎是可能的问题,请告诉我们。

您应该对以后渲染的元素使用live方法,例如colorbox,hidden fields或iframe

 $(".inverter-value").live("change",function() { elem = this $.ajax({ url: '/main/invertor_attribute/', type: 'POST', aysnc: false, data: {id: $(this).val() }, success: function(data){ // code }, dataType: 'html' }); }); 

我认为达​​到你的div的最好方法是:

 var your_element=$('iframe#uploads').children('iframe').children('div#element'); 

它应该运作良好。

如果浏览器支持iframe,那么iframe中的DOM来自各个标签的src属性。 iframe标记内的内容用作浏览器不支持iframe标记的后退机制。

参考: http : //www.w3schools.com/tags/tag_iframe.asp

我想你的问题是你的iframe中没有加载jQuery。

最安全的方法是依靠纯粹的基于DOM的方法来解析您的内容。

或者,从jQuery开始,然后一旦进入iframe,如果typeof window.jQuery == 'undefined' ,则测试一次,如果是,则在其中未启用jQuery并在基于DOM的方法上回退。