gpt4 book ai didi

jquery - CodeMirror,在 keyup 上更新 iframe 脚本

转载 作者:行者123 更新时间:2023-12-01 08:34:58 24 4
gpt4 key购买 nike

我有一个带有 codemirror 编辑器和 iframe 的小部件,我正在附加一个带有预定义内容的脚本标记。

我正在尝试更新 keyup 上的脚本标签内容,它正在工作,但它实际上并没有“更新”javascript。

解释一下:预定义代码有一个点击事件,将 sample-div 背景颜色更改为蓝色,如果我编辑代码来更改 颜色为蓝色,当我单击sample-div时,它会将背景颜色更改为蓝色。

这很奇怪,因为 iframe 脚本标记获取了正确的“文本”。

由于某种原因无法在代码片段中工作,所以这里是 fiddle https://jsfiddle.net/hannacreed/tkp5c017/3/

最佳答案

JavaScript“代码”正在更新,但您忽略了示例代码绑定(bind)到文档的已委托(delegate)事件。

文档上的任何后续委托(delegate)事件都将简单地“附加”到已绑定(bind)的事件。这就是为什么尽管可见的“代码”发生变化,您仍然会看到以前的处理程序另外触发。

每次您想要更新代码时,只需“重新加载”iframe 即可。我所说的重新加载是指重新创建 iframe 元素。当然,这对于 keyup 来说可能会很昂贵,因此您可能还需要考虑限制重新加载。

参见this forked fiddle对于工作版本。

本质上,您需要一个生成 iframe 内容的函数...

function getFrameContents() {
return `<!doctype html>
<html>
<head>
<style>body { background: #fff; } .sample-div { background: #333; padding: 10px; width: fit-content; height: fit-content; border-radius: 10px; position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);</style>
<script>window.$ = parent.$;<\/script>
<script>${editor.getValue().toString()}<\/script>
</head>
<body>
<div class="wrapper">
<div class="sample-div"><label>here is some text.</label></div>
</div>
</body>
</html>`;
}

您还需要一个函数来创建新的 iframe 来代替旧的 iframe,从而用生成的内容替换文档(根据调用上述函数)。

function reloadFrame () {
var iframe = widget.find('iframe').replaceWith(document.createElement('iframe'));
iframe = widget.find('iframe');
var doc = iframe.contents()[0];
var contents = getFrameContents();
doc.open();
doc.writeln(contents);
doc.close();
}

最后,在加载和 keyup 时调用 reloadFrame(考虑限制)。

// load initial frame
reloadFrame();

// trigger reload on keyup
$(document).on('keyup', '.CodeMirror', function () {
reloadFrame();
});

关于jquery - CodeMirror,在 keyup 上更新 iframe 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57419625/

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