手写在线工具----如何让原来的html不改变?

请看这个在线工具:
https://c.runoob.com/front-en...

我没有写js,只有html,css

image.png

现在,我写一个js

var oP = document.getElementById("html");
oP.innerHTML = "<p>test----revised by js</p>";

image.png

请注意:原来的html窗口内的东西没有变化。js运行后的结果在iframe窗口里面。

我完成了一个自己写的简单的在线工具,现在全部贴上来

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自制在线工具</title>
</head>
<body>
<style type="text/css">
*{font-size:20px;}
#html{width: 1000px;height: 200px;border:1px solid red;}
#css{width: 1000px;height: 200px;border:1px solid red;}
#js{width: 1000px;height: 200px;border:1px solid red;}
#iframe{width: 1000px;height: 800px;border:1px solid red;}
</style>
<div class="html">
    <textarea id="html" name="" cols="30" rows="10"></textarea>
</div>
<div class="css">
    <textarea id="css" name="" cols="30" rows="10"></textarea>
</div>
<div class="css">
    <textarea id="js" name="" cols="30" rows="10"></textarea>
</div>
<div class="button">
    <button id="button">显示效果</button></div>
<div class="iframe">
    <iframe id="iframe" frameborder="0" sandbox="allow-script allow-popups allow-forms"></iframe>
</div>
<script charset="utf-8" type="text/javascript">
var ele = document.getElementById("button");
ele.addEventListener("click", function(){
    var  obHtml = document.getElementById("html").value;
    var  obCss = document.getElementById("css").value;
    var  obJs = document.getElementById("js").value;
    var  obIframe = document.getElementById("iframe");
    myString = obHtml + '<style type="text/css">' +  obCss +'</style>' ;
    obIframe.srcdoc = myString;
    var script   = document.createElement("script");
    script.type  = "text/javascript";
    script.text  = obJs;
    obIframe.appendChild(script);    
})
</script>
</body>
</html>

没有写js的时候,点击显示效果后的状态:
image.png

我添加js代码后,再点击显示效果,请看

var oP = document.getElementById("html");
oP.value = "<p>test----revised by js</p>";

image.png

原来的html窗口中的

<p>test</p>

也改变成了

<p>test----revised by js</p>

如何保持html窗口中的最初形式不改变呢,像https://c.runoob.com/front-en...的行为一样?

阅读 1.7k
2 个回答

利用 data: 协议与 http(s)/file协议之间的跨域特性来进行隔离:

ele.addEventListener("click", function(){
  var obHtml = document.getElementById("html").value;
  var obCss = document.getElementById("css").value;
  var obJs = document.getElementById("js").value;
  var obIframe = document.getElementById("iframe");
  
  var wholeContent = `data:text/html,<!doctype HTML>
<html>
  <head>
    <meta charset="utf-8"/>
    <style>__CSS__</style>
  </head>
  <body>
    __HTML__
    <script>__JS__</script>
  </body>
</html>
`.replace('__CSS__', obCss)
 .replace('__HTML__', obHtml)
 .replace('__JS__', obJs);

 obIframe.src = wholeContent;
});
  • <script> 不要 appendChild 进去,直接在 <iframe> 的 HTML 中设置
  • JS 的内容需要转义,最简单的方案是

    const script = document.createElement('script')
    script.type = 'text/javascript'
    script.text = code
    iframe.srcdoc = ... + script.outerHTML
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题