【问题标题】:How can I remove script elements before they are being executed?如何在执行脚本元素之前删除它们?
【发布时间】:2012-07-20 18:42:44
【问题描述】:

如何在脚本元素被执行之前删除它们

我考虑过使用 DOMNodeInserted 事件,但显然它没有捕获脚本元素。我也尝试过像这样使用 jQuery livequery 插件:

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

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

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

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

【问题讨论】:

  • 我不知道解决办法,但我有个问题:为什么要删除它们(似乎是因为用户而添加的)?如果有人想执行代码,他也可以使用javascript控制台?
  • 如果您可以检测到脚本并阻止它执行,则修改代码应该很容易,因为您只需获取 src 属性,将其加载为文本(在 ajax 中),修改并执行它。在您可以使用突变观察者观看 DOM 之后,但是要使其正常工作,浏览器需要在加载和执行文件之前添加脚本标记,我找不到任何相关信息。好像是后者,然后检测脚本标签的插入将是无用的,因为它们已经运行了。
  • 只是想在不知道上下文或问题的情况下补充说,这听起来像是一种奇怪的解决方案方法,并且是一种让你很头疼的方法。如果您解释上下文,也许有些人可能会提出更明智的解决方案
  • 您要解决的真正问题是什么?您当前的解决方案路径似乎很奇怪,而且不太可能成功,因此您可能有更好的机会支持并解释您要解决的真正问题。
  • @AlonGubkin 那些脚本是动态添加的吗?

标签: jquery


【解决方案1】:

删除脚本元素不会做任何事情。如果你能以某种方式访问​​脚本元素,它是很久以前执行的,删除它不会有任何效果。

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

<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 时,每个脚本都被修改了。

不同之处在于我们是在页面上执行脚本之后运行它,所以旧脚本应该仍然在页面上具有工作效果。 这就是为什么要让它工作,你需要成为页面上的第一个脚本来执行它。

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

【讨论】:

    【解决方案2】:

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

    $.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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多