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 03/07/2011, 10h41   #1
Membre du Club
 
Avatar de Paniez
 
Inscription : janvier 2003
Messages : 160
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 160
Points : 54
Points : 54
Par défaut Egalite entre 2 string

Bonjour,

J'ai un petit soucis de comparaison entre deux chaines de caractères.

J'ai deux tableaux de chaines de caractères et je souhaite savoir si chaque chaine du premier est contenu dans le second.
Le problème est assez basique, je vous l'accorde, mais, je ne sais pas pourquoi, le premier test d'égalité qui renvoie "vrai" (donc qu'il est bien contenu) me renvoie systématiquement "false", quelque soit le nombre, la position. Toutes les autres comparaisons fonctionnent bien, c'est uniquement la première occurrence qui pose problème.

Voici mes deux fonctions :
Code :
1
2
3
4
5
6
7
8
9
10
 
Array.prototype.in_array = function(p_val) {
  var l = this.length;
  for(var i = 0; i < l;i++) {
    if(this[i]==p_val) {
      return true;
    }
  }
return false;
}
Et ma boucle de test (tLigne est mon tableau contenant les valeurs à tester et eCheck est mon tableau contenant toutes mes checkbox) :

Code :
1
2
3
4
5
6
 
for(var i = 0; i < eCheck.length; i++)
  if(tLigne.in_array(eCheck[i].value))
    eCheck[i].checked=true;
  else
    eCheck[i].checked=false;
Ce code fonctionne bien, sauf pour le premier résultat à true où il me renvoie false.


Bonne journée
Paniez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 11h26   #2
Membre expérimenté
 
Avatar de nadox
 
Homme
Développeur
Inscription : février 2010
Messages : 360
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Développeur
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2010
Messages : 360
Points : 545
Points : 545
Bonjour,

J'ai testé ton code, et il fonctionne très bien.
Code html :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
<html>
<head>
    <script type="text/javascript">
    Array.prototype.in_array = function(p_val) {
        var l = this.length;
        for(var i = 0; i < l;i++) {
            if(this[i]==p_val) {
                return true;
            }
        }
        return false;
    }
    function winLoad() {
        var tLigne = ['d','c','b','a'];
        var eCheck = document.getElementsByTagName('input');
        for(var i = 0; i < eCheck.length; i++)
            if(tLigne.in_array(eCheck[i].value))
                eCheck[i].checked=true;
            else
                eCheck[i].checked=false;
    }
    </script>
</head>
<body onload="winLoad();">
        <label for="cbx0">cbx0</label><input type="checkbox" name="cbx0" id="cbx0" value="a" />
        <label for="cbx1">cbx1</label><input type="checkbox" name="cbx1" id="cbx1" value="b" />
        <label for="cbx2">cbx2</label><input type="checkbox" name="cbx2" id="cbx2" value="c" />
        <label for="cbx3">cbx3</label><input type="checkbox" name="cbx3" id="cbx3" value="d" />
</body>
</html>
Tu pourrais peut-être nous fournir tes données ? ce sont surement elle qui sont en cause...
D'ailleurs comment veux-tu qu'on te dise ce qui ne va pas lors d'une comparaison sans savoir ce que tu compare ?
nadox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 11h38   #3
Membre du Club
 
Avatar de Paniez
 
Inscription : janvier 2003
Messages : 160
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 160
Points : 54
Points : 54
Re,

Alors, voici mon tableau qui me permet de lister les informations :
Code html :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
<table>
<tr>
<th>Nom des droits</th><th></th>
</tr>
<tr>
<td>Fiche utilisateur</td><td><input type="checkbox" name="checkPermissions[]" value="fiche_user"
 /></td>
</tr>
<tr>
<td>Interface d'administration</td><td><input type="checkbox" name="checkPermissions[]" value="interface_admin"
 /></td>
</tr>
<tr>
 
<td>Param&egrave;tres g&eacute;n&eacute;raux</td><td><input type="checkbox" name="checkPermissions[]" value="param_generaux"
 /></td>
</tr>
<tr>
<td>Gestion des contenus</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_contenu"
 checked="checked" /></td>
</tr>
<tr>
<td>Gestion des articles</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_articles"
 /></td>
</tr>
<tr>
<td>Gestion des diaporamas</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_diapos"
 /></td>
 
</tr>
<tr>
<td>Gestion de vos menus</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_menus"
 checked="checked" /></td>
</tr>
<tr>
<td>Gestion des commentaires</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_livreor"
 /></td>
</tr>
</table>

Toutes les "value" des checkbox correspondent à un autre tableau "brut" en php :

Code :
1
2
3
4
5
6
7
8
9
 
	$tPouvoir['fiche_user']['Groupes']='Administration';
	$tPouvoir['interface_admin']['Groupes']='Administration';
	$tPouvoir['param_generaux']['Groupes']='Administration';
	$tPouvoir['gestion_contenu']['Groupes']='Test/Administration';
	$tPouvoir['gestion_articles']['Groupes']='Administration';
	$tPouvoir['gestion_diapos']['Groupes']='Administration';
	$tPouvoir['gestion_menus']['Groupes']='Test/Administration';
	$tPouvoir['gestion_livreor']['Groupes']='Administration';
Ce tableau brut me sert à générer mon tableau (et donc les value sont "identiques", puisque c'est la même source).
En amont, j'ai un select et sur le onchange, je demande à mon php le tableau des permissions du groupe sélectionner dans ce select(par exemple, si je selectionne le groupe Test, il me renvoie un tableau contenant gestion_contenu et gestion_menus ; ces deux parametres sont dans le tableau tLigne évoqué dans mon premier post).
Paniez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 11h59   #4
Membre expérimenté
 
Avatar de nadox
 
Homme
Développeur
Inscription : février 2010
Messages : 360
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Développeur
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2010
Messages : 360
Points : 545
Points : 545
Merci pour ces détails, je comprends mieux ce que tu veux faire.
Par contre, il serait plus intéressant d'avoir le code source(html et javascript) de la page sur laquelle tu obtiens ce comportement :
Citation:
Envoyé par Paniez Voir le message
Ce code fonctionne bien, sauf pour le premier résultat à true où il me renvoie false.
D'ailleurs, je ne suis pas sur de comprendre ce que veux dire 'le premier résultat à true'...
nadox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 12h22   #5
Membre du Club
 
Avatar de Paniez
 
Inscription : janvier 2003
Messages : 160
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 160
Points : 54
Points : 54
Citation:
Envoyé par nadox Voir le message
Par contre, il serait plus intéressant d'avoir le code source(html et javascript) de la page sur laquelle tu obtiens ce comportement :

D'ailleurs, je ne suis pas sur de comprendre ce que veux dire 'le premier résultat à true'...
Effectivement, ça pourrait etre mieux (pour le javascript, c'est un fichier à part) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<p>
<center>
S&eacute;lectionner un compte&nbsp;:&nbsp;<select id="select_compte" name="select_compte" title="S&eacute;lectionner un compte" tabindex="1" onchange="requeteAjaxCompte('./Ajax/droits_compte.php','ID=:ID&amp;action=liste&amp;lang=fr&amp;dirPoint=../&amp;fic=Parametres/pouvoirs.php','liste');">
<optgroup id="Groupes" label="Mes groupes">
 
<option value="Test">Test</option>
<option value="utilisateur">Utilisateur</option>
<option value="Administration">Administration</option>
</optgroup>
<optgroup id="Users" label="Mes utilisateurs">
<option value="root">root</option>
<option value="toto">Oto</option>
<option value="titi">Iti</option>
</optgroup>
</select>
</center>
 
</p><br/>
<p>
<center>
<table>
<tr>
<th>NOM_DROITS</th><th></th>
</tr>
<tr>
<td>Fiche utilisateur</td><td><input type="checkbox" name="checkPermissions[]" value="fiche_user"
 /></td>
</tr>
<tr>
<td>Interface d'administration</td><td><input type="checkbox" name="checkPermissions[]" value="interface_admin"
 /></td>
</tr>
<tr>
 
<td>Param&egrave;tres g&eacute;n&eacute;raux</td><td><input type="checkbox" name="checkPermissions[]" value="param_generaux"
 /></td>
</tr>
<tr>
<td>Gestion des contenus</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_contenu"
 checked="checked" /></td>
</tr>
<tr>
<td>Gestion des articles</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_articles"
 /></td>
</tr>
<tr>
<td>Gestion des diaporamas</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_diapos"
 /></td>
 
</tr>
<tr>
<td>Gestion de vos menus</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_menus"
 checked="checked" /></td>
</tr>
<tr>
<td>Gestion des commentaires</td><td><input type="checkbox" name="checkPermissions[]" value="gestion_livreor"
 /></td>
</tr>
</table>
</center>
</p><br/>
Côté javascript, nous avons la fonction in_array déjà mise et côté requeteAjaxCompte, nous avons :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
function requeteAjaxCompte(rAPage,ligne,redirection)
{
  var xhr = getXhr();
 
  xhr.onreadystatechange = function()
  {
    if(xhr.readyState == 4)
    {
      if(xhr.status == 200)
      {
	var leselect = xhr.responseText;
 
	if(redirection=='liste')
	{
	  if(leselect.indexOf('/')==-1)
	  {
	    var tLigne = new Array();
	    tLigne[0]=leselect;
	  }
	  else
	    var tLigne = leselect.split('/');
 
	  var eCheck = document.getElementsByName('checkPermissions[]');
 
	  alert(leselect);
	  for(var i = 0; i < eCheck.length; i++)
	    if(tLigne.in_array(eCheck[i].value))
	      eCheck[i].checked=true;
	    else
	      eCheck[i].checked=false;
	}
      }
      else
	alert('status : '+xhr.status+'\n reponse : '+xhr.statusText);
    }
  }
 
  var selection=document.getElementById('select_compte');
  ligne+='&idStyleCompte='+selection.options[selection.selectedIndex].parentNode.id+'&idCompte='+selection.options[selection.selectedIndex].value;
  xhr.open("POST",rAPage,true);
  xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  xhr.send(ligne);
}
Côté php, il me renvoie une string où je concatène les permissions, séparée par un '/' que je split en javascript pour avoir mon fameux tableau tLigne;
Côté contrôle de résultat, le alert(leselect) me renvoie bien ce que je souhaite (ce que renvoie php est correct donc).

Pour reprendre l'exemple précédent, avec le groupe Test où j'ai seulement deux permissions, lors du test 'gestion_contenu' renvoie false (au lieu de true et ne me coche pas ma checkbox), mais gestion_menus fonctionne bien. De même, avec Administration, fiche_user renvoie false au lieu de true, tous les suivants sont corrects.
C'est juste que le premier test me renvoie un truc erroné, mais les autres.
Paniez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 13h00   #6
Membre du Club
 
Avatar de Paniez
 
Inscription : janvier 2003
Messages : 160
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 160
Points : 54
Points : 54
Re,

Alors, petite avancée :
a coup de "alert", lors du premier test (qui est donc erroné), le alert (mis dans la fonction in_array) me renvoi un undefined pour la première checkbox (au lieu de fiche_user par exemple), mais les autres, ça passe nikel .

EDIT :
Un alert mis juste après la récupération de mes champs (donc, dans la fonction requeteAjaxCompte, j'ai bien tous les champs nikel) : dois-je en conclure que lors du premier appel, le paramètre est mis à undefined (truc de fou quand même) ?
Paniez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 14h24   #7
Membre expérimenté
 
Avatar de nadox
 
Homme
Développeur
Inscription : février 2010
Messages : 360
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Développeur
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2010
Messages : 360
Points : 545
Points : 545
Un truc me chiffone dans ta fonction requeteAjaxCompte :
Tu déclare deux fois la variable tLigne dans la même fonction. En Javascript, la portée d'une variable est définie par la fonction et non par les blocs(comme dans la plupart des langages avec une syntaxe c-like).
L'interpréteur Javascript va chercher a initialiser deux fois la variable lors de la compilation de la fonction ( indépendamment des blocs ) et il peut donc y avoir des comportements étonnants sans forcement avoir une erreur a l'exécution.
nadox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 14h56   #8
Membre du Club
 
Avatar de Paniez
 
Inscription : janvier 2003
Messages : 160
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 160
Points : 54
Points : 54
Re,

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
function requeteAjaxCompte(rAPage,ligne,redirection)
{
  var xhr = getXhr();
 
  xhr.onreadystatechange = function()
  {
    if(xhr.readyState == 4)
    {
      if(xhr.status == 200)
      {
	var leselect = xhr.responseText;
 
	if(redirection=='liste')
	{
	  var tLigne = new Array();
 
	  if(leselect.indexOf('/')==-1)
	    tLigne[0]=leselect;
	  else
	    tLigne = leselect.split('/');
 
	  var eCheck = document.getElementsByName('checkPermissions[]');
 
	  alert(leselect);
	  for(var i = 0; i < eCheck.length; i++)
	    if(tLigne.in_array(eCheck[i].value))
	      eCheck[i].checked=true;
	    else
	      eCheck[i].checked=false;
	}
      }
      else
	alert('status : '+xhr.status+'\n reponse : '+xhr.statusText);
    }
  }
 
  var selection=document.getElementById('select_compte');
  ligne+='&idStyleCompte='+selection.options[selection.selectedIndex].parentNode.id+'&idCompte='+selection.options[selection.selectedIndex].value;
  xhr.open("POST",rAPage,true);
  xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  xhr.send(ligne);
}
En changeant la fonction comme ci-dessus, ça ne change rien (toujours un undefined qui me renvoie false).
Paniez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 20h21   #9
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 944
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 944
Points : 4 774
Points : 4 774
Citation:
Envoyé par Paniez Voir le message
Re,
EDIT :
Un alert mis juste après la récupération de mes champs (donc, dans la fonction requeteAjaxCompte, j'ai bien tous les champs nikel) : dois-je en conclure que lors du premier appel, le paramètre est mis à undefined (truc de fou quand même) ?
il existe des caractères non imprimable comme \n, \t par exemple ou encore ce que l'on ne voit pas comme les space, est tu sûr de ne pas en avoir un devant ?

remarque
Code :
1
2
3
4
5
var tLigne = new Array();
if (leselect.indexOf('/') == -1)
  tLigne[0] = leselect;
else
  tLigne = leselect.split('/');
tu peux écrire directement
Code :
1
2
var tLigne = [];
tLigne = leselect.split('/');
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 08h00   #10
Membre du Club
 
Avatar de Paniez
 
Inscription : janvier 2003
Messages : 160
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 160
Points : 54
Points : 54
Re,

Citation:
Envoyé par NoSmoking Voir le message
il existe des caractères non imprimable comme \n, \t par exemple ou encore ce que l'on ne voit pas comme les space, est tu sûr de ne pas en avoir un devant ?
En entrée, j'ai exactement le même fichier pour générer mon formulaire et pour faire le test d'égalité.
Sinon, existe-t-il une méthode pour supprimer ces caractères spéciaux ? Pour information, les chaines de caractères testées sont au "format" variable, c'est à dire que des caractères alphanumériques, sans espace (remplacé par des underscore).
Et le truc qui me turlupine le plus, c'est cette histoire où le premier test est forcément faux (à cause d'un undefined).

Citation:
Envoyé par NoSmoking Voir le message
remarque
Code :
1
2
3
4
5
var tLigne = new Array();
if (leselect.indexOf('/') == -1)
  tLigne[0] = leselect;
else
  tLigne = leselect.split('/');
tu peux écrire directement
Code :
1
2
var tLigne = [];
tLigne = leselect.split('/');
Merci de l'info ; malheureusement, cela ne change rien (sauf enlever un peu de caractères pour le javascript.


EDIT:
Suite à ma réponse, j'ai testé si this[i] est null ; le premier renvoie toujours vrai. Donc, à priori, mon premier test est erroné à cause d'une valeur null. Pourtant, juste après le split, il m'affiche bien la valeur (et pas null).
Paniez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 11h46   #11
Membre du Club
 
Avatar de Paniez
 
Inscription : janvier 2003
Messages : 160
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 160
Points : 54
Points : 54
Re,

J'ai trouvé et NoSmoking était dans le vrai.
Citation:
Envoyé par NoSmoking Voir le message
il existe des caractères non imprimable comme \n, \t par exemple ou encore ce que l'on ne voit pas comme les space, est tu sûr de ne pas en avoir un devant ?
J'ai deux retours à la ligne qui se sont insérés (\n).
Le truc de fou, c'est que c'est la première fois que je vois cela entre mon résultat php (écriture dans fichier et compagnie me confirment bien ce que je veux) et la réception JS var leselect = xhr.responseText; qui insère ces deux caractères de retour de ligne.

Du coup, j'ai juste fait un :

Code :
1
2
3
 
var leselect = xhr.responseText;
leselect=leselect.replace(/\n/g,'');
Bonne journée
Paniez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 13h37   #12
Membre expérimenté
 
Avatar de nadox
 
Homme
Développeur
Inscription : février 2010
Messages : 360
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Développeur
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2010
Messages : 360
Points : 545
Points : 545
Erreur très courante lorsqu'on fait des webservices : un saut de ligne en dehors des balises php... Surtout que beaucoup d'editeur de fichiers ajoute automatiquement un saut de ligne a la fin d'un fichier (compatibilité pour certains langage pour lequel l'interpreteur nécessite un saut de ligne en fin de fichier)
nadox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 14h12   #13
Membre du Club
 
Avatar de Paniez
 
Inscription : janvier 2003
Messages : 160
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 160
Points : 54
Points : 54
Citation:
Envoyé par nadox Voir le message
Erreur très courante lorsqu'on fait des webservices : un saut de ligne en dehors des balises php... Surtout que beaucoup d'editeur de fichiers ajoute automatiquement un saut de ligne a la fin d'un fichier (compatibilité pour certains langage pour lequel l'interpreteur nécessite un saut de ligne en fin de fichier)
Re,

Courante, courante, ...
Je ne fais de l'ajax depuis 15 ans (bon, même si à l'époque ce n'était pas possible ), mais c'est vraiment la première fois qu'une chaîne retournée du PHP se voit ajouter en début deux sauts de lignes.
Pour l'histoire du fichier, je l'ai fait juste pour contrôler que, côté PHP, tout était correcte ; et puis, je suis en éditeur brut (kate pour être précis).
Enfin bon, tout est ok.
Paniez 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 06h14.


 
 
 
 
Partenaires

Hébergement Web