2010-07-30 2 views
4

Firefox 확장 기능의 자바 스크립트에서는 gBrowser.getBrowserForTab을 호출 할 수 있지만 gBrowser.getTabForBrowser은 없습니다. 그래서 나는 자기 자신을 썼다. 그리고 그것은 효과적이다. 그리고 내가 이것을하지 말아야 할 어떤 이유가 있거나, 코드에 문제가 있다면, 나는 단지 궁금하다. 다음은 윈도우가로드 될 때 호출되는 내 init 메서드입니다. 난 당신이 자신의 롤해야하므로 더는 getTabForBrowser 기능을 내장이없는 알고 멀리로Firefox gBrowser.getBrowserForTab하지만 gBrowser.getTabForBrowser가 없습니까?

gBrowser.getTabForBrowser = function(browser) { 
    for (var i=0; i<gBrowser.browsers.length; i++) { 
    if (gBrowser.getBrowserAtIndex(i) === browser) { 
     return gBrowser.tabContainer.getItemAtIndex(i); 
    } 
    } 
    return null; 
} 

(또는이 gBrowser.prototype.getTabForBrowser = ...해야합니까?)

답변

3

. 그러나 코드에서는 브라우저 노드가 탭 노드와 동일한 DOM 순서로 저장되어 있다고 가정합니다. 나는이 가정이 깨진 지 확실히 말할 수는 없지만, 탭이 사용자에 의해 임의로 재배치 될 수 있다고 생각하면, 내가 의지하지 않는 것입니다.

다행히도 각 탭 개체는 linkedBrowser 속성을가집니다. 따라서 코드를 다음과 같이 다시 작성할 수 있습니다 :

gBrowser.getTabForBrowser = function(browser) { 
    var mTabs = gBrowser.mTabContainer.childNodes; 
    for (var i=0, i<mTabs.length; i++) { 
    if (mTabs[i].linkedBrowser == browser) { 
     return mTabs[i]; 
    } 
    } 
    return null; 
} 
+0

'=='또는'==='여야합니까? 두 개의 ''이 정확히 동일한 브라우저가 아니더라도 동일한 것으로 비교할 수 있다고 생각합니다. 확실하지는 않지만. 그래서'==='는 나에게 더 안전 해 보인다. – MatrixFrog

+0

몇 가지 간단한 실험을 한 후에 DOM의 브라우저를 재정리하는 것처럼 보이지만 그 것에 의존해서는 안된다는 것이 맞습니다. 좋은 지적! – MatrixFrog

+1

'a === b'는'typeof a == typeof b && a == b'와 동등하므로 양쪽 피연산자의 타입이 이미 동일하다고 알려진 경우'==='는 필요 없습니다. Javascript의 객체는 참조로 변수에 할당되므로 동일한 속성 이름과 값이 포함 된 경우에도 두 개의 개별 객체가 동일하게 비교되지 않습니다. '({x : 5}) == ({x : 5})'는'false'로 평가됩니다. 그것은 말하자면, 확실히 상처를주지 않으며, 당신이 그것에 대해 너무 열심히 생각할 필요가 없다는 장점이 있습니다. – MooGoo

관련 문제