如何使用document.getElementById在iframe中选择元素


71

我有iframe这样的

<iframe name="myframe1" id="myframe1" width="100%" height="100%" src="a.html">
<html>
    <head></head>
    <frameset name="myframe2" cols="0%, 100%" border="0" frameBorder="0" frameSpacing="0">
        <frame name="page1" src="c.html" scrolling="no"></frame>
        <frame name="page2" src="d.html" >
            <html>
                <head></head>
                <body id="top">
                    <div id="div1">
                        <div id="div2">
                            <div id="div3">
                                <ul id="x">
                                    <li>a</li>
                                    <li>b</li>
                                </ul>
                            </div>
                        </div>
                    </div>
                </body>
            </html>

        </frame>

    </frameset>
</html>
</iframe>

我想引用元素“ x”。我尝试了几种方法,但是找不到解决方案。


Answers:


169
document.getElementById('myframe1').contentWindow.document.getElementById('x')

小提琴

contentWindow 所有浏览器(包括较旧版本的IE)都支持该功能。

请注意,如果iframesrc是从另一个域,您将无法访问其内容,由于同源策略


42
最后一句话很重要;)您框架的来源必须位于页面的同一域中
Sali Hoo

20

用于contentDocument实现这一目标

var iframe = document.getElementById('iframeId');
var innerDoc = (iframe.contentDocument) 
               ? iframe.contentDocument 
               : iframe.contentWindow.document;

var ulObj = innerDoc.getElementById("ID_TO_SEARCH");

3

(这是添加到选择的答案中)

确保iframe先加载

contentWindow.document

否则,您getElementById将成为null

PS:无法发表评论,仍然没有很高的声誉来发表评论,但这是对所选答案的补充,因为我花了一些时间进行调试,以弄清楚iframe在选择inner-iframe元素之前应该强制加载。


0

就我而言,我试图抓住pdfTron工具栏,但不幸的是,每次刷新页面时,其ID都会更改。

因此,我最终这样做了。

const pdfToolbar = document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById('HeaderItems');

就像在tagName编写的数组中一样,您的应用程序中将始终具有iFrame的固定索引。


0

您需要确保框架已完全加载,最好的方法是使用onload:

<iframe id="nesgt" src="" onload="custom()"></iframe>

function custom(){
    document.getElementById("nesgt").contentWindow.document;
    }

iframe完全加载后,此功能将自动运行。

可以使用setTimeout完成,但是我们无法获得帧加载的确切时间。

希望这对某人有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.