Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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 extensions WebRequest按tabId筛选不起作用?_Javascript_Google Chrome_Google Chrome Extension_Tabs - Fatal编程技术网

Javascript Chrome extensions WebRequest按tabId筛选不起作用?

Javascript Chrome extensions WebRequest按tabId筛选不起作用?,javascript,google-chrome,google-chrome-extension,tabs,Javascript,Google Chrome,Google Chrome Extension,Tabs,我正在重构一个现有的chrome扩展,我调用了chrome.webRequest.onBeforeSendHeaders,应该根据当前选择的选项卡进行筛选 我正在使用文档,关于过滤,文档中说明: webRequest.RequestFilter筛选器允许限制对的请求 在不同维度中触发哪些事件: URL URL模式,例如*://www.google.com/foo*bar。类型请求 类型,例如main_frame(为顶层加载的文档 框架),子框架(为嵌入框架加载的文档), 和图像(网站上的图像)。

我正在重构一个现有的chrome扩展,我调用了
chrome.webRequest.onBeforeSendHeaders
,应该根据当前选择的选项卡进行筛选

我正在使用文档,关于过滤,文档中说明:

webRequest.RequestFilter筛选器允许限制对的请求 在不同维度中触发哪些事件:

URL URL模式,例如*://www.google.com/foo*bar。类型请求 类型,例如main_frame(为顶层加载的文档 框架),子框架(为嵌入框架加载的文档), 和图像(网站上的图像)。请参阅webRequest.RequestFilter。标签 标识一个选项卡的标识符。窗口ID窗口的标识符

因此,我的理解是,如果我将tabid定义为侦听器的一部分,那么应该根据tabid过滤所有请求(因此,只捕获来自该特定选项卡的请求头)

问题是这种情况不会发生。当我采用tabid:xx过滤器时,我会一直捕获来自我打开的各个选项卡的所有请求

我错过了什么

下面是来自后台脚本background.html的示例代码:

var currentTabId = -1;

chrome.tabs.getSelected(null, function(tab){ 
    currentTabId = tab.id;
    console.log("tab id in getselected "+currentTabId);

});

chrome.webRequest.onBeforeSendHeaders.addListener(
    function(req){

        console.log("-> Request Headers received for "+req.url);

        console.log('onBeforeSendHeaders tab id: '+currentTabId)
        console.log('onBeforeSendHeaders: '+JSON.stringify(req))
    }

, { urls:["http://*/*", "https://*/*"], tabId: currentTabId }, ['requestHeaders','blocking']);

currentTabId是例如1666,而object req中的tabId是另一个,它可能来自我打开并正在使用的任何选项卡(在1666上没有过滤掉)。

您的示例代码的执行顺序错误
chrome.tabs.getSelected
是异步的

var currentTabId = -1;
chrome.tabs.getSelected(null, function(tab){
    currentTabId = tab.id;
    // Here, currentTabId is defined properly
    console.log("tab id in getselected "+currentTabId);
});
// Here, it is still -1
您需要将
addListener
调用移动到
getSelected
回调中:

chrome.tabs.getSelected(null, function(tab){ 
    currentTabId = tab.id;
    console.log("tab id in getselected "+currentTabId);
    chrome.webRequest.onBeforeSendHeaders.addListener(/*...*/);
});

谢谢你的回答。所以我猜-1 as tabId filter value只捕获了所有的头事件。而且,我知道我应该使用
chrome.tabs.query({active:true})
。。。这只是一个老例子。