在Javascript中查找时丢失对象引用
我正在为Google Chrome开发一个扩展,遇到了以下情况: 我正在尝试从同一个Google Chrome实例中打开的所有窗口获取所有现有选项卡。我设法获取它们并为自己构建一个包含相关数据的对象数组 当我使用console.log查看构造的数组时(保存以备将来使用),我可以看到对象的集合,但我不能引用它们(当我尝试时,我得到了未定义的对象) 我试图将数组保存在对象外部的容器中,但没有任何更改 你知道为什么当我试图查找对象时,对它们的引用消失了吗?谢谢 代码如下:在Javascript中查找时丢失对象引用,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在为Google Chrome开发一个扩展,遇到了以下情况: 我正在尝试从同一个Google Chrome实例中打开的所有窗口获取所有现有选项卡。我设法获取它们并为自己构建一个包含相关数据的对象数组 当我使用console.log查看构造的数组时(保存以备将来使用),我可以看到对象的集合,但我不能引用它们(当我尝试时,我得到了未定义的对象) 我试图将数组保存在对象外部的容器中,但没有任何更改 你知道为什么当我试图查找对象时,对它们的引用消失了吗?谢谢 代码如下: (function(wind
(function(window){
//defining a namespace
var example = {
bmarksmaster: (function() {
var bmarksmaster = function() {
return new bmarksmaster.fn.init();
}
bmarksmaster.fn = bmarksmaster.prototype = {
debug: false,
tabs: [],
constructor: bmarksmaster,
init: function() {
return this;
},
windowParser: function(ctx, filter) {
var local = ctx;
var filter = filter;
return function(wObj) {
if((wObj !== null) && (wObj !== undefined)) {
for(var idx in wObj) {
var cw = wObj[idx];
if((cw.tabs !== null) && (cw.tabs !== undefined)) {
var cwtabs = cw.tabs;
for(var tabIdx in cwtabs) {
local.tabs.push(filter(tabIdx, cwtabs[tabIdx]));
}
}
}
}
};
},
getTabs: function() {
var returnData = [];
chrome.windows.getAll(
{
"populate": true
}, this.windowParser(this, function(i, e) {
var data = {};
if(!e.incognito) {
data["title"] = e.title;
data['url'] = e.url;
data['favicon'] = e.favIconUrl || "";
}
return data;
}));
return this.tabs;
},
getTab: function(callback) {
this.getTabs();
for (var tabIdx in this.tabs) {
if(callback(tabIdx, this.tabs[tabIdx])) {
return this.tabs[tabIdx];
}
}
},
getTabsData: function(callback) {
var data = [];
var tabs = [];
tabs = this.getTabs();
console.log(this.tabs[0]);
for (var tabIdx in tabs) {
console.log(tabs[tabIdx]);
var tabData = callback(tabIdx, tabs[tabIdx]);
if(tabData) {
data.push(tabData);
}
}
return data;
},
setDebug: function() {
this.debug = true;
},
resetDebug: function() {
this.debug = false;
}
};
bmarksmaster.fn.init.prototype = bmarksmaster.fn;
return bmarksmaster;
})()
};
window.example = example;
})(window);
//end of bmarksmaster.js file
console.log(example.bmarksmaster().getTabs()); //this works, I can see the array
console.log(example.bmarksmaster().getTabs()[0]); //this doesn't work, I get undefined, never mind the shortcut
我认为你代码中的逻辑是错误的。这有点复杂,很难理解。我建议把它改写得更简单一点。像这样的事情可能会帮助你开始。它收集所有窗口,将所有选项卡放入
tabs
var
var tabs = [];
chrome.windows.getAll({ populate: true}, function(windows) {
var localTabs = windows.reduce(function(a, b){
return a.tabs.concat(b.tabs);
});
tabs = localTabs.filter(function(element){
return !element.incognito;
});
})
这看起来很奇怪:
var index=local.tabs.length;local.tabs[index++]=filter(tabIdx,cwtab[tabIdx])代码>为什么要递增索引?另外,您可以发布来自.getTabs()
的结果吗?来自.getTabs()的结果类似于这样(使用console.log):[{favicon:,title:,url:,},{favicon:,title:,url:,,,:}]编辑:我删除了您刚才提到的那段代码:)