2011-04-26 4 views
0
내가 구글 크롬에 대한 확장 일하고 있어요

을에 조회에 객체 참조를 잃고 나는 다음과 같은 상황에 달렸다 :자바 스크립트

내가 같은 모든 열린 창에서 기존의 모든 탭을 얻으려고 Google 크롬 인스턴스 나는 그 (것)들을 얻고 저를위한 관련 자료를 포함하는 목표의 배열을 건설한다.

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 
+0

이 나에게 아주 이상한 같습니다 'VAR 지수 = local.tabs.length을; local.tabs [index ++] = 필터 (tabIdx, cwtabs [tabIdx]); ' 색인을 늘리는 이유는 무엇입니까? 또한,'.getTabs()'의 결과를 게시 할 수 있습니까? – Halcyon

+0

.getTabs()의 결과는 다음과 같습니다 (console.log 사용). [{favicon : "", title : "", url : ""}, {favicon : "", title : "", url : ""}, ...] – crazybyte

+0

편집 : 내가 말한 코드 조각을 삭제했습니다. :) – crazybyte

답변

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; 
    }); 
})