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 :

Modifier le texte de toutes les cellules class="xyz"


Sujet :

JavaScript

  1. #1
    Membre régulier
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 196
    Points : 112
    Points
    112
    Par défaut Modifier le texte de toutes les cellules class="xyz"
    Bonjour,

    J'ai l'affichage d'un tableau dont le nom d'utilisateur est trop long,
    ex: Alexandre Dutoit (Bureau XYZ) (Ville ABC)

    J'ai un tableau du genre:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <tr>
    <td>NoInv</td>
    <td class="client">Alexandre Dutoit (Bureau XYZ) (Ville ABC)</td>
    ...
    </tr>
    <tr>
    <td>NoInv</td>
    <td class="client">France Malabrutet (Bureau 123) (Ville 098)</td>
    ...
    </tr>


    J'ai essayé un script du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var x=document.getElementsByClassName("client")
    for (i = 0; i < x.length; i++) {
        y=x[I].indexOf("(")    // Cherche la position de la première parenthèse dans le nom du client
    }
    Mais je recois un message d'erreur:
    TypeError: x[i].indexOf is not a function
    Merci d'avance,
    Jacques

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    indexOf() n'existe pas... enfin pas dans les HTMLElements


    devYan.

  3. #3
    Membre régulier
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 196
    Points : 112
    Points
    112
    Par défaut
    ... j'ai essayé avec slice, split.... même résultat!

    Jacques

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 125
    Points : 149
    Points
    149
    Par défaut
    Comme te l'as indiqué Devyan, ce sont des méthodes présentes sur les array, or un objet htmlElement n'en est pas un.
    Si tu veux accéder à ton texte tu peux utiliser l'attribut HtmlElement#innerHTML qui te permet d'obtenir le contenu de ton <td> dans une chaine de caractères.

    Sinon, comment sont générées ces entrées dans le tableau ?

  5. #5
    Membre régulier
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 196
    Points : 112
    Points
    112
    Par défaut
    Bonjour Kaari,

    Merci, le innerHTML fonctionne très bien!
    Mon tableau est généré par SharePoint... et mon problème est que je ne peux utiliser Designer!

    Je dois donc utiliser le javascript pour modifier les nom, car le système affiche des noms trèèèès long
    (et ça me cause des problèmes dans les affichages)

    Mon problème maintenant, c'est que je dois trouver les nom/prénom parmi beaucoup de code
    (Ahhhhh ce Microsoft!!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="ms-imnSpan"><a onclick="GoToLink(this);return false;" href="/sites/_layouts/userdisp.aspx?ID=99">Malbouffe André (Bureau XXX) (Ville ABC)</a></span>
    ... ça avance!!

    Merci,
    Jacques

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par MrMeteo Voir le message
    Mon tableau est généré par SharePoint... et mon problème est que je ne peux utiliser Designer!
    Si tu n'as pas acès aux sources côté serveur, tout ce que tu peux faire c'est des rustines. Les noms trèèèès longs passeront toujours dans le tuyau HTTP et seront toujours utilisés par le navigateur pour préparer le rendu visuel (qui est complexe pour un tableau, j'insiste là-dessus).

    Si c'est un problème d'affichage, pourquoi ne pas le résoudre avec la technologie la mieux adaptée aux affaires d'affichage ? Je parle de CSS
    Code CSS : Sélectionner tout - Visualiser dans une fenêtre à part
    table { table-layout: fixed; }
    Voir : table-layout.

    Il semble que tu as un motif répétitif : (Bureau ...) (Ville ...). Tu pourrais utiliser une expression régulière pour repérer ce motif et le retirer des fragments de texte de ton DOM.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /\(Bureau [^\)]+\) \(Ville [^\)]+\)/g
    Je te déconseille innerHTML dans ce cas-là car, utilisé en écriture, il fait appel à l'interpréteur HTML pour reconstruire un fragment d'arbre DOM et le réinsérer dans la page. Utiliser l'interpréteur HTML quand tu cherches juste à modifier du texte brut, c'est un peu bête. Mais ça reste la solution la plus polyvalente, je l'avoue.

    Pour raffiner un peu le traitement il faut faire des hypothèses sur la structure HTML, tout en restant le moins dépendant possible. C'est un art délicat. Par exemple, si tu supposes que tous les textes à remplacer se trouvent dans des <a>, eux-mêmes descendant indirectement de tes <td class="client">, tu peux utiliser getElementsByTagName :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var x = document.getElementsByClassName("client");
    for (var i = 0; i < x.length; i++) {
        var liens = x[i].getElementsByTagName("a");
        for (var j = 0; j < liens.length; j++) {
            if (liens[j].childNodes.length === 1 && // si le lien n'a qu'un seul descendant, il y a des chances que ce soit un nœud texte
                    liens[j].firstChild.nodeType === Node.TEXT_NODE) { // je vérifie que c'est bien un nœud texte
                var noeudTexte = liens[j].firstChild;
                noeudTexte.data = noeudTexte.data.replace(/\(Bureau [^\)]+\) \(Ville [^\)]+\)/g, "");
        }
    }
    On peut aller plus loin si on suppose que tes utilisateurs disposent d'IE9 minimum. Cette supposition, tu l'as déjà faite car tu fais appel à getElemntsByClassName. À partir d'IE9, on dispose d'une propriété « magique » qui ressemble à innerHTML mais qui traite uniquement du texte brut (l'interpréteur HTML n'est pas utilisé) : il s'agit de textContent.
    On dispose aussi de childElementCount ainsi que querySelectorAll qui simplifie énormément le travail de sélection des éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var liens = document.querySelectorAll('td.client a');
    for (var i = 0; i < liens.length; i++) {
        if (!a.childElementCount) { // je vérifie que le lien ne contient pas d'éléments HTML car,
                                    // si je modifiais textContent, ils seraient supprimés
            a.textContent = a.textContent.replace(/\(Bureau [^\)]+\) \(Ville [^\)]+\)/g, "");
        }
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Si tu es sûr que toutes les balises td ayant pour classe "client" sont ta cible, et qu'elles ne contiennent rien d'autre que du texte (pas de balises), dans ce cas tu peux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var tdNodes = document.getElementsByTagName('td');
    for (var i=0, tdNode; tdNode = tdNodes[i++];) {
        if (tdNode.getAttribute('class')=='client')
            tdNode.firstChild.nodeValue = tdNode.firstChild.nodeValue.split(' (')[0];
     }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    c'est surtout que i != I



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var x=document.getElementsByClassName("client")
    for (i = 0; i < x.length; i++) {
        y=x[I].
    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 !

  9. #9
    Membre régulier
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 196
    Points : 112
    Points
    112
    Par défaut
    Bonjour,

    Avec la piste de querySelectorAll, puisque IE ne supporte pas getElementsByClassName,
    j'ai finalement utilisé ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	var e = document.querySelectorAll(".ms-vb-user");
    	for( var i = 0, l = e.length; i < l; i++ ) {
    		e[i].style.whiteSpace="nowrap";
    		var f = e[i].getElementsByTagName('a');
    		temp=f[0].innerHTML;
    		long_texte=temp.indexOf("(");
    		texte=temp.substring(0, long_texte);
    		e[i].innerHTML=texte;
    Comme je ne voulais pas garder le lien, j'ai utilisé le innerHTML pour remplacer
    tout ce qui se trouvait dans le TD, par le texte brut.

    Merci de votre aide!
    Jacques

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par MrMeteo Voir le message
    Bonjour,

    Avec la piste de querySelectorAll, puisque IE ne supporte pas getElementsByClassName,
    Pas tellement moins : http://www.quirksmode.org/dom/core/#t11 et http://www.quirksmode.org/dom/core/#t14.
    Tu ne peux réellement compter sur l'un comme sur l'autre qu'à partie d'IE9.

    Si tu te soucie vraiment de la compatibilité, utilise un polyfill ou un framework.

    Comme je ne voulais pas garder le lien, j'ai utilisé le innerHTML pour remplacer
    tout ce qui se trouvait dans le TD, par le texte brut.
    textContent remplace aussi, et il est plus efficace. Essaye !
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  11. #11
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    innerText fait l'affaire pour les old-IE, et concernant querySelectorAll pour que cela fonctionne avec IE8 il faut en rester à des sélecteurs CSS2.1

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

Discussions similaires

  1. [PPT-2007] Modifier la police de toutes les zones de texte d'un dipaorama
    Par filip79 dans le forum Powerpoint
    Réponses: 2
    Dernier message: 14/09/2014, 18h32
  2. [XL-2007] modifier dans une plage toutes les cellules qui contiennent un mot précis en VBA
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/10/2010, 18h24
  3. [html] Modifier du texte (sans afficher les balises)
    Par Alexino2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 25/07/2006, 16h43
  4. Actualiser les données de toutes les cellules d'1 colonne
    Par beurnoir dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/12/2005, 10h00
  5. [VBA-E] supprimer le contenu de toutes les cellules d'une feuille
    Par BipBip2 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/08/2004, 15h13

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