通过iframe在线运行HTML代码的三种方式

在线编辑运行HTML代码很常见,一般是通过 <iframe> 形式,利用其沙箱隔离特性。

那么要如何通过 <iframe> 运行HTML代码呢,本文介绍三种方式。

1. 通过 document.write 将 HTML 代码写入文档中

这是最常用的方式,因为是同源的,可以直接 iframe.contentDocument.write 写到 iframe 内的文档中。

html 复制代码
<textarea rows="10" onchange="render()"><h1>123</h1></textarea>
<iframe id="write"></iframe>
<script>
  function render() {
    const code = document.querySelector('textarea').value

    // write
    const writeIfr = document.getElementById('write')
    writeIfr.contentDocument.open()
    writeIfr.contentDocument.write(code)
    writeIfr.contentDocument.close()
  }
  render()
</script>

2. 通过 <iframe>srcdoc 属性直接内联 HTML 代码

srcdoc 属性是 HTML5 中的新属性。

srcdoc 属性规定要显示在内联框架中的页面的 HTML 内容。

html 复制代码
<textarea rows="10" onchange="render()"><h1>123</h1></textarea>
<iframe id="srcdoc" srcdoc=""></iframe>
<script>
  function render() {
    const code = document.querySelector('textarea').value

    // srcdoc
    const srcdocIfr = document.getElementById('srcdoc')
    srcdocIfr.srcdoc = code
  }
  render()
</script>

3. 通过将 HTML 代码创建一个 Blob 对象并转为 blob: URL 赋值给 <iframe>src 属性

URL.createObjectURL 用于创建一个代表文件(File)或二进制大对象(Blob)的 URL,这些 URL 可以用于在 Web 应用中引用文件的内容。

html 复制代码
<textarea rows="10" onchange="render()"><h1>123</h1></textarea>
<iframe id="blob" src=""></iframe>
<script>
  function render() {
    const code = document.querySelector('textarea').value

    // blob
    const blobIfr = document.getElementById('blob')
    const blob = new Blob([code], { type: 'text/html' })
    blobIfr.src = window.URL.createObjectURL(blob)
  }
  render()
</script>

完整代码

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        box-sizing: border-box;
      }
      body {
        margin: 0;
        padding: 1rem;
      }
      textarea {
        width: 100%;
      }
      iframe {
        width: 33.33%;
        height: 500px;
        float: left;
      }
    </style>
  </head>
  <body>
    <textarea rows="10" onchange="render()"><h1>123</h1></textarea>
    <iframe id="write"></iframe>
    <iframe id="srcdoc" srcdoc=""></iframe>
    <iframe id="blob" src=""></iframe>
    <script>
      function render() {
        const code = document.querySelector('textarea').value

        // write
        const writeIfr = document.getElementById('write')
        writeIfr.contentDocument.open()
        writeIfr.contentDocument.write(code)
        writeIfr.contentDocument.close()

        // srcdoc
        const srcdocIfr = document.getElementById('srcdoc')
        srcdocIfr.srcdoc = code

        // blob
        const blobIfr = document.getElementById('blob')
        const blob = new Blob([code], { type: 'text/html' })
        blobIfr.src = window.URL.createObjectURL(blob)
      }
      render()
    </script>
  </body>
</html>

效果截图

相关推荐
KaMeidebaby3 小时前
卡梅德生物技术快报|PD1 单克隆抗体定制配套 N 糖全谱质控开发
前端·人工智能·算法·数据挖掘·数据分析
nuIl4 小时前
实现一个 Coding Agent(3):工具调用
前端·agent·cursor
nuIl4 小时前
实现一个 Coding Agent(4):ReAct 循环
前端·agent·cursor
nuIl4 小时前
实现一个 Coding Agent(1):一次 LLM 调用
前端·agent·cursor
nuIl4 小时前
实现一个 Coding Agent(2):让 LLM 流式响应
前端·agent·cursor
copyer_xyf4 小时前
Python 异常处理
前端·后端·python
sugar__salt4 小时前
从栈队列数据结构到JS原型面向对象全解
前端·javascript·数据结构
独特的螺狮粉4 小时前
篮球集训班器具管理系统 - 鸿蒙PC Electron框架完整技术实现指南
前端·javascript·华为·electron·前端框架·开源·鸿蒙
pusheng20254 小时前
IFSJ全英文专访:中国创新力量重塑先进气体感知技术,赋能全球关键基础设施安全
前端·网络·人工智能·物联网·安全
AI_零食5 小时前
番茄钟鸿蒙PC Electron框架完成:状态机、定时器管理与专注力工具设计
前端·javascript·华为·electron·开源·鸿蒙·鸿蒙系统