Partage
  • Partager sur Facebook
  • Partager sur Twitter

"&" dans innerHTML : gros souci ?

Sujet résolu
Anonyme
    22 août 2010 à 10:41:33

    Bonjour !

    Voilà, je suis confronté à un problème assez gênant en AJAX.
    Lorsqu'un internaute veut poster un message, je lui permet de visualiser celui-ci.
    Donc quand il clique sur le bouton "preview" un code AJAX "protège" la chaine avec htmlenties et la valeur de retour est placé dans un div avec innerHTML.
    Tout fonctionne bien.

    Le problème se trouve quand le textarea comporte le caractère "&". Le div ou écrit le innerHTML s'arrête à ce caractère précis. Il n'est pas affiché mais plus rien derrière non plus !

    Si l'internaute valide le message, il est posté normalement et tous les caractères sont affichés alors que son message passe dans la même protection. (htmlentites)

    L'erreur est donc dans le innerHTML de la preview quand il y a un symbole "&". L'affichage du message hors de la base de données se fait normalement avec ouo sans ce symbole.


    Toute aide sera appréciée :)
    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      22 août 2010 à 12:45:31

      Essaye d'écrire & au lieu de ton caractère seul.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        22 août 2010 à 13:08:32

        Citation : Nesquik69

        Essaye d'écrire & au lieu de ton caractère seul.



        Ca fait exactement la même chose. Ca "coupe" à partir du &.

        Si j'écris dans le textearea "test & test" ca écrit "test " dans le div avec innerHTML
        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2010 à 15:18:48

          eh,juste pour infomation le innnerHTML ne respecte pas le standard même si il parait facile d'usage.je pense qu'il est conseillé de travaillé avec le DOM
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            22 août 2010 à 15:32:04

            Je dis ça un peu au pif mais y'a pas un truc avec la fonction encodeURI() ?
            • Partager sur Facebook
            • Partager sur Twitter
              22 août 2010 à 15:34:41

              Tu remplace le symbole à l'insertion via un autre (fonction replace en js) et tu fais pareil pour l'affichage
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                22 août 2010 à 18:50:19

                Citation : stitox

                eh,juste pour infomation le innnerHTML ne respecte pas le standard même si il parait facile d'usage.je pense qu'il est conseillé de travaillé avec le DOM


                Excuses moi mon manque de maitrise dans le domaine, qu'est-ce que le DOM ?


                Citation : Thiht

                Je dis ça un peu au pif mais y'a pas un truc avec la fonction encodeURI() ?


                Ce n'est pas des URLs ici, c'est un texte tout ce qu'il y a de plus standard dans un textarea. (Tous les caractères sont donc susceptibles d'être entrés par l'internaute à première vue)


                Citation : Darkpolo

                Tu remplace le symbole à l'insertion via un autre (fonction replace en js) et tu fais pareil pour l'affichage


                Donc avant d'appeler mon code AJAX je remplace ce symbole et au moment d'afficher je fais l'inverse !
                Voilà qui n'est pas bête du tout ! Je vais trouver un truc du style ":00a00:"
                Je doute que cette séquence soit entrée par l'internaute et je supprime donc les possibles confusions ^^
                Merci, je vais chercher dans cette direction pour déjà voir ce que cela donne :)


                Merci de toutes vos réponses à tous :)
                • Partager sur Facebook
                • Partager sur Twitter
                  22 août 2010 à 18:59:39

                  DOM pour Document Object Model.
                  Sinon, vrai qu'à part faire un replace, ou utiliser Dom, je vois pas trop les choix que tu as.

                  Ps : il parle de innerHtml et de comment le remplacer : ici.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    22 août 2010 à 19:33:51

                    Et bien dans ce cas la, c'est bien DOM que j'utilise non ? Ou alors j'ai pas compris correctement ce qu'était le DOM.

                    Je vais tester avec replace, je vais me documenter sur cette fonction et je vous donnerais mes résultats :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 août 2010 à 19:38:07

                      Non, t'utilise une fonction propriétaire de Microsoft.
                      Le DOM, c'est l'utilisation de la "hiérarchie" d'un document.

                      Dans ton cas tu dois "crée" des éléments, et les assembler.
                      Lis un peu la partie sur innerHTML et la méthode qu'il donne, et tu comprendras.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        22 août 2010 à 20:10:14

                        Citation : lieo

                        Non, t'utilise une fonction propriétaire de Microsoft.
                        Le DOM, c'est l'utilisation de la "hiérarchie" d'un document.

                        Dans ton cas tu dois "crée" des éléments, et les assembler.
                        Lis un peu la partie sur innerHTML et la méthode qu'il donne, et tu comprendras.


                        Merci, ma lecture de tes liens avait été un peu rapide j'avais en effet pas compris correctement.


                        La avec le replace ca tourne, mais c'est franchement dégueulasse pas super propre quoi.
                        Je vais donc tenter de faire ça avec DOM ^^
                        Je vous tiens au courant ;)


                        EDIT:
                        En fait j'ai trouvé le problème !
                        Étant donné que ca passe par AJAX, les données sont transmises sous format d'une URL. Le symbole "&" est donc pris comme étant le symbole d'une nouvelle variable ! Donc le reste n'étant plus dans la "bonne" variable, c'est "coupé" dehors !
                        Le problème, c'est que même si je passe en DOM, ca ne changera plus rien puisqu'alors ce n'est pas innerHTML qui coince mais c'est AVANT l'appel de celui-ci...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 août 2010 à 21:19:07

                          Effectivement c'est pas essentiel et le problème venait pas de là :D .
                          Enfin t'auras appris une autre méthode toujours ça :p .
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            22 août 2010 à 22:16:50

                            Citation : lieo

                            Effectivement c'est pas essentiel et le problème venait pas de là :D .
                            Enfin t'auras appris une autre méthode toujours ça :p .




                            Avantage : J'ai en effet appris quelque chose
                            Inconvénient : Si je veux que ca tourne, obligation de faire un grand coup de replace() sur le caractère "&" avant le passage et de le refaire à l'inverse pour l'afficher après...

                            Si quelqu'un voit une solution, ca aiderait à la propreté de mon code :p
                            • Partager sur Facebook
                            • Partager sur Twitter
                              22 août 2010 à 22:20:48

                              Alala, et dire que j'allais te faire l'honneur d'intervenir après Nesquik69 :soleil: .
                              Tu as résolu ton problème, tant mieux.

                              Utilise la fonction encodeURIComponent() pour la suite :) .

                              Mais juste pour la route faisons un point sur innerHTML.
                              En effet cette fonction est « Propriétaire » (elle a été créée par Microsoft), mais elle est depuis longtemps implémentée dans les navigateurs.
                              Et (étonnement ?) cette fonction se révèle être moins lourde que DOM dans la plupart des cas.

                              Son utilisation n'est donc pas forcément déconseillée...
                              Cependant contrairement à l'utilisation de DOM, cette fonction peut comporter des bugs ! (de plus en plus rares)

                              Ainsi il est parfois préférable d'utiliser DOM pour être sûr de ne pas se tromper :) .
                              A noter que DOM est parfois strictement plus performant que innerHTML. Notamment dans les boucles...

                              Bref il est vrai que l'utilisation d'innerHTML simplifie l'expérience utilisateur. Surtout dans ton cas où tu dois inclure du html !

                              Bonne soirée !
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Venez sur Zeste de Savoir, on est bien :-) . Mon tuto PHPSpec.
                              Anonyme
                                22 août 2010 à 22:34:40

                                Citation : Nek'

                                Alala, et dire que j'allais te faire l'honneur d'intervenir après Nesquik69 :soleil: .
                                Tu as résolu ton problème, tant mieux.

                                Utilise la fonction encodeURIComponent() pour la suite :) .

                                Mais juste pour la route faisons un point sur innerHTML.
                                En effet cette fonction est « Propriétaire » (elle a été créée par Microsoft), mais elle est depuis longtemps implémentée dans les navigateurs.
                                Et (étonnement ?) cette fonction se révèle être moins lourde que DOM dans la plupart des cas.

                                Son utilisation n'est donc pas forcément déconseillée...
                                Cependant contrairement à l'utilisation de DOM, cette fonction peut comporter des bugs ! (de plus en plus rares)

                                Ainsi il est parfois préférable d'utiliser DOM pour être sûr de ne pas se tromper :) .
                                A noter que DOM est parfois strictement plus performant que innerHTML. Notamment dans les boucles...

                                Bref il est vrai que l'utilisation d'innerHTML simplifie l'expérience utilisateur. Surtout dans ton cas où tu dois inclure du html !

                                Bonne soirée !



                                Merci pour ces précisions !
                                Par contre ta solution, bien que d'après msdn ça à 'air d'être ce qu'il me faut, je sais pas l'utiliser ^^

                                C'est la que je dois l'utiliser :
                                xhr.send(encodeURIComponent(param));
                                


                                Merci :)


                                EDIT: Non, ce n'est pas la, joli message d'erreur ^^
                                SOLUTION: L'utiliser au moment de la récupération du message utilisateur.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  23 août 2010 à 11:24:16

                                  Je dirais même que dans la plupart des cas, innerHTML est plus rapide que le DOM.
                                  Dans le cas des boucles, oui, innerHTML est plus "lent" parce que mal utilisé. Il suffit d'ajouter dans la boucle une variable intermédiaire, et l'innerHTML uniquement lorsque la boucle est terminée.
                                  Pour ce qui est d'encodeURIComponent, il faut effectivement l'exécuter sur chacun des paramètres :
                                  "param1="+bidule+"&param2="+chouette 
                                  // => Devient
                                  "param1="+encodeURIComponent(bidule)+"&param2="+encodeURIComponent(chouette)
                                  
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  "&" dans innerHTML : gros souci ?

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown