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

jQuery Discussion :

insertRow - impossibilité de définir les propriétés de la ligne créée


Sujet :

jQuery

  1. #1
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut insertRow - impossibilité de définir les propriétés de la ligne créée
    Bonjour,

    Lorsque j'ajoute une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newRow = document.getElementById("mytab").getElementsByTagName("tbody")[0].insertRow(0)
    je n'arrive pas à lui donner un id et une class.

    J'ai essayé de nombreuses choses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newRow.id=..., newRow.setAttribute(...), newRow.classList.add(...)
    Rien n'y fait.

    Pourtant, ma ligne est bien créée et je lance sans problème des newRow.insertCell(-1)

    Y a-t-il des restrictions ?

    Merci

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    As-tu un code pour voir... ? Car j'ai essayé avec newRow.id="..." et ça fonctionne chez moi...

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Exemple :

    Code HTML : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    <!DOCTYPE html>
    <html lang="fr" dir="ltr">
    <head>
      <meta http-equiv="cache-control" content="public, max-age=60">
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
      <meta name="author" content="Daniel Hagnoul">
      <title>test</title>
      <style>
        * {
          box-sizing: border-box;
        }
        
        table {
          margin: auto;
          border: 1pt solid grey;
          border-spacing: 0;
        }
        th, td {
          min-width: 10rem;
          max-width: 20rem;
          padding: 0.3rem;
          border: 1pt solid grey;
        }
        #oneRow {
          color: red;
        }
        .colorCell {
          background-color: rgba( 100, 25, 75, 0.25 );
        }
      </style>
      <script>
        'use strict';
        
        document.addEventListener( "DOMContentLoaded", ev => {
          
        }, false );
        
        window.addEventListener( "load", ev => {
          
          const
            elemTbody = document.querySelector( "table > tbody" ),
            elemRow = elemTbody.insertRow( -1 ),
            elemCell = elemRow.insertCell( -1 );
            
          elemRow.setAttribute( "id", "oneCell" );
          
          elemCell.setAttribute( "class", "colorCell" );
          elemCell.textContent = "Une cellule";
          
          const
            elemCell3 = elemRow.insertCell( -1 );
            
          elemCell3.setAttribute( "colspan", 3 );
          elemCell3.style.textAlign = "center";
          elemCell3.textContent = "Une grande cellule";
     
        }, false );
      </script>
    </head>
    <body>
     
      <table>
        <thead>
          <tr>
            <th>head1</th>
            <th>head2</th>
            <th>head3</th>
            <th>head4</th>
          </tr>
        </thead>
        <tbody>
        </tbody>
      </table>
     
    </body>
    </html>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  4. #4
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut
    Merci.

    Vous avez raison, je me suis trompé de diagnostic :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo 'var newRow = document.getElementById("mytab").getElementsByTagName("tbody")[0].insertRow(0);';
    echo 'newRow.id="'.$newid.'";';
    echo 'newRow.setAttribute("class", "myaction");';
    fonctionne correctement.

    Ce qui ne fonctionne pas, c'est que la nouvelle ligne créée ne réagit pas à :
    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
     
    <script>
    $(document).ready(function() {
    	$(".myaction").click(function() {
    	$.ajax({
    		url: \traitement.php\',
    		type : \'POST\',
    		dataType : \'script\',
    		data : \'id=\'+ this.id,
    		error: function() {
    		alert("Echec du traitement");
    		}
    		});
    	});
    });
    </script>
    alors que toutes les lignes du tableau créées lors de la génération initiale de la page fonctionnent correctement.

    Philippe

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par Pgs Voir le message
    Ce qui ne fonctionne pas, c'est que la nouvelle ligne créée ne réagit pas à : $(".myaction").click(function() {
    C'est le comportement normal avec du code dynamique.

    En JS, il faut tuer et recréer le gestionnaire d'événement après avoir modifié la table.

    En jQuery, voir : Différences entre on() avec 1 ou 2 sélecteurs

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut
    Je te remercie pour l'explication et pour le lien.

    a) Mais comme je débute avec jQuery, je ne vois pas ce qu'il faut que je code pour "rafraîchir" la gestion des évènements après ajout de la ligne.
    Peux tu m'aider ?

    b) Petite question : si, au lieu de passer par insertRow, j'ajoute "<tr id="..." class="myaction">...</tr>" au innerHTML du tbody, cela résoud le problème ?

    Merci

  7. #7
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut
    J'ai remplacé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(".myaction").click(function()
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(document).on(\'click\', \'.myaction\', function()
    et ça fonctionne.

    Je te remercie !

  8. #8
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(document).on(\'click\', \'.myaction\', function() ...
    a résolu mon problème : si je rajoute avec newRow, dans tbody, une ligne de classe myaction, les évènements sur cette ligne sont ensuite bien pris en compte.

    En revanche, si je mets à jour complètement tbody par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("idtab").getElementsByTagName("tbody")[0].innerHTML=...
    alors le premier click suivant cette mise à jour ne déclenche pas d'action, puis tous les clicks suivants fonctionnent parfaitement.

    Faut-il lancer une instruction après le remplacement du innerHTML du tbody afin que les évènements soient ensuite gérés dès le premier click ?

    Merci

  9. #9
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Sans vos codes pour tester...

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  10. #10
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut
    Bonjour,
    Voici :
    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
    22
    23
    24
    25
    <!doctype html>
    <html>
    	<head>
    	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    	<script src="jquery-3.2.1.js"></script>
    	<script>
    	function traitement(obj) {
    		if((obj.id.substring(0,1)!="e")||(confirm("Confirmer")))
    		{
    		$.ajax({
    			url: 'trt.php',
    			type : 'POST',
    			dataType : 'script',
    			data : 'id='+ obj.id+'&val='+ obj.value,
    			error: function() {
    			}
    			});
    		}
    	}
    	$(document).ready(function() {$(document).on('click', '.c1', function() {traitement(this);});
    	</script>
    	</head>
    	<body><table id="idtab"><tbody>
    	<tr><td>En cours</td><td id="r2" class="c1"></td></tr>
    	</tbody></table></body></html>
    trt.php contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     document.getElementById("idtab").getElementsByTagName("tbody")[0].innerHTML='<tr><td>Traité</td><td id="r2" class="c1"></td></tr>';
    Et voici ce qui se passe :
    a) si je clique sur le td ayant pour id "r2", cela lance trt.php et donc cela remplace le innerHTML du tbody
    b) si je fais ensuite un nouveau click sur ce td, il ne se passe rien.
    c) Ce n'est qu'à partir du click suivant que cela fonctionne à nouveau.

    A chaque fois que le innerHTML du tbody est remplacé, le premier click effectué ensuite sur <td id="r2" class="c1"> ne déclenche pas d'évènement. Mais tous les clicks suivants sur ce td fonctionnent.

  11. #11
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut
    Je pense que j'ai trouvé.
    J'ai aussi dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(document).ready(function() {$(document).on('blur', '.c1', function() {traitement(this);});
    $(document).ready(function() {$(document).on('change', '.c1', function() {traitement(this);});
    Et en général, je lance la mise à jour de tbody par un select. Lorsque que je vais ensuite cliquer sur une zone du tbody, il traite l'évenement blur du select, ce que je ne veux pas ici.

    Je vois deux possibilités :
    * limiter $(document).on('blur'... aux input,
    * faire automatiquement perdre le focus au select directement après traitement.

    Pouvez-vous me guider concernant le code pour ces deux cas ?

    Merci

  12. #12
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Dans le message n° 10, pourquoi changer le contenu du "tbody" alors que vous ne devez changer que le contenu texte d'une cellule de la table ?

    Je vous conseille de demander à un modérateur le transfert de votre discussion vers le forum jQuery.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

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

Discussions similaires

  1. Définir les propriétés de 2 balises dans la même déclaration
    Par David_Vincent_2016 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 17/11/2016, 08h52
  2. Réponses: 2
    Dernier message: 18/08/2013, 12h22
  3. Définir les propriétés par défaut du Projet.
    Par Lekéké dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 22/10/2010, 11h25
  4. Syntaxe pour définir les div en une ligne
    Par ml1234 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 04/07/2009, 15h20
  5. Définir les propriétés d'une liste <select>
    Par Sytchev3 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 19/10/2007, 14h14

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