Chrome 中是否有等效的 onbeforescriptexecute 或 beforescript 执行事件?我想在页面上的任何 javascript 加载之前拦截并打印出正在执行的 javascript 代码。这应该包括脚本标签中的 Javascript 和其他属性,如 onblur 等。
谢谢
3 回答
这是一个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
,您可能必须使用自定义观察者来扫描它。
一个非常糟糕的建议:
好吧,默认情况下,脚本是以同步(带空格,而不是async
)的方式加载的。因此,您可以访问最新加载的脚本标签,<script>
在 head 中查找最后一个现有标签(这几乎与您想要实现的目标完全相反。
我很高兴看到您的问题的任何其他答案(可能是更好的答案),但使用这种行为的整个想法对我来说看起来很糟糕。
稍微好一点的
通常,要执行此类操作,您应该通过 ajax 加载脚本并在将它们添加到 DOM 并执行之前对其进行处理。
在我看来,最好的解决方案是使用带有 AMD 加载器(例如require.js)的异步模块,这样可以让您的代码更有条理。
我确实意识到它不能解决你的问题,但希望我能帮助你一点:)
我认为它仅适用于 Firefox :( 抱歉。