javascript“代码”正在更新,但您忽略了示例代码绑定到文档的已委托事件。
文档上的任何后续委托事件都将简单地“附加”到已经绑定的事件。这就是为什么尽管可见的“代码”发生了变化,但您仍然看到以前的处理程序触发了。
每次您想要更新代码时,只需“重新加载”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();
});