gpt4 book ai didi

javascript - 我正在制作一个代码编辑器应用程序,可让您执行 HTML/CSS/JS 代码,但 JavaScript 仅执行一次

转载 作者:行者123 更新时间:2023-11-29 23:02:42 25 4
gpt4 key购买 nike

每个 HTML、CSS 和 JS 都有 3 个文本区域。例如,在 CSS 和 HTML 文本区域内键入: html { 背景:绿色; 将使 iframe 变为绿色,然后您可以在不刷新页面的情况下将绿色更改为蓝色,并且 iframe 变为蓝色。但是当我编写 JS 代码时它只执行一次,例如 document.write("1"); 在 iframe 中打印 1 但如果我添加另一个 document.write("2") ; 它将 iframe 留空。

    // Executing code when clicking RUN

$("#runButton").click(function() { // Adds the CSS code // Adds the HTML code
$("iframe").contents().find("html").html('<style>' + $("#cssCode").val() + '</style>' + $("#htmlCode").val());
/* ~~~~~~~~~~~~~~~ Placing the code from the containers into the iframe (BROWSER container) ~~~~~~~~~~~~~~~ */


// Evaluating JavaScript
document.getElementById("browserFrame").contentWindow.eval($("#jsCode").val());


});

每次添加 JS 代码时,我都希望在 iframe 中出现新的输出,就像在 HTML 和 CSS 中一样。请在这里尝试:https://online-code-editor.netlify.com/
(不要介意消失的图标)

更新:
我发现这个 document.getElementById("browserFrame").contentDocument.location.reload(true);
重新加载了我的 iframe,但是速度太快了,有没有办法让它只工作什么时候点击RUN?
或者添加一定的延迟

最佳答案

而不是重新加载 iframe - 使用 postMessage .
这是一个示例 - 具有包含 HTML、CSS、JS textarea 的父页面和用于预览目的的沙盒 iframe:

enter image description here

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>App</title>
<style>*{margin:0;box-sizing:border-box;} iframe,textarea{width:100%;min-height:3em;}</style>
</head>
<body>

<textarea id="html">Hello, stack &lt;b&gt;overflow!&lt;/b&gt;</textarea>
<textarea id="css">body {background: #F48024;}</textarea>
<textarea id="js">document.body.innerHTML = "&lt;b&gt;World!&lt;/b&gt;";</textarea><br>
<iframe id="iframe" src="iframe.html" sandbox="allow-same-origin allow-scripts allow-modals allow-forms" frameborder="0"></iframe>

<script>
const textareas = document.querySelectorAll("#css, #html, #js");
const iframe = document.querySelector("#iframe");
const post = () => textareas.forEach(el => iframe.contentWindow.postMessage({
id: el.id,
value: el.value
}, '*')); // Use 'http://example.com' instead of '*'

// Setup Events and Iframe Init
textareas.forEach(el => el.addEventListener('input', post));
iframe.addEventListener('load', post);
</script>
</body>
</html>

iframe.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Iframe</title>

<style id="__app__css"></style>
<script id="__app__js"></script>
<script>
window.addEventListener('message', (evt) => {
// if (evt.origin !== "http://example.com") return; // Fix and uncomment in production
document.getElementById(`__app__${evt.data.id}`).innerHTML = evt.data.value;
if (evt.data.id==='js') eval(evt.data.value);
});
</script>
</head>

<body id="__app__html"></body>

</html>

上面只是一个让你开始的演示,evals as-you-type 这在键入 for 循环时可能很危险,或者烦人地尝试键入 alert("something") - 您可以通过添加一个复选框 “Autorun” 和一个变为 un隐藏 如果未选中自动运行。
还要确保在生产中使用 postMessage origin

https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
https://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

关于javascript - 我正在制作一个代码编辑器应用程序,可让您执行 HTML/CSS/JS 代码,但 JavaScript 仅执行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55347213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com