警告:这显然有安全隐患!仅使用您绝对信任的来源的代码执行此操作。
这是一个基本的、直接的解决方案。它允许您拥有一个具有整个 html 结构的 observable,并用该数据填充 iFrame。如果您更新 html,则 iframe 会更新为新版本:
ko.bindingHandlers.iframeContent = {
update: function(element, valueAccessor) {
var value = ko.unwrap(valueAccessor());
element.contentWindow.document.close(); // Clear the content
element.contentWindow.document.write(value);
}
};
ko.applyBindings({
myHtml: ko.observable("<html>\n<head><title>Test</title></head>\n<body>\n\nMy <em>fine</em> text.\n\n</body>\n</html>")
});
您可以在视图中这样使用它:
<p>Edit your html:</p>
<textarea data-bind="value: myHtml, valueUpdate: 'afterkeydown'"></textarea>
<p>And see it appear in an iframe:</p>
<iframe data-bind="iframeContent: myHtml"></iframe>
有关演示,请参阅此 jsfiddle。valueUpdate
只是在那里,所以演示更清晰,在更大的场景中这是否是一个好主意是值得商榷的。