通过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>

效果截图

相关推荐
恋猫de小郭1 小时前
Tailwind 因为 AI 的裁员“闹剧”结束,而 AI 对开源项目的影响才刚刚开始
前端·flutter·ai编程
要加油哦~1 小时前
算法 | 整理数据结构 | 算法题中,JS 容器的选择
前端·javascript·算法
一只小bit1 小时前
Qt 重要控件:多元素控件、容器类控件及布局管理器
前端·c++·qt
一 乐9 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
C_心欲无痕9 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
清沫9 小时前
Claude Skills:Agent 能力扩展的新范式
前端·ai编程
yinuo10 小时前
前端跨页面通信终极指南:方案拆解、对比分析
前端
yinuo11 小时前
前端跨页面通讯终极指南⑨:IndexedDB 用法全解析
前端
xkxnq11 小时前
第二阶段:Vue 组件化开发(第 16天)
前端·javascript·vue.js
烛阴11 小时前
拒绝配置地狱!5 分钟搭建 Three.js + Parcel 完美开发环境
前端·webgl·three.js