Formation PUB040 : JavaScript et autres bibliothèques côté client, 2020 jQuery

7.5 Retrouver des balises dans le DOM


Il est parfois difficile de retrouver dans le DOM la ou les balises qui doivent être modifiées.

Je vous présente ici quelques astuces pour vous aider dans cette tâche. Certaines n'utilisent que les sélecteurs jQuery alors que d'autres font appel, en plus, à des fonctions jQuery.

Dans ces exemples, le code HTML de base est :

HTML

<div class="container">
    <div class="row">
        <div class="col-md-12">
            Veuillez fournir les informations sur la formation.
        </div>
    </div>
</div>

 

<form method="post" id="formulaire-formation" ...>

    <div class="form-group row">
        <label for="titre" class="col-form-label col-sm-3">* Titre : </label>
        <div class="col-sm-5">
            <input class="form-control" id="titre" name="titre" type="text" maxlength="255">
            <div class="help-block erreur-titre"></div>
        </div>
    </div>

 

    <div class="form-group row">
        <label for="niveau" class="col-form-label col-sm-3">* Niveau : </label>
        <div class="col-sm-9">
            <select class="form-control" id="niveau" name="niveau">
                <option value="">Veuillez choisir...</option>
                <option value="1">Débutant</option>
                <option value="2">Intermédiaire</option>

                <option value="3">Avancé</option>
            </select>
        </div>
    </div>


    <div class="form-group row">
        <div class="col-sm-3"></div>
        <label for="public" class="form-check-label col-sm-9">
            <input type="checkbox" id="public" name="public">
            <span class="textecheckbox">Formation publique</span>
        </label>
    </div>

 

    <div class="form-group row">

        <div class="col-sm-3"></div>

        <div class="col-sm-9">
            <input type="submit" class="btn btn-primary" value="Enregistrer">
        </div>

    </div>

</form>

Sélecteurs jQuery

Plusieurs éléments peuvent être retrouvés simplement à l'aide de sélecteurs jQuery.

Par exemple, pour retrouver l'information entrée dans le formulaire à partir de l'identifiant de la balise de saisie :

jQuery

titre = $('#titre').val();

Si la balise <input> n'avait pas eu d'identifiant, on aurait pu travailler avec son attribut name. On prendra soin de cibler le formulaire au cas où il y aurait plusieurs formulaires dans la page Web.

jQuery

titre = $('#formulaire-formation input[name=titre]').val();

find() ou contexte du sélecteur

La fonction find() permet de retrouver des balises HTML parmi les enfants de la ou les balises placées devant l'appel. Si d'autres balises correspondent au sélecteur jQuery mais ne font pas partie des balises devant l'appel, elles ne seront pas sélectionnées.

Par exemple, pour trouver toutes les balises qui ont la classe row à l'intérieur du formulaire :

jQuery

$lignesDuFormulaire = $('#formulaire-formation').find('.row');

Dans cet exemple, la division avec la classe row qui n'est pas dans le formulaire ne sera pas sélectionnée.

On obtiendra le même résultat si on utilise un sélecteur jQuery avec deux paramètres. Les paramètres seront alors séparés par une virgule.

  • Le premier paramètre du sélecteur sera le sélecteur jQuery de ce qu'on cherche.
  • Le second indiquera à l'intérieur de quoi on cherche. Ce paramètre s'appelle le contexte. Il peut s'agir d'un objet jQuery (ex : $('#formulaire-formation') ) ou encore simplement le sélecteur jQuery (ex : '#formulaire-formation' ).

Ex :

jQuery

$lignesDuFormulaire = $('.row', '#formulaire-formation');

ou :

jQuery

$formulaire = $('#formulaire-formation');

...

$lignesDuFormulaire = $('.row', $formulaire);

children() vs find()

La fonction children() fait un travail semblable à find() sauf qu'elle ne cherche que parmi les enfants directs.

Si plus d'un niveau séparent la balise du départ de celle recherchée, seul find() pourra faire le travail.

Ex :

jQuery

$formulaire = $('#formulaire-formation');

...

titre = $formulaire.find('input[name=titre]').val();   // traverse tout l'arbre du DOM à partir de l'élément courant. On pourra donc retrouver un enfant d'un enfant...

Ceci ne fonctionnera pas car il y a plus d'un niveau entre le formulaire et la balise input :

jQuery

titre = $formulaire.children('input[name=titre]').val();  // traverse un seul niveau d'enfants

Formulaire qui entoure le bouton cliqué

Pour retrouver le formulaire du bouton qui vient d'être cliqué :

jQuery

$('input[type=submit]').click(function (event) {
    event.preventDefault();

 

    var $formulaire = $(this).parents("form:first");

    ...
});

Option sélectionnée dans une liste déroulante

La valeur de l'option sélecionnnée dans une balise <select> peut être retrouvé comme suit :

jQuery

niveau = $('select[name=niveau] option:selected').val();

et son texte :

jQuery

description = $('select[name=niveau] option:selected').text();

Si on a déjà un objet jQuery ou un objet du DOM (par exemple, une variable qui pointe sur le <select>), on peut retrouver l'option sélectionnée comme ceci :

jQuery

$select = $('select[name=niveau]');

...
var niveau = $select.children('option:selected').val();

Exemple de gestion des messages d'erreur de validation

Cet extrait permet d'afficher une erreur de validation puis de mettre en évidence toute la zone qui contient le libellé, la zone de saisie et le message d'erreur.

Puisqu'il généralise la recherche de la division à mettre en évidence, il pourrait facilement être intégré dans une boucle qui valide chaque entrée du formulaire.

jQuery

if ($('input [name=titre]').val()) == '') {

    var $divErreur = $('#formulaire-formation').find('.erreur-titre');


    // affiche l'erreur dans la division correspondante
    $divErreur.html('Le titre est requis.');


    // ajoute la classe pour que l'élément HTML et le message apparaissent en rouge
    $divErreur.parents('.form-group:first').addClass('has-error');

}

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre