3

Chrome 中是否有等效的 onbeforescriptexecute 或 beforescript 执行事件?我想在页面上的任何 javascript 加载之前拦截并打印出正在执行的 javascript 代码。这应该包括脚本标签中的 Javascript 和其他属性,如 onblur 等。
谢谢

4

3 回答 3

7

这是一个onbeforescriptexecute事件的polyfill:https ://gist.github.com/jspenguin2017/cd568a50128c71e515738413cd09a890

它适用于 Chrome 和 Edge,但具有讽刺意味的是,它不适用于 Firefox。

要打印脚本内容,只需console.log(e.script.textContent);在事件处理程序中执行。您可以调用e.replacePayload(payload);以更改要运行的脚本,或e.preventDefault()阻止脚本。

e.preventDefault();优先于e.replacePayload(...);,如果e.replacePayload(...);被多次调用,最后一次调用将覆盖所有之前的调用。您可以调用e.stopPropagation();以确保您的新有效负载已注册。

不幸的是,textContent对于大型脚本并不总是正常工作。调试应该没问题。此外,它仅适用于“硬编码”内联脚本,而不适用于从其他脚本动态注入的那些。您仍然可以监视这些脚本,但不能干扰它们的执行。

这有点棘手onblur,您可能必须使用自定义观察者来扫描它。

于 2017-09-13T02:57:22.853 回答
0

一个非常糟糕的建议:

好吧,默认情况下,脚本是以同步(带空格,而不是async)的方式加载的。因此,您可以访问最新加载的脚本标签,<script>在 head 中查找最后一个现有标签(这几乎与您想要实现的目标完全相反。

我很高兴看到您的问题的任何其他答案(可能是更好的答案),但使用这种行为的整个想法对我来说看起来很糟糕。

稍微好一点的

通常,要执行此类操作,您应该通过 ajax 加载脚本并在将它们添加到 DOM 并执行之前对其进行处理。

在我看来,最好的解决方案是使用带有 AMD 加载器(例如require.js)的异步模块,这样可以让您的代码更有条理。

我确实意识到它不能解决你的问题,但希望我能帮助你一点:)

于 2013-08-08T09:12:02.613 回答
0

我认为它仅适用于 Firefox :( 抱歉。

于 2013-08-08T08:23:29.320 回答