我如何在chrome执行之前拦截JS代码
how can i intercept JS code before exectution in chrome
我想创建chrome扩展到开发工具,我想拦截当前网页的JS代码之前,它是由浏览器编译或执行,实际上我想仪器JS代码之前,它在浏览器中运行。
谁能帮我们一下,这怎么可能呢?
没有办法挂钩到加载过程本身,但是具有未知类型的脚本不会作为脚本处理,这与具有自定义类型的脚本不执行这一事实相结合,是以下hack所依赖的。
调用window.stop
将阻止文档在其轨道上加载,如果我们在文档的最顶部调用它,我们可以假设文档没有加载。
然后,我们可以发出一个XHR请求来获取文档的内容,并在将修改后的内容写入文档之前进行一些搜索和替换,通过为文档中的所有脚本提供自定义脚本类型来呈现惰性。
window.stop();
var request = new XMLHttpRequest();
request.open('GET', location.href);
request.onload = function(event) {
var html = request.responseText
.replace(/type='"text'/javascript'"/g, '')
.replace(/<script/g, '<script type="x-instrument/javascript"');
document.open();
document.write(html);
document.close();
};
request.send(null);
在这一点上,所有的脚本都是惰性的,一个基本的顺序加载器看起来像这样:setTimeout(function next(index) {
var script = document.scripts[index];
if (script == null) {
return setTimeout(callback, 0);
}
if (script.hasAttribute('src')) {
var request = new XMLHttpRequest();
request.open('GET', script.getAttribute('src'));
request.onload = function() {
var code = instrument(request.responseText);
eval(code);
setTimeout(next, 0, ++index);
};
request.send(null);
} else {
var code = instrument(script.textContent);
eval(code);
setTimeout(next, 0, ++index);
}
}, 0, 0);
有了这个,任何页面都可以通过在文档的开头插入这个脚本来进行检测。
您也可以将其加载为chrome扩展中的内容脚本,但是,请确保run_at
设置为document_start
。
{
"manifest_version": 2,
"name": "instrument",
"version": "0.0.0",
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["instrument.js"],
"run_at": "document_start"
}
],
"web_accessible_resources": [
"instrument.js"
],
"permissions": [
"tabs", "<all_urls>"
]
}
示例相关文章:
- 为什么indexOf在这个js代码中不起作用
- js代码从jQuery转换为原生代码
- JS代码中的减号
- 谷歌地图Api和JS代码不工作
- HTML 5 和 3.js 代码不会在网页上显示任何内容
- 为什么这个JS代码打印未定义
- JS代码在jsbin中有效,在jsfiddle或Chrome/Safari中无效
- 页面加载后加载简单的JS代码
- 扩展JS代码
- 如何使用js代码转发reactjs路由器
- 用js代码重新定位文本
- 即使被信号处理程序中断,node.js代码也会一直运行到完成吗
- JS代码使IE9和Safari冻结,在Opera中不起作用
- 分析JS代码以在客户端获取cookie
- 改进js代码以删除全局变量和函数
- 对php文件的Ajax调用返回该文件中的JS代码,而不是执行它
- 在单独的上下文中运行 js 代码并访问其全局变量
- 这个 ajax.js 代码有什么问题
- 如何使用 GetValues 使用 Jint 运行 Js 代码
- JS代码有什么问题,让我知道代码是否可以改进