我正在编写一个电子应用程序,但这是一个关于JavaScript / HTML5的问题。我想在webview中加载本地内容,然后从其中的特定远程资源打开iframe。不幸的是,由于X-FRAME options,我无法做到。所以我来了一个解决方法。我们的想法是加载远程内容,擦除dom并使用自定义文件协议注入我自己的本地内容以嵌入本地资源。
基本上我想完全删除所有内容,无论加载到webview中的是什么。我用document.write()删除了dom部分。但是,如何取消设置该页面可能设置的所有变量?或者我可以首先阻止文档被写入?或者,有什么更好,更少的hacky方式来做我想做的事情?这是我当前删除dom的代码:
它从preload脚本开始运行,之前是其他任何东西:
(function() {
var originalProperties = Object.getOwnPropertyNames(window); //global variables, before dom is loaded
var injectDOM = function() {
document.removeEventListener('DOMContentLoaded', injectDOM);
//trying to erase global variables set by remote resource, if any. Is there a better way?
var newProperties = Object.getOwnPropertyNames(window);
var difference = newProperties.filter(x => originalProperties.indexOf(x) == -1);
for (i = 0; i < newVariables.length; i++) {
if (window.hasOwnProperty(newVariables[i])) {
window[newVariables[i]] = null;
delete window[newVariables[i]]
//some variables still stay, delete return false, however they are nulled
//but is there a better way to do that and what about possible attached event listeners?
}
}
var html = '';
html += '<!-- automagically injected-->';
html += '<!DOCTYPE html>';
html += '<html>';
html += '<head>';
//html += '<script>alert("test");</script>';
html += '</head>';
html += '<body>';
html += 'hello world';
html += '</body>';
html += '</html'>;
document.write(html);
}
document.addEventListener('DOMContentLoaded', injectDOM);
我还尝试在加载dom之前和之后比较Object.getOwnPropertyNames(window),但有些东西告诉我它不是最好的方法。
更新:我设法通过@ wOxxOm的帮助更加优雅地解决问题。我在最初的github问题https://github.com/electron/electron/issues/5036
中发布了我的解决方案