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

效果截图

相关推荐
大怪v3 分钟前
前端佬们,装起来!给设计模式【祛魅】
前端·javascript·设计模式
vvilkim28 分钟前
Vue.js 插槽(Slot)详解:让组件更灵活、更强大
前端·javascript·vue.js
学无止境鸭34 分钟前
uniapp报错 Right-hand side of ‘instanceof‘ is not an object
前端·javascript·uni-app
豆豆(设计前端)39 分钟前
一键秒连WiFi智能设备,uni-app全栈式物联开发指南。
前端
Aphasia31142 分钟前
🧑🏻‍💻前端面试高频考题(万字长文📖)
前端·面试
程序饲养员1 小时前
Javascript中export后该不该加default?
前端·javascript·前端框架
腥臭腐朽的日子熠熠生辉1 小时前
nvm 安装某个node.js版本后不能使用或者报错,或不能使用npm的问题
前端·npm·node.js
最新资讯动态1 小时前
点击即玩!《萌宠历险记》现身Pura X外屏,随时随地开启轻松解压之旅
前端
一只韩非子1 小时前
一句话告诉你什么叫编程语言自举!
前端·javascript·后端
虾球xz2 小时前
游戏引擎学习第168天
前端·学习·游戏引擎