ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动态创建的 iframe 给定 HTML 后, contentDocument = null 问题

2022-05-25 17:00:56  阅读:127  来源: 互联网

标签:contentDocument oIframe null 动态创建 HTML iframe document


问题描述

在使用 iframe 解析一个 HTML 时, 通过 document.createElement('iframe') 创建 iframe, 并设置 srcdoc 后, 发现 contentDocument = null

复现代码如下:

  const oIframe = document.createElement('iframe')
  oIframe.srcdoc = `<!doctype html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport"
            content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <p>我是段落</p>
    </body>
  </html>`

  oIframe.style.display = 'none'
  const oP = oIframe.contentDocument.querySelector('p')
  console.log(oP.innerText)

上面代码会报错:

VM4928:17 Uncaught TypeError: Cannot read properties of null (reading 'querySelector')
    at <anonymous>:17:38

意思是: iframe 的 contentDocument 为 null。

这是因为在 在 javascript 中创建的 iframesrcdoc 不会触发 HTML 解析器,直到元素被插入到文档中。 然后更新 HTML,调用HTML解析器并按预期处理属性。

解决方法

将创建好的 iframe 插入到 文档中, 并在加载成功后, 再进行文档操作。

  const oIframe = document.createElement('iframe')
  oIframe.srcdoc = `<!doctype html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport"
            content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <p>我是段落</p>
    </body>
  </html>`

  oIframe.style.display = 'none'

  document.body.appendChild(oIframe)
  oIframe.onload = () => {
    const oP = oIframe.contentDocument.querySelector('p')
    console.log(oP.innerText)

    // 使用完毕后移除
    document.body.removeChild(oIframe)
  }

可以正常输出 我是段落

参考

Creating an iframe with given HTML dynamically

标签:contentDocument,oIframe,null,动态创建,HTML,iframe,document
来源: https://www.cnblogs.com/taohuaya/p/16309876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有