Потеря ссылки на объект при поиске в Javascript - PullRequest
0 голосов
/ 26 апреля 2011

Я работаю над расширением для Google Chrome и столкнулся со следующей ситуацией:

Я пытаюсь получить все существующие вкладки из всех открытых окон в одном и том же экземпляре 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 голосов
/ 24 июня 2011

Я думаю, что логика в вашем коде неверна.Это немного запутанно и трудно следовать.Я бы порекомендовал переписать его немного проще.Нечто подобное может помочь вам начать.Он собирает все окна, помещает все вкладки в 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;
  });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...