jQuery中,selectiframe内的元素,这是在iframe中

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

<body> <iframe id="uploads"> <iframe> <div id="element">...</div> </iframe> </iframe> </body> 

所有的iframe都在同一个域上,没有www / non-www问题。

我已经成功地select了第一个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 }); 

有任何想法吗? 谢谢。

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

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

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

真的卡住了。

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

 <iframe id="uploads" src="http://domain/page.html"></iframe> 

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

$('#uploads).contents()会让你访问第二个iframe,但是如果iframe是“INSIDE”,则加载#uploads iframe的http://domain/page.html文档。

为了testing我是正确的,我创build了3个html文件,名为main.html,iframe.html和noframe.html,然后selectdiv#元素就好了:

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

由于您需要等待iframe加载资源,因此元素将不可用。 此外,所有的内联框架必须在同一个域上。

希望这可以帮助 …

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

main.html中

 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>main.html example</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> $(function () { console.log( $('#uploads').contents().find('iframe').contents().find('#element') ); // nothing at first setTimeout( function () { console.log( $('#uploads').contents().find('iframe').contents().find('#element') ); // wait and you'll have it }, 2000 ); }); </script> </head> <body> <iframe id="uploads" src="http://192.168.1.70/test/iframe.html"></iframe> </body> 

Iframe.html的

 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>iframe.html example</title> </head> <body> <iframe src="http://192.168.1.70/test/noframe.html"></iframe> </body> 

noframe.html

 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>noframe.html example</title> </head> <body> <div id="element">some content</div> </body> 

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

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

iframeInner包含来自的元素

 <div id="element">other markup goes here</div> 

iframeContent将查找里面的元素

  <div id="element">other markup goes here</div> 

(find不search当前元素),这就是为什么它返回null。

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

所以这里是主html文件:

 <!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ Iframe = $('#frame1'); Iframe.on('load', function(){ IframeInner = Iframe.contents().find('iframe'); IframeInnerClone = IframeInner.clone(); IframeInnerClone.insertAfter($('#insertIframeAfter')).css({display:'none'}); IframeInnerClone.on('load', function(){ IframeContents = IframeInner.contents(); YourNestedEl = IframeContents.find('div'); $('<div>Yeepi! I can even insert stuff!</div>').insertAfter(YourNestedEl) }); }); }); </script> </head> <body> <div id="insertIframeAfter">Hello!!!!</div> <iframe id="frame1" src="Test_Iframe.html"> </iframe> </body> </html> 

正如你所看到的,一旦第一个Iframe被加载,我得到第二个并克隆它。 然后我把它重新插入DOM,所以我可以访问onload事件。 一旦这个加载,我检索从非克隆的内容(也必须加载,因为他们使用相同的src)。 然后,你可以做你想要的内容。

这是Test_Iframe.html文件:

 <!DOCTYPE html> <html> <head> </head> <body> <div>Test_Iframe</div> <iframe src="Test_Iframe2.html"> </iframe> </body> </html> 

和Test_Iframe2.html文件:

 <!DOCTYPE html> <html> <head> </head> <body> <div>I am the second nested iframe</div> </body> </html> 

你可能有一个时间问题。 您的document.ready命令可能在第二个iFrame加载之前触发。 你没有足够的信息来帮助更多 – 但让我们知道,如果这似乎是可能的问题。

您应该使用实时方法来渲染稍后渲染的元素,例如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

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

最安全的方法是依靠纯粹的基于DOM的方法来parsing你的内容。

或者,从jQuery开始,然后一旦进入你的iframe,如果typeof window.jQuery == 'undefined'testing一次,如果它是真的,jQuery没有在里面启用,并回退基于DOM的方法。