【问题标题】:How to get the body's content of an iframe in Javascript?如何在 Javascript 中获取 iframe 的正文内容?
【发布时间】:2017-05-22 04:09:45
【问题描述】:
<iframe id="id_description_iframe" class="rte-zone" height="200" frameborder="0" title="description">
  <html>
    <head></head>
    <body class="frameBody">
      test<br/>
    </body>
  </html>
</iframe>

我想得到的是:

test<br/>

【问题讨论】:

  • 重要提示:如果 iFrame 是跨域的,则您无法访问它的内容。见Same-Origin policy

标签: javascript html iframe


【解决方案1】:

确切的问题是如何使用纯 JavaScript 而不是 jQuery。

但我总是使用可以在 jQuery 的源代码中找到的解决方案。 这只是一行原生 JavaScript。

对我来说,这是获取 iframe 内容的最佳、易读甚至 afaik 最短的方法。

首先获取您的 iframe

var iframe = document.getElementById('id_description_iframe');

// or
var iframe = document.querySelector('#id_description_iframe');

然后使用jQuery的解决方案

var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;

它甚至可以在 Internet Explorer 中工作,它在 iframe 对象的 contentWindow 属性期间执行此技巧。大多数其他浏览器使用contentDocument 属性,这就是我们首先在 OR 条件中证明此属性的原因。如果未设置,请尝试contentWindow.document

选择 iframe 中的元素

那么您通常可以使用getElementById() 甚至querySelectorAll()iframeDocument 中选择DOM-Element:

if (!iframeDocument) {
    throw "iframe couldn't be found in DOM.";
}

var iframeContent = iframeDocument.getElementById('frameBody');

// or
var iframeContent = iframeDocument.querySelectorAll('#frameBody');

在 iframe 中调用函数

仅从iframe 中获取window 元素以调用一些全局函数、变量或整个库(例如jQuery):

var iframeWindow = iframe.contentWindow;

// you can even call jQuery or other frameworks
// if it is loaded inside the iframe
iframeContent = iframeWindow.jQuery('#frameBody');

// or
iframeContent = iframeWindow.$('#frameBody');

// or even use any other global variable
iframeWindow.myVar = window.myVar;

// or call a global function
var myVar = iframeWindow.myFunction(param1 /*, ... */);

注意

如果您观察same-origin policy,这一切皆有可能。

