Si vous avez suivi le billet précédent, vous saurez qu'il existe un problème avec le composant HTML et l'attribut target des liens. Ce problème peut aisément être contourné en supprimant ledit attribut. Cependant Hervé a soulevé un autre problème également intéressant : quid de l'ouverture de fenêtre en javascript?
Dans le précédent billet, il était question d'atteindre l'objet javascript "window" via la propriété domWindow de l'objet HTML, de la même manière dans ce cas précis, il est possible de surcharger la méthod open() :
Cette solution fonctionne, mais n'est rien de plus qu'un moyen de réinventer la roue, dans la mesure ou il existe une classe HTMLHost qui répondra très facilement à nos besoins. L'idée est de modifier le comportement par défaut du composant HTML, en surchargeant différentes méthodes qui seront appelée lorsque, par exemple, le titre de la page est modifié via la propriété "window.document.title". Dans notre cas, c'est la méthode "createWindow" qui nous intéresse. Cette méthode requiert que l'on lui retourne une instance de la classe HTMLLoader, objet permettant le chargement de données HTML, pour le reste il est possible de faire ce que vous voulez dans cette méthode, par exemple ouvrir une nouvelle fenêtre native.
Dans notre cas, ce n'est pas l'effet recherché (et de toutes façon, ce comportement est illustré dans la documentation officielle du composant HTMLHost). L'idée ici est d'ouvrir la page HTML systématiquement dans la même fenêtre. Pour ce faire :
Et voilà, une simple ligne de code pour faire en sorte que la page sera chargée par le loader utilisé par notre navigateur. Cette propriété htmlLoader est automatiquement renseignée par le composant HTML lorsqu'on lui passe une instance de HTMLHost via sa propriété host.
Encore un problème évité sans avoir eu à bidouiller à travers les éléments du DOM (du moins, par directement). J'espère avoir été clair dans l'explication, malgré le mélange de HTML, HTMLLoader, htmlLoader, host et HTMLHost. Si ce n'est pas le cas, les commentaires sont là pour ça !
