在Javascript中查找丢失对象引用

时间:2011-04-26 07:11:51

标签: javascript google-chrome google-chrome-extension

我正在开发谷歌浏览器的扩展程序,我遇到了以下情况:

我正在尝试从同一个Google Chrome实例中的所有已打开的窗口中获取所有现有标签。我设法得到它们并构造一个包含相关数据的对象数组。

当我使用console.log(保存以供将来使用)查看构造的数组时,我可以看到对象的集合,但我无法引用它们(当我尝试未定义时)。

我试图将数组保存在容器外的对象中,但没有任何变化。

当我尝试查找它们时,知道为什么对象的引用会消失?感谢。

以下是代码:

(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

1 个答案:

答案 0 :(得分:0)

我认为代码中的逻辑是错误的。这有点令人费解,很难遵循。我建议稍微重写它以使其更简单。这样的事情可能会帮助你入门。它收集所有窗口,将所有选项卡推入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;
  });
})