Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/03/2011, 17h21   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
Par défaut Passage d'une chaine à une fonction javascript

Bonjour,

Je travaille en .net c# et je tente de passer une chaîne de caractère à une fonction javascript depuis mon code behind.

Je n'ai aucun souci sur des chaines simples, mais dès que cela devient complexe, je plante sur des caractères spéciaux.

J'ai bien remplacé les " par \" mais ca ne semble pas suffire, il y en a d'autres qui empechent le bon fonctionnement.

Exemple d'une chaine: (qui affiche un petit texte avec une couleur et une police... pas bien compliqué normalement)
Code :
1
2
 
"<p><span style="font-size: medium; color: #000000; background-color: #ff6600;"><span style="font-size: xx-large;">coucou</span>, c'est juste <strong>un test</strong></span></p>  <p><span style="background-color: #ffff00;">voilou</span></p>  <p>&nbsp;</p>  <p><span style="background-color: #ffff00;"><span style="font-family: arial black,avant garde; font-size: small;"><em><span style="text-decoration: underline;"><span style="background-color: #339966;">c'est modifi&eacute; ^^</span></span></em></span><br /></span></p>"
Que dois-je faire ?
y a t'il une méthode toute faite pour faire cela ?

MErci d'avance,
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 20h13   #2
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 755
Points : 4 755
Bonjour,
le plus simple me semble t-il est de mettre ta chaine entre '
exemple
Code :
var chaine = 'la chaine incluse';
dans ce cas les doubles quote, ", ne pose pas de problème
exemple
Code :
var chaine = 'la chaine "incluse" avec des doubles quote';
et pour insérer une simple quote, ', il faut échapper celle ci avec un antislash \
exemple
Code :
var chaine = 'la chaine c\'est rompue';
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 21h18   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
Effectivement tes conseils marchent très bien dans la fonction javascript.

Mais mon souci est que je l'appelle depuis le code behind.. Et la cela ne change rien...

Je génère en fait dynamiquement un évènement sur un GridView.

e.Row.Attributes.Add("onmouseover", "FctJavaScript('" + chaine + "')");

Je seche un peu sur la syntaxe de la chaine...

Une idée ?
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 21h29   #4
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 755
Points : 4 755
dans ce cas il faur également échapper les " avec un \
ta chaine devient
Code :
'<p><span style=\"font-size: medium; color: #000000; background-color: #ff6600;\"><span style=\"font-size: xx-large;\">coucou</span>, c\'est juste <strong>un test</strong></span></p> <p><span style=\"background-color: #ffff00;\">voilou</span></p> <p>&nbsp;</p> <p><span style=\"background-color: #ffff00;\"><span style=\"font-family: arial black,avant garde; font-size: small;\><em><span style=\"text-decoration: underline;\"><span style=\"background-color: #339966;\">c\'est modifi&eacute; ^^</span></span></em></span><br /></span></p>'
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 21h53   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
Oulah je dois m'y prendre comme un pied

Bon voici le code C#.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string MaChaine = ... (lecture colonne de table SQL)
 
MaChaine.Replace('"', '\"');
 
MaChaine= " ' " + MaChaine + " ' ";
 
e.Row.Attributes.Add("onmouseover", "FctJavaScript( ' " + MaChaine+ " ')");
 
Et le code Javascript:
 
function ShowTip(MaChaine) 
        {
            document.getElementById("Label1").innerHTML = MaChaine;              
        }
