如何在执行脚本元素之前将其删除?

如何在执行脚本元素之前将其删除?

我想过使用DOMNodeInserted事件,但显然它不会捕获脚本元素。 我也尝试过使用jQuery livequery插件:

$("script").livequery(function () { $(this).remove(); }); 

它确实删除了脚本元素,但是在执行之后。

我正在寻找一个跨浏览器的解决方案,但我甚至不确定这是否可行。 我读到关于Mutation Observers的内容似乎足够接近,但我不确定它是否可以解决我的问题。

如果有一种方法可以在执行脚本内容之前修改脚本内容而不删除并重新创建它,那就更好了。

删除脚本元素不会执行任何操作。 如果你可以以某种方式访问​​一个脚本元素,它很久以前就被执行了,删除它将没有任何效果。

所以我们需要解决它。 如果您的脚本元素位于页面顶部,如下所示:

   

您可以对同一页面发出同步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中设置。 但您应该能够将此代码完全复制粘贴到Google Chrome浏览器的此页面控制台中。 您应该看到警报,当您检查实时dom时,每个脚本都被修改。

不同之处在于,我们在页面上执行脚本后运行此脚本,因此旧脚本仍应对页面起作用。 这就是为什么要实现这一点,您需要成为页面上第一个执行此操作的脚本。

经测试可在谷歌浏览器中使用。 由于某种原因,Firefox完全忽略了doc.write调用。

我不知道你要做什么。 但最好是根据请求加载它们而不是在某些条件下删除它们。

 $.getScript('helloworld.js', function() { $("#content").html(' Javascript is loaded successful! '); }); 

如果要在执行之前删除脚本,则无法执行。 但你可以做的是,在一个条件下以编程方式删除脚本,如果有内存泄漏问题,那么你可以在删除脚本之前调用下面的代码。

 var var1 = 'hello'; var cleanAll = function () { delete window.var1; delete window.cleanAll; }; // unload all resources cleanAll();