11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour

Pour des raisons trop longues à expliquer, j'ai l'intention d'utiliser la possibilité d'étendre les propriétés de l'objet document, par exemple

document.info = 'bidule';

L'objectif, en gros, est de calculer des valeurs liées au document dans le contexte d'un site (du genre: il s'agit d'un fichier "news" relatif au mois de juin 2015) et de les utiliser dans les diverses fonctions JavaScript qui permettent de gérer le site.
C'est une alternative à la définition de variables globales, mécanisme que j'utilise actuellement mais qui perturbe ma propension à travailler par objets.
Bien entendu, je pourrais créer un objet spécifique qui contiendrait ces propriétés , mais pourquoi pas les mettre là où est naturellement leur place?

Ça marche techniquement -- même sur IE !!! -- mais j'aimerais l'avis de cette docte assemblée sur l'utilisation d'un tel mécanisme.

Avertissement: en raison de mon âge et de mon état de santé, je prierais les opposants de mesurer la teneur de leur vocabulaire... Smiley cligne
Modifié par PapyJP (05 Jun 2015 - 11:15)
Salut,

J'ai lu il y a longtemps que c'était une mauvaise pratique. Mais je ne saurai dire pourquoi.

Par contre, je ne vois clairement pas la plue value de cette manière de faire.

Entre window.var et document.var quelle est la différence ? à part que l'object document est une interface pour interagir avec le DOM, ce n'est donc pas très pertinent de ranger ses variables là dedans selon moi.

De plus, ici on est dans une page web, donc l'object document existe, mais ce n'est pas toujours le cas dans tout les environnements javascript.

Si un expert en la matière passe, ça serait cool qu'il nous éclaire sur ce genre de pratique.
J'ai aussi déjà lu plusieurs fois que c'était une mauvaise idée, mais sans connaître non plus la véritable raison. Je me rappelle avoir posé la question ici même il y a quelques années mais je ne retrouve plus le sujet.

Un des arguments avancés dont je me souviens était que ça pouvait provoquer des memory-leaks et des clash de noms. Mais Pour la première je n'ai jamais eu de preuve concrète, et je n'y crois plus vraiment; du moins pas avec les navigateurs récents à partir de IE9. C'était peut-être le cas sur d'anciens navigateurs, et ça ne fonctionnait pas avec IE6 et 7. Pour la deuxième il suffit de faire un peu attention et il n'y a que peu de risques, il faut juste être un peu malin et ne pas nommer tout n'importe comment.

En tout cas, il m'est déjà arrivé souvent pour mes scripts perso d'étendre Node, NodeList, Element, HTMLElement, String, Array, et d'autres, et je n'ai jamais observé aucun problème. Ca marche très bien sur les 4 navigateurs principaux (Firefox, Chrome, Safari, et IE8+, PC ou mobile).

Bref, s'il y a 2 ou 3 ans quand j'avais posé la question, c'était clairement mauvais, je ne pense plus que ce soit le cas maintenant.
Modifié par QuentinC (05 Jun 2015 - 16:56)
Gili a écrit :
Par contre, je ne vois clairement pas la plue value de cette manière de faire.

Pour moi, l'objet "document" est la représentation formelle de la page web en cours.
Ecrire

    document.language = 'fr';
    document.type = 'newsLetter';
    document.period = {year: 2015, month: 6};

etc. me semble la façon de faire la plus naturelle.
Dans le reste du code, je référencerais

    if(document.type == 'newLetter') {
       switch(document.language) {
            case 'fr':
                document.title = 'Lettre du mois : '.....
                break;
            case 'en':
                document.title = 'Monthly Newsletter: '.....
                break;
            case 'de':
                document.title = 'Monatlicher Newsletter: '.....
                break;
           .........

        }
    }


Bien entendu, je peux créer un objet "Page"

Page = function(...) {
    this.document = document;
    this.language = 'fr';
    this.type = 'newsLetter';
    this. period = {year: 2015, month: 6};
}

etc. mais ça veut dire créer une variable

    var thisPage = new Page(...);

C'est sans doute la solution de secours, qui me permettrait tout de même de n'avoir qu'une seule variable de type object avec ses propriétés et ses méthodes, plutôt que des variables isolées comme actuellement.

Question de goût je suppose...

Note: dans le contexte dont je parle, l'information est en fait contenue dans le href du document, qui est par exemple /newsLetters/fr/n_06-15.htm, /newsLetters/en/n_06-15.htm, /newsLetters/de/n_06-15.htm Il s'agit donc bien d'expliciter des informations qui proviennent en fait de document.location en les calculant une seule fois et en les ayant de façon explicite à disposition dans toutes les fonctions
QuentinC a écrit :
J'ai aussi déjà lu plusieurs fois que c'était une mauvaise idée, mais sans connaître non plus la véritable raison.

Je crois que pour l'inquisition, dire que la terre tourne sur elle même et autour du soleil était aussi une mauvaise idée...
Et pourtant elle tourne! Smiley biggrin
JE n'ai pas retrouvé le sujet où j'avais posé la question sur alsa, mais j'ai retrouvé cet article qu'on m'avais alors conseillé :
http://perfectionkills.com/whats-wrong-with-extending-the-dom/


Par contre ça a clairement changé depuis. Il y a ceci qui est en voie de standardisation par exemple:
http://www.html5rocks.com/en/tutorials/webcomponents/customelements/?redirect_from_locale=fr
qui implique nécessairement que les prototypes de HTMLElement et autres soient publiquement exposés.

IL m'apparaît donc selon moi que l'article ci-dessus soit un peu passé de date. En 2012 c'était visiblement non; maintenant, beaucoup moins.

D'autant q'étendre le DOM, c'est la manière naturelle de le faire, compte tenu la logique OO de js.
Oui, je suis d'accord.
Le premier article en fait explique ce qui se passe si on fait des extensions à DOMElement, mon intention (pour le moment du moins) est d'ajouter des propriétés à l'objet document, pas au prototype. Comme tu dis, c'est une extension naturelle dans un contexte OO.
Voyons si d'autres personnes ont un avis different, de toute façon je suis bloqué pour le week end.
Modifié par PapyJP (05 Jun 2015 - 22:46)