我正在尝试制作 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
请问,我该如何解决这个问题,为什么会这样?谢谢。