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

效果截图

相关推荐
TimelessHaze25 分钟前
拆解字节面试题:async/await 到底是什么?底层实现 + 最佳实践全解析
前端·javascript·trae
执键行天涯1 小时前
从双重检查锁定的设计意图、锁的作用、第一次检查提升性能的原理三个角度,详细拆解单例模式的逻辑
java·前端·github
青青子衿越1 小时前
微信小程序web-view嵌套H5,小程序与H5通信
前端·微信小程序·小程序
OpenTiny社区1 小时前
TinyEngine 2.8版本正式发布:AI能力、区块管理、Docker部署一键强化,迈向智能时代!
前端·vue.js·低代码
qfZYG1 小时前
Trae 编辑器在 Python 环境缺少 Pylance,怎么解决
前端·vue.js·编辑器
bug爱好者1 小时前
Vue3 基于Element Plus 的el-input,封装一个数字输入框组件
前端·javascript
Silence_xl2 小时前
RACSignal实现原理
前端
柯南二号2 小时前
【大前端】实现一个前端埋点SDK,并封装成NPM包
前端·arcgis·npm
dangkei2 小时前
【Wrangler(Cloudflare 的官方 CLI)和 npm/npx 的区别一次讲清】
前端·jvm·npm
乔公子搬砖2 小时前
小程序开发提效:npm支持、Vant Weapp组件库与API Promise化(八)
前端·javascript·微信小程序·js·promise·vagrant·事件绑定