0

我正在开发一个chrome 扩展。现在我遇到了chrome.debugger的问题,调试器只能附加一个 http 请求。无法检测到选项卡的其余请求。我发现这是由回调函数引起的。

根据官方手册chrome.debugger.attach,当第三个参数为回调函数时,使用, 。在live-headers中,附加代码是这样的:

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.debugger.attach({tabId:tab.id}, version,
        onAttach.bind(null, tab.id));
});

var version = "1.0";

function onAttach(tabId) {
    if (chrome.runtime.lastError) {
        alert(chrome.runtime.lastError.message);
        return;
    }

    chrome.windows.create(
        {url: "headers.html?" + tabId, type: "popup", width: 800, height: 600});
}

在我的代码中,我这样调用 attach (只是不使用 bind):

myAttach = function () {....};

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.debugger.attach({tabId:tab.id}, version, myAttach)
});

当我使用前一种格式时,一切正常。我无法理解差异和结果。

问题:当我使用第二种方法时,将没有更多Network.responseReceivedNetwork.requestWillBeSent收到消息。我尝试使用getTargets并发现选项卡的调试器附加已分离。当我回到第一种方法时,一切都很好。

对不起我糟糕的英语

谢谢你的帮助

4

1 回答 1

1

您可能会忽略该bind函数的作用(以及为什么在这种情况下它会产生重大影响)。如果对任何与 WebDev 相关的内容有疑问,您可以前往MDN

关于函数绑定

创建一个新函数,在调用该函数时,将其 'this' 关键字设置为提供的值,并在调用新函数时在任何提供的参数之前提供给定的参数序列。


那么,您的方式和文档的方式有什么区别?

你的方式:

function myAttach() {...}   <--  A function that expects no arguments
...
chrome.debugger.attach(
    ..., 
    myAttach   <-- 'myAttach()' is called, with no arguments
);                 and therefore no way to refer to the tab's id

文档的方式:

function onAttach(tabId) {...}   <-- A function that expects 1 argument
...
chrome.debugger.attach(
    ..., 
    onAttach.bind(null, tab.id)   <-- Creates a new function, let's name it "tmpFunc".
);                                    'tmpFunc()' is called, with no arguments

但什么是tmpFunc

(不完全是这样,但是)你可以把它想象成一个没有参数的函数,当被调用时 executes onAttach,作为它的第一个参数传递tab.id。因此,onAttach可以引用 tabId(并用它做一些事情)。

于 2013-11-08T15:21:41.923 回答