Javascript 为什么这个代码不起作用?我正在创建Firefox扩展,但代码没有运行。但是如果我将代码粘贴到控制台中,它就可以工作了
我制作了一个firefox扩展,它获取所有请求url并显示它们。但是,只有在我将代码粘贴到控制台中时,代码才起作用 当扩展加载时,它没有显示任何错误,看起来它就是不运行 这是完整的代码 xhrScript.jsJavascript 为什么这个代码不起作用?我正在创建Firefox扩展,但代码没有运行。但是如果我将代码粘贴到控制台中,它就可以工作了,javascript,firefox,xmlhttprequest,firefox-addon,firefox-addon-webextensions,Javascript,Firefox,Xmlhttprequest,Firefox Addon,Firefox Addon Webextensions,我制作了一个firefox扩展,它获取所有请求url并显示它们。但是,只有在我将代码粘贴到控制台中时,代码才起作用 当扩展加载时,它没有显示任何错误,看起来它就是不运行 这是完整的代码 xhrScript.js (function(){ const proxiedOpen = XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function ( _, url) { thi
(function(){
const proxiedOpen = XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function ( _, url) {
this.__URL = url;
return proxiedOpen.apply(this, arguments);
};
const proxiedSend = window.XMLHttpRequest.prototype.send;
window.XMLHttpRequest.prototype.send = function () {
const { protocol, host } = window.location;
// showing only when it paste in console
console.log("full request url ", `${protocol}//${host}${this.__URL}`);
return proxiedSend.apply(this, [].slice.call(arguments));
};
})();
// this works all times
document.body.style.border = "7px solid blue";
manifest.json
{
"manifest_version": 2,
"name": "XHR request urls",
"version": "1.0",
"description": "get all the request url's",
"content_scripts": [
{
"matches": ["*://*/*"],
"js": ["xhrScript.js"]
}
]
}
如您所见,最后一行是document.body.style.border=“7px纯蓝色”代码>,每次都可以正常工作。但是XMLHttpRequestopen
和send
方法不起作用。仅当我将代码粘贴到控制台中时才起作用
如果您想查看示例,可以尝试在devTools控制台中复制并粘贴xhrScript.js
代码(这是一个SPA,因此很容易检查我想要的内容),并查看所有请求
我不知道为什么这段代码只有在粘贴到控制台时才会运行,因为内容脚本在一个隔离的JavaScript环境中运行,这意味着窗口及其内容与页面隔离,所以当您修改它时,您只能修改内容脚本的版本
有两种解决方案:
特定于Firefox
使用wrappedJSObject
和exportFunction
访问页面上下文():
consturl=newweakmap();
const origXhr=hookPagePrototype('XMLHttpRequest'{
打开(方法、url){
设置(这个,url);
返回origXhr.open.apply(这是参数);
},
发送(){
console.log('Sending',新URL(URL.get(this),location.href);
返回origXhr.send.apply(这是参数);
},
});
函数hookPagePrototype(原名,funcs){
const proto=wrappedJSObject[protoName]。原型;
const oldFuncs={};
for(Object.entries(funcs))的常量[name,fn]{
oldFuncs[name]=exportFunction(proto[name],wrappedJSObject);
proto[name]=exportFunction(fn,wrappedJSObject);
}
返回oldFuncs;
}
铬兼容
使用DOM脚本在页面上下文中运行代码:。
它在受严格内容安全策略(CSP)保护的页面上不起作用,CSP会阻止脚本执行,因此在为Firefox编写扩展时,我们应该使用wrappedJSObject
方法
哇,它很管用,我对制作浏览器扩展真的很陌生。这对我帮助很大,谢谢分享文档