首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拦截脚本加载

拦截脚本加载
EN

Stack Overflow用户
提问于 2014-07-17 16:51:44
回答 3查看 2.4K关注 0票数 2

我需要的是钩/拦截其他外部JS负载。我可以把js放在文档的任何地方。

示例:

代码语言:javascript
复制
<script src="hook.js"></script>
<script src="a.js"></script>
<script src="b.js"></script>

Hook.js应该拦截a.js和b.js。问题是,在执行hook.js时,我看不到其他脚本(document.scripts只包含hook.js),文档就绪事件也太晚了(执行脚本a.js和b.js )。

在执行之前,是否有任何方法“查看”其他脚本标记?谢谢你的帮助

编辑

  1. 我需要在hook.js中做任何“魔术”,而不用动(静态)其他HTML。
  2. 无jQuery
EN

回答 3

Stack Overflow用户

发布于 2020-04-14 07:51:40

值得注意的是:https://stackoverflow.com/a/59424277/2016831您可以使用MutationObserver来查看哪些元素正在添加到DOM中,当它们被添加时,只需更改源代码,或者如果它引用了另一个URL,只需将其重定向到您自己的服务器上,而不是使用原始URL作为get参数,然后以这种方式返回修改过的代码。

基于上述答案,您可以这样做:

代码语言:javascript
复制
<script>
new MutationObserver((m, o) => {
  let potentialScript = document.querySelector("script + script");
  console.log(potentialScript.textContent);
  if(potentialScript) {
    o.disconnect();
    potentialScript
    .textContent = 
    potentialScript
    .textContent
    .replace(
      "})()",
      `
        window.wow = mySecretMethod;
        })()
      `
    );
    
    
  }
}).observe(
  document.body,
  {
    childList:1
  }
);

</script>

<script>
(function() {
  let mySecretMethod = () => {
    //does a bunch of evil secret stuff
    console.log("HA!");
  };
})();

wow()
</script>

<script>
console.log(wow())
</script>

或者,您可以使用chrome扩展重定向HTTP请求,有关更多信息,请参见https://stackoverflow.com/a/61202516/2016831

票数 2
EN

Stack Overflow用户

发布于 2014-07-17 17:10:16

如果我明白你想做的正确的话.

如果您可以控制脚本A和B的加载方式,最好的方法是将它们放在与当前页面相同的域上(可能通过代理),通过AJAX加载文件,然后以这种方式插入钩子。像jQuery这样的库(如m.casey所建议的)将使AJAX的细节和脚本的执行变得非常简单。

否则,Javascript实际上无法与文档的解析进行交互(这就是导致在示例中加载脚本a和b的原因,以及需要修改什么以“拦截”脚本加载),除非使用document.write来修改HTML流。当然,只有在同步加载(如示例代码中的hook.js )、加载到HTML而不是XHTML的情况下,如果之后可以放置第二个钩子来对修改后的HTML流进行后置处理,以及如果您确信HTML流不会脱离您的机制,这才能起作用。

例如..。

代码语言:javascript
复制
<script id="hook1">document.write("<"+"textarea id='capture'>");</script>
<script src="a.js"></script>
<script src="b.js"></script>
<script id="hook2">document.write("<"+"/textarea");</script>
<script id="hook3">doSomethingWith(document.getElementById("capture").value)</script>

请注意,这是一个巨大的黑客,您可能不应该这样做。

票数 1
EN

Stack Overflow用户

发布于 2014-07-17 16:57:47

如果您使用的是jQuery,您可以让hook.js加载您希望拦截的脚本,如下所示:

代码语言:javascript
复制
$.getScript("a.js");
$.getScript("b.js");

这将动态地创建脚本标记,并且您将确信hook.js始终会继续执行a.js和b.js。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24809309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档