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 :

Rechercher et remplacer code à la volée ?


Sujet :

JavaScript

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut Rechercher et remplacer code à la volée ?
    Bonjour,

    je souhaiterais remplacer à la volée certains contenus d'une page html.

    Par exemple concrètement :
    Remplacer toutes les chaînes qui commencent par :
    rel="
    et qui finissent par :
    ]"
    par ce contenu :
    target=_blank

    Euh... c'est possible ça ?

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut
    bonsoir,

    c'est possible avec des expressions régulières.
    Regarde si celle-ci te convient :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	var reg = new RegExp("^(rel=).*(])$","gi");
     
     
    	var texte1 = "rel=coucou tout le monde]";
    	var texte2 = "coucou rel=tout] le monde";
    	var texte3 = "coucou tout le monde";
    	var texte4 = "coucou tout le monde]";
     
    	alert(texte1.replace(reg, "target=_blank"));  //target=_blank"
    	alert(texte2.replace(reg, "target=_blank"));  //inchangée
    	alert(texte3.replace(reg, "target=_blank"));  //inchangée
    	alert(texte4.replace(reg, "target=_blank"));  //inchangée

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Oh… joli !

    Et c'est possible de changer le code html d'une page statique à la volée lors de son ouverture ?

    Il y a une fonction qui fait ce rechercher / remplacer ?

  4. #4
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Mister Paul Voir le message
    Oh… joli !

    Et c'est possible de changer le code html d'une page statique à la volée lors de son ouverture ?

    Il y a une fonction qui fait ce rechercher / remplacer ?
    A la barbare :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.body.innerHTML = document.body.innerHTML.replace(....);

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut


    Pourquoi barbare ? Ça me paraît surtout très puissant !

    On peut aussi l'utiliser pour directement insérer du code (sans en remplacer) ?
    Moi j'utilisais un document.write

  6. #6
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Moi la question que je me pose, c'est surtout pourquoi tu mets des attributs rel si tu veux des attributs target ?

  7. #7
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Mister Paul Voir le message


    Pourquoi barbare ? Ça me paraît surtout très puissant !

    On peut aussi l'utiliser pour directement insérer du code (sans en remplacer) ?
    Moi j'utilisais un document.write
    document.write ne peut s'utiliser que quand le document est encore en cours d'écriture du genre :


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <body>
    debut
    <script>document.write('milieu');</script>
    fin
    </body>

    il ne peut donc pas s'utiliser en dehors du body et ne peut non plus pas être appelé après le chargement de la page. (exemple une fonction différée par un évènement ou un timer)

    ---

    le body.innerHTML remplace tout le code HTML de la page, j'en déduis donc (je me trompe p-ê... si qqn peut confirmer ou infirmer?) que si tu l'utilises, il va remplacer tout le code par un code quasi identique et que toute la page sera réévaluée. (au niveau du DOM). C'est pourquoi je pense que ce n'est pas la meilleure solution même si en pratique ça fonctionne bien si on ne doit l'utiliser qu'une fois par page.

    oui, tu peux l'utiliser pour ajouter du code, par exemple si tu as un body vide et que tu construis la page dynamiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.body.innerHTML += content;
    ---

    enfin, une alternative, est de ne modifier que les éléments voulus, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var rel, i, liens = document.getElementsByTagName('a');
    for(i=0;i<liens.length;i++){
        if(rel = liens[i].getAttribute('rel')){
            if(rel.length > 0 && rel.charAt(rel.length-1)==']'){
                liens[i].target='_blank';
            }
        }
    }

  8. #8
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Sinon, une méthode un peu moins barbare (mais pas compatible IE<8) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var elems = document.querySelectorAll('[rel$="]"]');
    var elemLength = elems.length;
    while(elemLength--){
        elems[elemLength].removeAttribute('rel');
        elems[elemLength].target = '_blank';
    }

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Moi la question que je me pose, c'est surtout pourquoi tu mets des attributs rel si tu veux des attributs target ?
    Je ne suis pas sûr au final de mettre vraiment des target.
    En fait c'est une histoire de film Flash qui s'ouvre en lecture dans une box. Ça marche bien mais c'est incompatible avec les smartphones.
    Le code qui ouvre le layer ne fait pas de fallback Flash->HTML5 quand nécessaire. Alors je me le bricole.

    Je retourne à mon document.write vs innerHTML

  10. #10
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Moi la question que je me pose, c'est surtout pourquoi tu mets des attributs rel si tu veux des attributs target ?
    Pareil, je suis assez surpris.

    Citation Envoyé par Willpower Voir le message
    document.write ne peut s'utiliser que quand le document est encore en cours d'écriture du genre :

    (...)

    il ne peut donc pas s'utiliser en dehors du body et ne peut non plus pas être appelé après le chargement de la page. (exemple une fonction différée par un évènement ou un timer)
    si justement. Tu peux utiliser document.write() dans une fonction... Et c'est là que beaucoup de débutants font l'erreur : car dans ce cas document.write() remplace tout le contenu de la page (tout ce qui se trouve entre <html> et </html>) par la valeur de son argument.

    Le mieux est de passer par les fonctions DOM.


    Citation Envoyé par Willpower Voir le message
    le body.innerHTML remplace tout le code HTML de la page, j'en déduis donc (je me trompe p-ê... si qqn peut confirmer ou infirmer?) que si tu l'utilises, il va remplacer tout le code par un code quasi identique et que toute la page sera réévaluée. (au niveau du DOM). C'est pourquoi je pense que ce n'est pas la meilleure solution même si en pratique ça fonctionne bien si on ne doit l'utiliser qu'une fois par page.
    la valeur donnée à innerHTML remplacera tout ce qui se trouve entre les balises <body> et </body> (et cela fait une sacré différence avec document.write() ! )

    Mais comme l'a indiqué Bovino c'est une méthode barbare car le contenu d'une page HTML (balises + texte + style en ligne, etc) est énorme donc gourmand en mémoire. L'alternative que tu proposes est plus propre car tu ne cibles que quelques éléments de la page.

  11. #11
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Auteur Voir le message
    si justement. Tu peux utiliser document.write() dans une fonction... Et c'est là que beaucoup de débutants font l'erreur : car dans ce cas document.write() remplace tout le contenu de la page (tout ce qui se trouve entre <html> et </html>) par la valeur de son argument.
    oui, je résumais son utilisation à l'écriture sur la page ouverte, car en pratique document.write n'est (quasi?) jamais utilisé pour remplacer tout le corps d'une page. (si? exemple de site?)



    Citation Envoyé par Auteur Voir le message
    Mais comme l'a indiqué Bovino c'est une méthode barbare car le contenu d'une page HTML (balises + texte + style en ligne, etc) est énorme donc gourmand en mémoire. L'alternative que tu proposes est plus propre car tu ne cibles que quelques éléments de la page.
    J'ai moi-même signalé en proposant ma première solution qu'elle était barbare.


  12. #12
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut
    Citation Envoyé par Willpower Voir le message
    oui, je résumais son utilisation à l'écriture sur la page ouverte, car en pratique document.write n'est (quasi?) jamais utilisé pour remplacer tout le corps d'une page. (si? exemple de site?)
    on peut l'utiliser pour créer du contenu dans une pop-up. D'exemple de sites, je n'en ai pas, d'erreurs de débutants, tu en trouveras à la pelle dans ce forum


    Citation Envoyé par Willpower Voir le message
    J'ai moi-même signalé en proposant ma première solution qu'elle était barbare.

    euh oui pardon

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 082
    Points : 44 698
    Points
    44 698
    Par défaut
    Bonjour à tous,
    cela deviendrait-il la préoccupation du moment ????
    http://www.developpez.net/forums/d11...elements-page/

  14. #14
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 141
    Points
    11 141
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Bonjour à tous,
    cela deviendrait-il la préoccupation du moment ????
    http://www.developpez.net/forums/d11...elements-page/
    il y a effectivement des similitudes.

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Bon j'ai remonté mes manches avec vos infos précieuses... mais je bute encore...


    En route les choses se sont précisées et je cherche à modifier tous les liens de la page qui ont l'extension .mp4 en insérant devant un début d'URL :

    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
    function changeLien()
    	{ 	
    		var i;
    		var lien;
    		var reg = new RegExp('^(href=").*(.mp4)$','gi');
    		lien = document.getElementsByTagName('a');
     
    		for (i=0; i<lien.length; i++)
    		{
    			if (lien[i].href.match(reg))
    			{	
    				var partie = new Array();
    				partie = reg.split('"');
    				document.getElementByTagName(lien[i].href).innerHTML = 'http:// www.ma_nouvelle_adresse.com/'+partie[1];
    			}
    		}
    	}
    Mais ça ne fonctionne pas (je ne rentre jamais dans le 'if')

    Qu'est-ce que j'ai mal fait ?

  16. #16
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reg = new RegExp('^(href=").*(.mp4)$','gi');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (lien[i].href.match(reg))
    Il est rare que le lien d'une balise <a> commence par href="

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Il est rare que le lien d'une balise <a> commence par href="
    Aïe je n'y arrive pas...
    Qu'est-ce que j'aurais dû écrire ?

  18. #18
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Dans ton expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reg = new RegExp('^(href=").*(.mp4)$','gi');
    ^(href=") signifie : commence par 'href="'.
    Or, cette expression régulière, tu l'appliques à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lien[i].href.match(reg)
    c'est à dire au contenu de l'attribut href de ton lien !
    Tu recherches donc un lien qui serait écrit comme ça :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href='href="www.toto.fr'>Lien</a>
    tu comprends bien (du moins, je l'espère...) que ça ne va pas !

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Oui là j'ai bien compris !

    Mais je n'arrive toujours pas à trouver comment faire passer ça. J'ai essayé : tout en gardant la même expression régulière. Mais ça ne va pas non plus…
    Il y a d'autres erreurs dans mon code ?

  20. #20
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Je suis nul en RegExp, donc ma réponse est à prendre avec des pincettes.

    Mais tu dois faire l'inverse : retirer le "href" de l'expression régulière :

    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lien[i].href.match(/(.mp4)$/gi)

    car "lien[i]" ne renvoit pas un "string" mais un objet.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/01/2008, 20h45
  2. Problème code de la fonction Rechercher et Remplacer
    Par LaPanic dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/06/2007, 17h10
  3. Réponses: 4
    Dernier message: 13/10/2005, 14h44
  4. [TP] Recherche d'un code source taquin à 9 cases
    Par dericthebeast dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 03/08/2005, 18h34
  5. Réponses: 11
    Dernier message: 01/12/2004, 19h09

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