删除脚本元素不会做任何事情。如果你能以某种方式访问一个脚本元素,它是很久以前执行的,删除它不会有任何效果。
所以我们需要解决它。如果您的脚本元素位于页面顶部,如下所示:
<head>
<script src="yourscript.js"></script>
您可以向同一页面发出同步 ajax 请求,因此您可以将其内容解析为新文档,修改所有脚本标签,然后将当前文档替换为修改后的文档。
var xhr = new XMLHttpRequest,
content,
doc,
scripts;
xhr.open( "GET", document.URL, false );
xhr.send(null);
content = xhr.responseText;
doc = document.implementation.createHTMLDocument(""+(document.title || ""));
doc.open();
doc.write(content);
doc.close();
scripts = doc.getElementsByTagName("script");
//Modify scripts as you please
[].forEach.call( scripts, function( script ) {
script.removeAttribute("src");
script.innerHTML = 'alert("hello world");';
});
//Doing this will activate all the modified scripts and the "old page" will be gone as the document is replaced
document.replaceChild( document.importNode(doc.documentElement, true), document.documentElement);
不幸的是,这不能在 jsfiddle 或 jsbin 中设置。但是您应该能够将这段代码完全复制粘贴到谷歌浏览器中此页面的控制台中。您应该会看到警报,并且当您检查 live dom 时,每个脚本都被修改了。
不同之处在于我们是在页面上执行脚本之后运行它,所以旧脚本应该仍然在页面上具有工作效果。这就是为什么要让它工作,你需要成为页面上的第一个脚本来执行它。
经测试可在谷歌浏览器中使用。doc.write
由于某种原因,Firefox 完全忽略了这个调用。