11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je viens de mettre le doigt sur un problème assez étrange. Cela se produit quand j'appelle une fonction avec en paramètre une chaine de caractères comportant une ' (quote simple). Mais le hic, c'est justement tous mes caractères spéciaux sont transformés auparavant en entité html, j'ai donc logiquement des ' à la place de mes '. Malgré tout, le script plante et la fonction n'est pas appelée.

J'ai fait des tests avec d'autres caractères spéciaux (histoire de voir si c'était pas le ; qui merdouillait) et là aucun problème...

Que faire ?
D'avance merci.

PS: même problème sur Firefox, IE, et Opera.
Modifié par mat_chab (02 Sep 2007 - 12:43)
Salut,

Quel script, t'aurais un code ou une page en ligne à fournir ? Car si tu attends solution, ça risque d'être compliqué de t'aider avec si peu d'éléments. Smiley cligne
Le problème c'est que justement je ne pense pas que ça ai avoir avec le code (étant donné sa simplicité), mais bon voilà quand même ma fonction, et l'appel qui pose problème :
function suppr_alerte(neId, neTitre)
{
   if (confirm('Voulez-vous vraiment supprimer :\n"'+neTitre+'" ?'))
      document.location.href = mapage.php?idsuppr='+neId;
}

<a href="#" title="Supprimer" onclick="suppr_alerte('15','Ceci est ' un test');">Supprimer</a>

Sachant que n'importe quelle autre chaine de caractères comportant un ' fait aussi planter le truc.

Note: évidement le forum transforme les entités html, dans mon exemple la chaine est bien 'Ceci est &#039; un test'.

Note 2: c'est bien à l'appel de la fonction que ça plante, j'ai essayé de changer le contenu de la fonction plusieurs fois.

Voilà.
Modifié par mat_chab (02 Sep 2007 - 11:14)
Modérateur
Salut,

Tu as surtout des problèmes avec tes apostrophes qui sont mal placées (ouverture mais pas de fermeture).

Tu peux par exemple procéder ainsi :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<title>Exemple</title>

		<script type="text/javascript"><!--

function suppr_alerte(neTitre)
{
	return confirm('Voulez-vous vraiment supprimer :\n"' + neTitre + '" ?') ?
		true:
		false;
}

function init()
{
	var oA;
	
	oA = document.getElementById('test');

	oA.onclick = function()
	{
		return suppr_alerte('Ceci est un test');
	}
}

window.onload = init;

		//--></script>
	</head>
	<body>

<p><a href="mapage.php?idsuppr=15" id="test">Supprimer</a></p>

	</body>
</html>
Ca te permet que la suppression s'effectue avec JS actif ou non, ce langage ne faisant qu'ajouter la confirmation.
Le problème de ta solution c'est qu'elle ne peut s'appliquer qu'à un seul lien (à cause de l'id). Or moi j'ai besoin d'un lien "supprimer" par "éléments" dans ma page, éléments venant d'un base de donnée mysql (donc un nombre indéterminé).

Et de toute façon même si c'était possible, le problème serait identique puisque je devrais quand même passer le titre de mes éléments à javascript pour pouvoir afficher la confirmation. C'était d'ailleurs ça mon problème : pouvoir passer en paramètre des chaines comportant des '.
Et normalement la transformation en entité html (' devient &#039; en l'occurrence) permet d'éviter ce genre de problème... d'où le mystère...

Par ailleurs en poussant mes tests, j'ai découvert que ça fonctionnait en échappant mes &#039;. Il faudrait donc que j'ai des \&#039;, mais la encore problème : le addslashes en php ne va pas fonctionner... Case tête.
Modifié par mat_chab (02 Sep 2007 - 11:56)
Modérateur
mat_chab a écrit :
Le problème de ta solution c'est qu'elle ne peut s'appliquer qu'à un seul lien (à cause de l'id).
Tout à fait... mais tu ne l'avais pas demandé. Smiley cligne
Dans ce cas, on passe par les classes.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<title>Exemple</title>

		<script type="text/javascript"><!--

function suppr_alerte(neTitre)
{
	return confirm('Voulez-vous vraiment supprimer :\n"' + neTitre + '" ?') ?
		true:
		false;
}

function init()
{
	var aAs, iA;
	
	aAs = document.getElementsByTagName('a');
	iA = aAs.length;
	
	do if(aAs[--iA].className = 'test')
		aAs[iA].onclick = function()
		{
			return suppr_alerte(this.title);
		};
	while(iA > 0);
}

window.onload = init;

		//--></script>
	</head>
	<body>

<p><a href="mapage.php?idsuppr=15" title="Supprimer l'horrible lien" class="test">Supprimer</a></p>

	</body>
</html>

Modifié par koala64 (02 Sep 2007 - 12:06)
Effectivement... mon niveau en javascript ne me permettait pas de pondre un truc pareil, mais le résultat et assez joli Smiley langue

Mais du coup dernière question, le window.onload = init; doit il obligatoirement être appelé entre le balises <head></head> pour fonctionner ?
Edit: non.

Bon merci pour ton aide alors. Smiley biggrin
Modifié par mat_chab (02 Sep 2007 - 12:43)