0

我正在尝试制作 Google Chrome 扩展程序。

一开始,我想创建 javascript 类,它代表活动的浏览器选项卡并让我使用该 HTML 源代码。它应该像这样使用:

var currentTab = new CurrentTab();

currentTab.requestHtml(function(html){
    // `html` contents active tab HTML
}); 

我用谷歌搜索,我发现活动标签的 HTML 不能直接进入扩展的弹出窗口。但我可以将我自己的 javascript 传递给选项卡,它通过chrome.extension.sendRequest(). 所以,我的CurrentTab课看起来像这样:

var CurrentTab = function(){
    this.listeners = {
        'requestHtml': {}
    };

    chrome.extension.onRequest.addListener(this._processListener);
};
CurrentTab.prototype = {
    requestHtml: function(callback){
        var actionKey = Math.ceil(Math.random() * 10000);  // get random identifier for this callback

        this.listeners['requestHtml'][actionKey] = callback;

        chrome.tabs.executeScript(null, { 
            code: 'console.log("SendContent.js");'
                + 'chrome.extension.sendRequest({'
                + '     action: "' + actionKey + '",'
                + '     host: document.location.hostname,'
                + '     content: document.getElementsByTagName("html")[0].outerHTML'
                + '}, function(response){});'
        });
    },

    _processListener: function(request, sender, sendResponse){
        /*25.*/console.log(this.listeners);  // `this.listeners` is 'undefined' ???
        if (this.listeners['requestHtml'][request.action]) {
            this.listeners['requestHtml'][request.action](request.content);
            delete this.listeners['requestHtml'][request.action];
        }
    }
}; 

问题出现在本课程的第 25 行。虽然该_processListener方法是类的一部分,但当通过回调调用此方法时,此处的CurrentTab变量是未定义的。this.listeners

请问,我该如何解决这个问题,为什么会这样?谢谢。

4

1 回答 1

1

使用锁定函数的上下文Function.prototype.bind

var CurrentTab = function(){
    ...

    chrome.extension.onRequest.addListener(this._processListener.bind(this));
};
于 2013-03-27T18:50:23.517 回答