This is an archived page. It's not actively maintained.

Astuces JavaScript

XUL Tips

  • Lorsque vous ins√©rez du code dans un overlay XUL, placez vos fonctions et variables √† l'int√©rieur d'un objet poss√©dant un nom unique afin d'√©viter des conflts avec d'autres fonctions et noms de variables existants ou futurs.
var UniqueName = {
  _privateMember: 3,
  publicMember: "A string",

  init: function() {
    this.doSomething(this.anotherMember);
  },

  doSomething: function(aParam) {
    alert(aParam);
  }
};

XPConnect

  • N'utilisez pas plus de m√©thodes ou de propri√©t√©s d'object qu'il vous faut. Il est plus souvent rapide de stocker le r√©sultat dans une variable temporaire.
  • N'appelez pas les m√©thodes dont vous n'avez pas besoin. Par exemple, windowManager.getEnumerator(aType).hasMoreElements() peut √™tre remplac√© par windowManager.getMostRecentWindow(aType) != null pour une simple fen√™tre.
  • N'interrogez des interfaces que pour avoir acc√®s aux m√©thodes et propri√©t√©s de cette interface. Vous n'avez pas √† interroger des interfaces pou comparer des objets, pas plus que pour passer des objets en tant que param√®tres (Ceci est diff√©rent du C++, o√Ļ vous devez interroger les interfaces dans ces 2 cas).
  • N'appelez pas QueryInterface √† moins que vous en ayez r√©ellement besoin. A la place, utilisez plut√īt instanceof, par exemple :
if (target instanceof Components.interfaces.nsIRDFResource)
  return target.Value;
if (target instanceof Components.interfaces.nsIRDFLiteral)
  return target.Value;
return null;
  • Ne testez pas la valeur de retour de QueryInterface, elle renvoie toujours la valeur originale en cas de succ√®s. XPConnect knows all about tearoffs and modifies the object that you QueryInterface or instanceof to cache all its known interfaces.
  • Lorsque vous passez un objet √† une m√©thode XPCOM, passez plut√īt un objet XPCOM. La m√©thode C++ acc√®dera alors directement √† l'objet C++. Ce n'est cependant pas toujours n√©cessaire. For instance the offline observer declared above is a JavaScript object that is registered with an XPCOM object, so that the call back from XPCOM executes the JavaScript method. Some XPCOM methods expect an object that implements several interfaces thus requiring you to write a QueryInterface method. However, in JavaScript this is quite simple even in the case of a weak reference which in C++ requires a helper class:
var weakObserver = {
  QueryInterface: function QueryInterface(aIID) {
    if (aIID.equals(Components.interfaces.nsIObserver) ||
        aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
        aIID.equals(Components.interfaces.nsISupports))
       return this;
    throw Components.results.NS_NOINTERFACE;
  },
  observe: function observe(aSubject, aTopic, aState) {
  }
}
  • Lorsque vous devez d√©clarer des m√©thodes XPCOM, essayez d'utiliser les m√™mes noms pour les param√®tres de la m√©thodes que dans la d√©finition de l'interface.

DOM elements

  • Les √©l√©ments du DOM sont juste des objets XPCOM dont certaines interfaces sont mises en cache.
  • N'appelez pas getAttribute pour voir si des attributs existent, appelez plut√īt hasAttribute instead.
  • Utilisez une boucle sur les childNodes plut√īt que d'utiliser first/lastChild avec next/previous. Mais utilisez plut√īt hasChildNodes() to childNodes.length > 0. De m√™me utilisez   document.getElementsByTagName(aTag).item(0) != null plut√īt que document.getElementsByTagName(aTag).length > 0.
  • Utilisez de pr√©f√©rence localName plut√īt que tagName.
  • Les √©l√©ments XUL elements ont beaucoup d'attributs mapp√©s aux propri√©t√©s. Ceci a √©t√© fait pour que vous les utilisiez ! Les propri√©t√©s sont les suivantes :
    • align
    • allowEvents
    • contextMenu
    • datasources
    • dir
    • flex
    • height
    • id  
    • left
    • maxHeight
    • maxWidth
    • minHeight
    • minWidth
    • observes
    • orient
    • pack
    • persist
    • ref
    • statusText
    • top
    • tooltip
    • tooltipText
    • width
  • XUL mappe l'attribut ordinal, mais s'il n'est pas pr√©sent il sera initialis√© √† "1".
  • XUL mappe √©galement l'attribut class attribute, mais malheureusement class est un identifiant r√©serv√©. La propri√©t√© est donc appel√©e className. (La propri√©t√© pourrait avoir √©t√© impl√©ment√©e ainsi ["class"] mais ca para√ģt un peu idiot.)
  • XUL mappe les attributs hidden et collapsed aux propri√©t√©s, mais n'oubliez pas qu'il s'agit de propri√©t√©s bool√©ennes tandis que la liste ci-dessus sont toutes des propri√©t√©s de type string..
  • XUL mappe √©galement d'autres propri√©t√©s et m√©thodes tr√®s utiles via le binding XBL. Ceci varie d'un √©l√©ment √† un autre.
  • Pour de meilleures performances donnez des ids √† tous les √©l√©ments importants. En plus de localiser des √©l√©ments par tagName, XUL vous permet de localiser un √©l√©ment par son attribut en commen√ßant de n'importe quel √©l√©ment dans le document.

References