【讨论】:

  • iframe 在这里没有定义,要么你应该写完整的代码,要么不应该用它写 jQuery
  • 请见谅,但这行代码是jquery代码的摘录,代码块是我自己的示例代码。其余的应该有人让自己出去。您唯一缺少的是变量 iframe。而且我不可能知道你的 iframe 在哪里或者它的 ID 是怎样的。
  • 您能否在答案顶部添加一条警告,如果 iframe 具有远程 src,这将不起作用?如果我错了,如果您能指出我如何在不发送另一个 HTTP 请求的情况下仍然可以获取 iframe 内容(不可能,因为我需要执行 javascript 来构造 iframe 内容并且不想部署第二个 JavaScript 环境(如果可以避免)。
  • 我有这样的警告。但在我的解释结束时。您必须遵守同源政策。就是这样。
  • 为了使上述工作正常进行,我必须将其附在document.querySelector('#id_description_iframe').onload = function() {... 中,希望对某人有所帮助。
【解决方案2】:

使用 JQuery,试试这个:

$("#id_description_iframe").contents().find("body").html()

【讨论】:

  • 它不起作用,因为“域、协议和端口必须匹配。”:不安全的 JavaScript 尝试使用 URL 访问框架
  • 如前所述,如果域匹配,它将起作用。仅供参考,我刚刚发现 $("#id_description_iframe #id_of_iframe_body").html() 确实可以在 Chrome 中工作,但不适用于所有 firefox 版本,因此使用上述内容很好。 IE。 $("#id_description_iframe #id_of_iframe_body").contents().find("body").html() 在两者中都有效
【解决方案3】:

它非常适合我:

document.getElementById('iframe_id').contentWindow.document.body.innerHTML;

【讨论】:

  • 这很奇怪,但对我来说.body 不起作用。但是.getElementsByTagName('body')[0] 可以。
  • 它不是“.body”,只是“body”。删除点
  • 如果您使用香草 javascript,这应该是答案。
【解决方案4】:

AFAIK,不能以这种方式使用 iframe。您需要将其 src 属性指向另一个页面。

以下是使用平面旧 javascript 获取其正文内容的方法。这适用于 IE 和 Firefox。

function getFrameContents(){
   var iFrame =  document.getElementById('id_description_iframe');
   var iFrameBody;
   if ( iFrame.contentDocument ) 
   { // FF
     iFrameBody = iFrame.contentDocument.getElementsByTagName('body')[0];
   }
   else if ( iFrame.contentWindow ) 
   { // IE
     iFrameBody = iFrame.contentWindow.document.getElementsByTagName('body')[0];
   }
    alert(iFrameBody.innerHTML);
 }

【讨论】:

  • 它在 safari(即分支)上运行
  • 存在跨域问题,阻止了来源为“someOther.com”的框架访问跨域框架。
【解决方案5】:

在带有 JS 的 iframe 中使用 content

document.getElementById('id_iframe').contentWindow.document.write('content');

【讨论】:

    【解决方案6】:

    我认为在标签之间放置文本是为无法处理 iframe 的浏览器保留的,即...

    <iframe src ="html_intro.asp" width="100%" height="300">
      <p>Your browser does not support iframes.</p>
    </iframe>
    

    您使用 'src' 属性来设置 iframe html 的来源...

    希望对您有所帮助:)

    【讨论】:

      【解决方案7】:

      Chalkey 是正确的,你需要使用 src 属性来指定要包含在 iframe 中的页面。如果你这样做了,并且 iframe 中的文档与父文档在同一个域中,你可以使用这个:

      var e = document.getElementById("id_description_iframe");
      if(e != null) {
         alert(e.contentWindow.document.body.innerHTML);
      }
      

      显然,您可以对内容做一些有用的事情,而不仅仅是将它们放在警报中。

      【讨论】:

        【解决方案8】:

        以下代码是跨浏览器兼容的。它适用于 IE7、IE8、Fx 3、Safari 和 Chrome,因此无需处理跨浏览器问题。没有在 IE6 中测试。

        <iframe id="iframeId" name="iframeId">...</iframe>
        
        <script type="text/javascript">
            var iframeDoc;
            if (window.frames && window.frames.iframeId &&
                (iframeDoc = window.frames.iframeId.document)) {
                var iframeBody = iframeDoc.body;
                var ifromContent = iframeBody.innerHTML;
            }
        </script>
        

        【讨论】:

        • 下面的 html 在 Mac 上的 Chrome 7 中为我工作。我在 Windows 上的 Chrome 6 中测试了这篇原始帖子,效果很好。
        • window.frames.iframeId.document 对我来说是未定义的。 (Ubuntu 13.04、Chrome)
        【解决方案9】:

        要从 javascript 获取正文内容,我尝试了以下代码:

        var frameObj = document.getElementById('id_description_iframe');
        
        var frameContent = frameObj.contentWindow.document.body.innerHTML;
        

        其中“id_description_iframe”是您的 iframe 的 ID。 这段代码对我来说很好用。

        【讨论】:

        • 请始终将您的答案放在上下文中,而不仅仅是粘贴代码。有关详细信息,请参阅here
        • 仅代码的答案被认为是低质量的:请务必说明您的代码的作用以及它如何解决问题。如果您可以在帖子中添加更多信息,它将帮助提问者和未来的读者。另请参阅解释完全基于代码的答案:meta.stackexchange.com/questions/114762/…
        【解决方案10】:

        如果您不仅想选择 iframe 的正文,还想在其中插入一些内容,并且使用纯 JS、没有 JQuery 和没有 document.write(),我有一个解决方案,没有其他答案提供。

        您可以使用以下步骤

        1.选择您的 iframe:

        var iframe = document.getElementById("adblock_iframe");
        

        2.创建一个要插入框架的元素,比如一张图片:

        var img = document.createElement('img');
        img.src = "https://server-name.com/upload/adblock" + id + ".jpg";
        img.style.paddingLeft = "450px";
        //scale down the image is we have a high resolution screen on the client side
        if (retina_test_media == true && high_res_test == true) {
            img.style.width = "200px";
            img.style.height = "50px";
        } else {
            img.style.width = "400px";
            img.style.height = "100px";
        }
        img.id = "image";
        

        3.将图片元素插入iframe:

        iframe.contentWindow.document.body.appendChild(img);
        

        【讨论】:

          【解决方案11】:

          一行代码即可获取iframe body的内容:

          document.getElementsByTagName('iframe')[0].contentWindow.document.body.innerText;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多