Au final Firebug me dit soit :
- missing ) after argument list
soit d'autres messages sur des caracteres manquants...
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 22h11   #6
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 755
Points : 4 755
en C# je ne sais pas mais en javascript
Code :
1
2
3
var chaine = 'c\'est "bien"';
chaine= chaine.replace(/"/g, '\\"');
alert( chaine);
le \ étant un caractère d'échappement il faut l'échapper
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 22h16   #7
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
Elle fait quoi ta deuxieme ligne ?
Je veux dire, elle remplace quoi par quoi ?

Code :
chaine= chaine.replace(/"/g, '\\"');
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 22h43   #8
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 755
Points : 4 755
(/"/g, '\\"');

/"/g est l'expression régulière
/"/ c'est le caractère à remplacer , ici " mis entre slash
g est la façon de traiter la recherche, g = global

(/"/g, '\\"');
\\" est la valeur de remplacement

en résumé on remplace " par \" dans toute la chaine

EDIT
je ne suis pas un spécialiste en RegExp et ne suis donc pas sûr que cela soit clair.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 22h48   #9
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
ok merci à toi. vais voir tout ca.
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 01h20   #10
Membre du Club
 
Avatar de Billy KiT
 
Inscription : mars 2011
Messages : 47
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 47
Points : 59
Points : 59
Salut,
c'est moi ou tu mets 2 fois les ' ' :

Code :
1
2
MaChaine= " ' " + MaChaine + " ' ";
e.Row.Attributes.Add("onmouseover", "FctJavaScript( ' " + MaChaine+ " ')");
Il faut soit virer la première ligne, soit écrire

Code :
1
2
MaChaine= " ' " + MaChaine + " ' ";
e.Row.Attributes.Add("onmouseover", "FctJavaScript(" + MaChaine+ ")");
enfin il me semble
Billy KiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 09h55   #11
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
Citation:
Envoyé par Billy KiT Voir le message
Salut,
c'est moi ou tu mets 2 fois les ' ' :

Code :
1
2
MaChaine= " ' " + MaChaine + " ' ";
e.Row.Attributes.Add("onmouseover", "FctJavaScript( ' " + MaChaine+ " ')");
Il faut soit virer la première ligne, soit écrire

Code :
1
2
MaChaine= " ' " + MaChaine + " ' ";
e.Row.Attributes.Add("onmouseover", "FctJavaScript(" + MaChaine+ ")");
enfin il me semble
En effet... Mais ca change pas grand chose...

J'ai toujours les mêmes messages, soit "unterminated string literal", soit "missing ) after argument list".

si je prends ma chaine en dur directement dans la fonction javascript de la manière suivante, je n'ai aucun souci. (J'ai bien ajouter les simples quotes au début et à la fin + échapper les simples quotes dans la chaine).

Code :
1
2
3
4
5
6
7
function ShowTip(description) 
        {
            var chaine = '<p><span style="font-size: medium; color: #000000; background-color: #ff6600;"><span style="font-size: xx-large;">coucou</span>, c\'est juste <strong>un test</strong></span></p>  <p><span style="background-color: #ffff00;">voilou</span></p>  <p>&nbsp;</p>  <p><span style="background-color: #ffff00;"><span style="font-family: arial black,avant garde; font-size: small;"><em><span style="text-decoration: underline;"><span style="background-color: #339966;">c\'est modifi&eacute; ^^</span></span></em></span><br /></span></p>';
 
            document.getElementById("Label1").innerHTML = description ;
 
        }
Mais l'envoyer dynamiquement depuis le code behind, c'est mission impossible, je deviens chèvre !!! j'essaye tout dans tous les sens !

Il y a des caractères qui bloquent, mais lesquels ???

Voici le résultat dans Firebug..

Citation:
onmouseover="ShowTip('&lt;p>&lt;span style=&quot;font-size: medium; color: #000000; background-color: #ff6600;&quot;>&lt;span style=&quot;font-size: xx-large;&quot;>coucou&lt;/span>, cest juste &lt;strong>un test&lt;/strong>&lt;/span>&lt;/p>
&lt;p>&lt;span style=&quot;background-color: #ffff00;&quot;>voilou&lt;/span>&lt;/p>
&lt;p>&amp;nbsp;&lt;/p>
&lt;p>&lt;span style=&quot;background-color: #ffff00;&quot;>&lt;span style=&quot;font-family: arial black,avant garde; font-size: small;&quot;>&lt;em>&lt;span style=&quot;text-decoration: underline;&quot;>&lt;span style=&quot;background-color: #339966;&quot;>cest modifi&amp;eacute; ^^&lt;/span>&lt;/span>&lt;/em>&lt;/span>&lt;br />&lt;/span>&lt;/p>')"
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 09h58   #12
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
Essaye de localiser les passages de ta chaîne qui posent problème et de régler un problème à la fois (en faisait une sous chaîne ne contenant que la partie posant problème), ce sera beaucoup plus simple.
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 10h17   #13
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
Oui, en effet, tu as raison.

bon c'est bien les simples quotes qui posent pb dans le code behind...

Si je passe ca, aucun souci...

Code :
1
2
3
4
5
6
7
string test = "cest juste un test";
e.Row.Attributes.Add("onmouseover", "ShowTip('" +  test + "')");
 
function ShowTip(test) 
        {              
            document.getElementById("Label1").innerHTML = test;         
        }
Par contre ca, c'est foutu... Pourtant l'apostrophe est échappée non ??

Code :
1
2
3
4
5
6
7
string test = "c\'est juste un test";
e.Row.Attributes.Add("onmouseover", "ShowTip('" +  test + "')");
 
function ShowTip(test) 
        {              
            document.getElementById("Label1").innerHTML = test;         
        }
Il me met:
Citation:
missing ) after argument list
[Stopper sur une erreur] ShowTip('c'est juste un test')
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 10h35   #14
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
en javascript oui, mais si ça passe d'abord par un langage serveur il faut aussi l'échapper pour ce langage.
Dit autrement : il faut que dans ton javascript ta chaîne contienne le caractère d'échappement. Donc côté serveur il faut que tu génères une chaîne affichant un caractère d'échappement.
ex :
Code :
1
2
3
4
//Serveur :
string test = "c\\'est juste un test";
// Javascript (client) :
string test = "c\'est juste un test";
Il faut d'ailleurs que tu échappe ton "\" à chaque fois que ta chaîne est évaluée (elle ne l'est pas forcément qu'une fois par le serveur et par le client, dans le cas des regex par exemple elle le sera 2 fois par le client : par javascript d'abord, par la regex ensuite).
Une méthode bourrin pour savoir combien d'échappement est nécessaire est de doubler le nombre de "\" tant que ça passe pas : "\", "\\", "\\\\", "\\\\\\\\", ... Inutile de t'embetter avec les valeurs intermédiaires (genre 6 "\") car elles n'ont aucun sens si on comprend la logique de l'échappement.

PS :
en javascript tu ne peux pas déclarer de variable de type "string", c'est forcément un "var".
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 11h04   #15
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
mouarf, échapper l'échappement... c'est des malades

Ok bon je dois être maudit ...

Je coups ma chaine en 3 parties.

Je l'assigne en dur dans un string dans le code behind.

Je fais donc un :

Code :
1
2
3
4
5
string test = "<p><span style=\"background-color: #ffff00;\">voilou</span></p>";
 
test = test.Replace("'", "\\'");
 
e.Row.Attributes.Add("onmouseover", "ShowTip('" +  test + "')");
Aucun souci....

Je rajoute des bouts au fur et à mesure jusqu'à passer la chaine complete, aucun souci...

J'utilise alors ma variable qui vient de SQL directement (c'est une colonne de table en fait)

donc ...
Code :
1
2
3
4
 
string test = row.Description;
test = test.Replace('"', '\"').Replace("'", "\\'");
e.Row.Attributes.Add("onmouseover", "ShowTip('" +  test + "')");
ca marche plus ouiiiiiin, j'en ai marre....

rhaaa je crois que je le tiens... En fait il me rajoute des \r\n dans ma chaine lorsque elle vient de SQL ce c...
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 11h14   #16
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
Ca ne sert à rien de faire le replace côté client (en javascript donc). Si ta chaîne est mal formée en javascript tu ne peux plus rien faire dessus...
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 11h15   #17
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
Citation:
Envoyé par Loceka Voir le message
Ca ne sert à rien de faire le replace côté client (en javascript donc). Si ta chaîne est mal formée en javascript tu ne peux plus rien faire dessus...
je ne le fait pas coté client le replace...

Mais le pb semble venir des \r\n qu'il me rajouter lorsqu'il vient de SQL.
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 11h18   #18
Candidat au titre de Membre du Club
 
Inscription : juin 2004
Messages : 75
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 75
Points : 11
Points : 11
ouaip ok c'est bon...

Bon venant de SQL il faut bien faire un ...

Code :
test = test.Replace("'", "\\'").Replace("\r\n", " ");
Les doubles quotes sont automatiquement gérées, par contre il faut traiter les \r\n qu'il rajoute...

ouf... merci à vous !
keryss est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h49.


 
 
 
 
Partenaires

Hébergement Web