IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Etendre un objet (DOM)


Sujet :

JavaScript

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Par défaut Etendre un objet (DOM)
    Bonjour,

    Dans un formulaire de contact qui contient les champs "votre mail" et "votre message" (input et textarea), je voudrais étendre ces objets pour leur ajouter un attribut. Le problème c'est que je n'ai réussi à le faire qu'en passant par l'objet Element. Du coup tous les tags HTML sont étendus ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	// augmente l'objet Element de l'Attribut : regEx
    	Element.prototype.regEx = "";
    Comment faire pour étendre uniquement les champs de mon formulaires ?
    D'avance merci.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Avant de te répondre, il serait bon de comprendre exactement ce que tu cherches à faire parce que là, c'est pas très clair...
    Ceci dit, ta bribe d'explication semble indiquer que tu cherches à réinventer la roue, en particulier l'attribut HTML5 pattern.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    soit pattern pour forcer un format ...

    ou si il s'agit juste d'un attribut il y a aussi data-nomattribut
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Par défaut
    Merci pour vos réponses, pour info l'idée est d'accompagner l'utilisateur avec un message d'info lorsque le champ est actif (onfocus) et un message de feedback dès qu'il le quitte (onblur). Ces messages sont dans des div, masqués en css.

    Du peut d'essai que j'ai réalisé avec pattern (html5) je n'arrivais à afficher le feedback qu'au submit, pour un long formulaire c'est un peu tard.

    L'attribut data semble intéressant ... je vais creuser

    Néanmoins, j'aimerais quand même bien savoir comment étendre précisément un objet DOM sans passer par l'objet Element ...

  5. #5
    Membre Expert
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Par défaut
    Étendre les objets natifs du DOM est une mauvaise pratique ... (même si Prototype, Mootools l'ont fait, mais c'est un autre débat).
    Une bonne pratique, comme le fait jQuery, est de créer un "wrapper" qui permet d'utiliser des fonctions personnalisées sur un élément ou une collection d'élément.

    Ou plus simplement, directement attacher des événements aux éléments ciblés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // Attacher un événement à un élément
    var bindEvent = function( element, type, eventHandler ) {
      if ( element.addEventListener ) {
        element.addEventListener( type, eventHandler, false );
      } else if ( element.attachEvent ) {
        element.attachEvent( "on" + type, eventHandler );    
      }
    };
     
    bindEvent(document.getElementById('votre_mail'), 'focus', function (evt) {
      console.log('sélectionner votre mail');
    });
     
    bindEvent(document.getElementById('votre_mail'), 'blur', function (evt) {
      if (evt.currentTarget.value === '') { // ou regEx
        console.log('Le champ est toujours vide ou pas au bon format !');
        evt.currentTarget.style.backgroundColor  =  '#f00';
      } else {
        evt.currentTarget.style.backgroundColor  =  '#fff';
      }
    });

  6. #6
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    +1 pour un wrapper plutôt que de modifier le prototype

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function SuperChamp(element, regex){
        this.element = element;
        this.regex = regex;
     
        bindEvent(element, 'focus', function(){
            //faire ce que tu veux avec ta regex ou d'autres infos
        });
    }
     
    var monSuperChamp = new SuperChamp(document.querySelector('input.email'), emailRegEx);

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Par défaut
    Merci pour vos réponses.
    Je ne connaissais pas du tout le wrapper ... (faut bien commencer )

  8. #8
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    ajouter des attributs au éléments du dom c'est faisable rapide et efficace
    il y a longtemps je m'était attelé à cette approche avec des but différent
    http://www.developpez.net/forums/d85...s-autoverifes/
    http://www.developpez.net/forums/d83...ace-innerhtml/

    attention ça date
    A+JYT

  9. #9
    Membre Expert
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Par défaut
    ajouter des attributs au éléments du dom c'est faisable rapide et efficace
    Pourquoi penses-tu que cela est efficace ? Il n'y a pas de problèmes de perf ? Incompatibilité ?

    J'ai lu que c'était bien, mais déconseillé (pour prob d'incompatibilité/perf). Prototype avait suivi cette voie, mais va refondre totalement cela pour la v2. Pareil pour Mootools. Si c'est gros acteurs décident de changer leur approche, c'est qu'il doit "y avoir anguille sous roche".

    Avant j'étendais le DOM aussi, mais ça ... (oserais-je? ) ....c'était avant de lire cet article de Kangax

  10. #10
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Kaamo, attention, ce que propose sekaijin, ce n'est pas à proprement parler étendre le prototype des éléments HTML (ce qui pose effectivement de gros problèmes de compatibilité puisque IE < 9 de mémoire n'expose pas les objets de type Element ou HTMLElement et dérivés).
    Sa solution consiste à considérer un objet DOM déjà récupéré (via getElementById() par exemple) comme n'importe quel autre objet auquel tu peux ajouter directement des propriétés et des méthodes. A ma connaissance, cela ne pose aucun problème.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  11. #11
    Membre Expert
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Par défaut
    Je n'avais pas lu le code en question. En effet, il n'ajoute rien au prototype mais à l'objet récupéré par getElementById !

    Je n'ai donc rien dit

  12. #12
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    quand je dis que c'est efficace pus que sur les perfs c'est sur la gestion de la mémoire.

    si on surveille la mémoire interne de l'interprète JS

    florsqu'on fait un wrap on créé un objet qui contient une référence à un objet dom pour que cette référence ne soit pas perdue on doit garder le warp référencé (sinon le GC le mets à la poubelle)

    du coup lorsque l'objet DOM référencé est détruit il faut aussi eventuellement suprimer le ou les wrap qu'on a créé et qui le référence.

    si on attache des propriété et des pethode à l'objet DOM on ne crée pas d'objet (wrap) donc si on détruit l'objet DOM toutes les propriétés, methode perdent une référence. le GC peut alors faire le ménage.

    je me suivient d'un systeme d'onglet fait ainsi un div contient plusieur autre div qui sont des onglet (une liste servant à les selectionner) chaque div fils contient une propriété qui référence la liste le div père contient une prorpiété qui désigne l'onglet activ et de méthodes qui active ou desactive un onglet

    en terme d'objet il n'y a donc besoint de rien. juste les objets DOM (toute est basé sur des référence) pas de tableau des onglet pas de wrap rien
    l'ajout dynamique d'onglet laisse tout cela homogène

    créer de façon récurcive tout un system d'onglets dans un onglet ne pose aucun pb car chaque système est indépendant

    la supression d'un system se fait simplement en supprment le div père
    il ne reste aucune miète en mémoire.

    pour avoir observé le moteur JS avec un télé système il c'est avéré très éconnome en mémoire et très simple à géré.

    c'est dans ce sens là que je parlait d'efficacité.
    A+JYT

  13. #13
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Les avantages d'étendre HTMLElement sont loin de couvrir tous les inconvénients. On ne peut pas toucher au prototype de HTMLElement comme ça a été dit plus tôt, seulement attacher des propriétés indivduellement. Dans une logique POO, il peut être parfois ennuyeux de ne pas avoir la certitude que tous les objets d'une "classe" ont bien tous les mêmes propriétés. Aussi, pour certains usages les éléments HTML peuvent parfois être retirés du DOM et réinsérés plus tard. Il faut alors faire attention à toujours garder une référence de l'objet côté Javascript même une fois détaché du DOM. Enfin, le HTML évoluant sans cesse, il est possible que le prototype de HTMLElement soit étendu à de nouvelles propriétés avec le même nom que vos propriétés personnalisées, et là les choses se compliquent vite...

    C'est pour toutes ces raisons que jQuery a opté pour la solution wrapper, jugée plus sûre, quitte à perdre un peu en efficacité mémoire. Et c'est aussi pour ça que Prototype est particulièrement décrié.

    Je vous laisse lire cet article qui fait bien le tour du sujet : http://perfectionkills.com/whats-wro...nding-the-dom/

  14. #14
    Membre Expert
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Par défaut
    Merci pour l'éclaircissement sekaijin ! En effet, pour l'article c'est celui dont je parlais quelques posts plus haut. Il permet de bien cerner les avantages/inconvénients comme tu l'as résumé, Sylvain.

  15. #15
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Oups, je n'avais pas vu que tu l'avais déjà posté

  16. #16
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Pour ajouter mon grain de sel.

    Quand j'ai découvert la méthode .data de jQuery, ça et plusieurs autres sources dont je ne me rappelle plus m'ont fait penser qu'il y avait danger à ajouter des attributs sur un élément HTML individuel. Je crois que c'est lié aux histoires de fuites de mémoire sous IE. Cela dit, IE a fait des progrès (si si) donc ça ne devrait plus être un souci.

    C'est peut-être quelque chose de bon à savoir, pour ce que ça vaut.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Detecter le poids d'une image avec l'objet DOM
    Par crimsonPhantom dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/07/2006, 16h54
  2. [DOM] objets DOM et firefox
    Par Teppic dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/07/2006, 14h50
  3. Créer d'objets DOM à partir d'XHTML sous forme de chaîne
    Par Oscar Hiboux dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 29/03/2006, 15h04
  4. [DOM] Changement du background grâce a l'objet DOM style
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 19/12/2005, 16h31
  5. [DOM XML] Erreur fonction load() d'un objet dom??
    Par ribrok dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/10/2005, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo