Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome.webrequest.onBeforeRequest多次调用自身_Javascript_Url_Google Chrome Extension - Fatal编程技术网

Javascript Chrome.webrequest.onBeforeRequest多次调用自身

Javascript Chrome.webrequest.onBeforeRequest多次调用自身,javascript,url,google-chrome-extension,Javascript,Url,Google Chrome Extension,我正在使用JavaScriptAPI开发一个Chrome扩展,在这个扩展中,当URL与WebRequestURL模式匹配时,我试图重定向URL backgorund.js chrome.webRequest.onBeforeRequest.addListener( 功能(详情){ 变量主机=”https://api.answerme.com/2.2/questions/345797"; var x=新的XMLHttpRequest(); x、 打开('GET',host,false); x、

我正在使用JavaScriptAPI开发一个Chrome扩展,在这个扩展中,当URL与WebRequestURL模式匹配时,我试图重定向URL

backgorund.js

chrome.webRequest.onBeforeRequest.addListener(
功能(详情){
变量主机=”https://api.answerme.com/2.2/questions/345797";
var x=新的XMLHttpRequest();
x、 打开('GET',host,false);
x、 onload=函数(){
//此函数为我提供URL并将其存储到“redirectAnswerUrl”全局变量中(工作正常)
设置重定向到应答器(x.responseText);
};      
x、 send();
//这是一个很好的输出:-www.answerme.com/quetion/78784#45545
警报(“重定向应答URL”+重定向应答URL);
如果(重定向应答URL!=“”){
//但此redirectAnswerUrl具有与输出和清单url相同的默认url模式
返回{redirectUrl:redirectAnswerUrl}
}
},
{
//设置第一次加载时要匹配的url
网址:[
“*://answerme.com/questions/*”,
“*://www.answerme.com/questions/*”
]
},
[“封锁”]
);
manifest.json

{
“名称”:“演示”,
“说明”:“演示”,
“版本”:“0.1”,
“清单版本”:2,
“浏览器操作”:{
“默认图标”:“logo.png”,
“默认弹出窗口”:“window.html”
},
“背景”:{
“脚本”:[“background.js”]
},
“权限”:[
“活动选项卡”、“选项卡”、“webRequest”,
“*://answerme.com/questions/*”,
“*://www.answerme.com/questions/*”
“webRequestBlocking”、“存储”
],
“图标”:{
“16”:“logo.png”,
“128”:“logo.png”
}
}
问题:在webrequest上检查的url模式与API输出url相同“www.answerme.com/quetion/78878#78787878”,而webrequest url具有“www.answerme.com/quetion/searchquery”


在这种情况下,当我们获得
www.answerme.com/questions/searchquery
时,页面将被重定向到
http://www.answerme.com/questions/7847859#748555
,但问题是:我用来检查URL的模式有
*
来指示URL可以以任何协议开头,其第一个属性以
quetions
开头。这与重定向URL匹配,
http://www.answerme.com/questions/7847859#7848488
,因此这会变成死锁(重复重定向)。我再次收到相同的URL模式请求(
重定向URL=www.asswerme.com/quetion/7878#7878,清单文件上的WebRequestURL具有www.asswerme.com/quetion/*
),因此我决定检查URL是否以数字结尾(webrequest清单),这样我就可以轻松地将它们重定向到
http://www.answerme.com/questions/7847859#14524
没有任何歧义。

您可以使用
RegExp
检查
详细信息。url
仅以数字字符结尾

if (!/^\d+$/.test(details.url.split("/").pop())) {
  // `details.url` does not end with only digits, do other stuff
} else {
  return {redirectUrl: "http://www.example.com/add/7847859"}
}

我得到了解决方案define
redirectAnswerUrl=“”重定向应答URL==”
进入其他重定向,则使用条件检查

    chrome.webRequest.onBeforeRequest.addListener(
                function(details) {
                if(redirectAnswerUrl==""){
                    var host="https://api.answerme.com/2.2/questions/345797";
                    var x = new XMLHttpRequest();
                    x.open('GET',host,false);

                    x.onload = function() {
                    // this function gives me URL and store into "redirectAnswerUrl" global variable (working fine)
                    setRedirectedToAnswer(x.responseText);
                    };      
                    x.send();
             //this working fine output:-www.answerme.com/quetion/78784#45545
             alert("redirectAnswerUrl"+redirectAnswerUrl);
                    if(redirectAnswerUrl!=""){
                      //but this redirectAnswerUrl has same pattern of default urls that is above output and manifest url  
                     return {redirectUrl: redirectAnswerUrl}
                    }else{
                  return {redirectUrl: details.url}
}

                },
                {
                     //setting url which we gonna match during first load 
                     urls: [
                        "*://answerme.com/questions/*",
                        "*://www.answerme.com/questions/*"
                     ]
                },
                ["blocking"]
            );

但是url[“://example.com/add/”]表示,如果它与任何以add开头的url匹配,它将重定向..按照此解决方案,url将再次处于循环中,因为“”有add…所以我想要此[“://example.com/add/”]的url正则表达式,我们如何做?@UmeshShende“表示如果它与任何以add开头的url匹配,它将重定向。”重定向是否实际发生在
返回{redirectUrl:http://www.example.com/add/7847859“}
?已更新了我尝试使用的问题..但我认为它无法检测end with numberWhat do
console.log(details.url)
log?如果块偶数url以www.example.com/add/784681这样的数字结尾,它就会进入内部。请澄清您的问题。请准确指定您试图重定向的url。例如,是否要重定向所有
*://*。example.com/add/*
url,除了
http://www.example.com/add/7847859
到<代码>http://www.example.com/add/7847859
?如果是,那么只需测试URL,看看它是否包含以下内容:
If(details.URL.indexOf('http://www.example.com/add/7847859')!==0){返回{重定向URL:'http://www.example.com/add/7847859' };}
yes..我想要以数字结尾的url#数字121454#25544,因为每当我从api得到响应时,我都会得到这个url的格式example.com/add/4545454#44555,所以我想要完全相同的模式我已经更新了问题您的问题仍然不清楚。请确切地指定您想要重定向的内容和不想要重定向的内容(如果您的重定向URL之外有其他内容)。请给出多个示例。坦率地说,您没有明确定义这一点是您遇到问题的基础。还不清楚您是否遇到了其他重定向扩展所遇到的问题,即站点将重定向到另一个匹配页面,从而导致多阶段的循环s、 此外,如果您希望将每个请求重定向到这些匹配的URL,或者仅仅是页面导航到这些特定页面的结果(通常不太可能导致问题),那么您应该明确地做出选择。