我正在尝试创建一个小型Chrome扩展程序,以便在用户使用我们的某个公共IP地址时添加标头。我对javascript相对较新,可以使用一些帮助。
以下是获取公共IP地址的功能:
function getIP(){
$.getJSON("http://ip-api.com/json",
function(data){
if(data.query == 'xxx.x.xxx.xxx'){var indist = 1;}else{var indist = 0;}
console.log(indist);
return(indist);
});
}
当我检索Pubic IP
时var indist = getIP();
然后修改Chrome扩展程序中的标题。
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
if(indist === 1){
details.requestHeaders.push({name:"X-YouTube-Edu-Filter",value:"xxxxxxxxxxxxx"});
return {requestHeaders: details.requestHeaders};}
},{urls: ["<all_urls>"]},["requestHeaders", "blocking"]
);
这是我的第一次拍摄,我不想得到结果,我想。理想情况下,当用户在Youtube上发出任何请求时,我想检查用户的公共IP地址一次,然后根据该地址添加标头。
非常感谢任何帮助!
答案 0 :(得分:4)
您的函数getIP
实际上没有返回任何内容,因为$.getJSON
是异步的。
您的代码如下所示:
function getIP(){
$.getJSON("http://ip-api.com/json", someFunction);
}
这就是&#34;对请求进行排队,以及何时完成呼叫someFunction
&#34;。然后语句终止,你的函数getIP
结束而不返回任何内容。
因此,回调中的return
值会丢失。
此外,您的范围是错误的:
if(data.query == 'xxx.x.xxx.xxx') {
/* scope begins */
var indist = 1; // Local, only exists within this branch!
/* scope ends */
} else {
var indist = 0;
}
console.log(indist); // Is not related to above, probably undefined
作为一个简单的修复,因为您在onBeforeSendHeaders
处理程序中无论如何都要使用全局变量,只需在回调中分配它:
function getIP(){
$.getJSON(
"http://ip-api.com/json",
function(data) {
if(data.query == 'xxx.x.xxx.xxx') {
indist = 1; // GLOBAL variable
} else {
indist = 0;
}
console.log(indist);
}
);
}
那就是说,您可能希望限制代码所造成的损害。在EVERY SINGLE网络请求上运行阻止代码会降低Chrome的速度。重写您的代码以仅在满足条件时启用处理程序,然后可能仅在YouTube请求上运行它。
function getIP(){
$.getJSON(
"http://ip-api.com/json",
function(data) {
chrome.webRequest.onBeforeSendHeaders.removeListener(addHeader);
if(data.query == 'xxx.x.xxx.xxx') {
chrome.webRequest.onBeforeSendHeaders.addListener(
addHeader,
{urls: ["*://*.youtube.com/*"]},
["requestHeaders", "blocking"]
);
}
}
);
}
function addHeader(details) {
details.requestHeaders.push({name:"X-YouTube-Edu-Filter",value:"xxxxxxxxxxxxx"});
return {requestHeaders: details.requestHeaders};
}