2010-07-30 7 views
4

Dans le Javascript pour une extension de Firefox, vous pouvez appeler gBrowser.getBrowserForTab mais il n'y a pas de gBrowser.getTabForBrowser. J'ai donc écrit le mien et ça fonctionne, et je suis juste curieux de savoir s'il y a une raison pour laquelle je ne devrais pas le faire, ou s'il y a quelque chose qui ne va pas avec le code. Ce qui suit est dans ma méthode init qui est appelée lorsque la fenêtre se charge.Firefox gBrowser.getBrowserForTab mais pas 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; 
} 

(ou devrait-il être gBrowser.prototype.getTabForBrowser = ...?)

Répondre

3

Autant que je sache il n'y a pas construit en fonction getTabForBrowser, donc vous devez rouler votre propre. Cependant, votre code suppose que les nœuds du navigateur sont stockés dans le même ordre DOM que les nœuds de tabulation. Je ne peux pas dire avec certitude si cette supposition est jamais cassée, mais considérant que les onglets peuvent être repositionnés arbitrairement par l'utilisateur, ce n'est pas quelque chose sur lequel je me fierais. Heureusement, chaque objet de tabulation a une propriété linkedBrowser. Heureusement, chaque objet de tabulation a la propriété linkedBrowser. Vous pouvez donc réécrire votre code comme ceci:

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

Devrait-il être '==' ou '==='? Je pense qu'il est concevable que deux '' se comparent en tant qu'égaux même s'ils ne sont pas exactement le même navigateur, bien que je ne sois pas sûr. Donc '===' semble plus sûr pour moi. – MatrixFrog

+0

Après quelques expériences rapides, on dirait qu'il * réorganise * les navigateurs dans le DOM, mais vous avez raison de ne pas me fier à cela. Bon point! – MatrixFrog

+1

'a === b' est équivilent à' typeof a == typeof b && a == b', donc quand les types des deux opérandes sont déjà connus pour être identiques, '===' n'est pas nécessaire. Puisque les objets dans Javascript sont assignés à des variables par référence, deux objets distincts ne se compareront jamais même s'ils contiennent les mêmes noms et valeurs de propriété. '({x: 5}) == ({x: 5})' évalue à 'false'. Cela étant dit, '===' ne fait certainement pas de mal, et il a l'avantage que vous n'avez pas à y penser trop fort. – MooGoo

Questions connexes