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 :

Select Chainée Erreur IE ! XMLHTTPREQUEST


Sujet :

JavaScript

Vue hybride

spax Select Chainée Erreur IE !... 26/11/2008, 11h40
SpaceFrog eval(xhr.responseText); ... 26/11/2008, 11h46
spax Ok , je ne sais pas... 26/11/2008, 14h06
Bovino C'est normal : ... 26/11/2008, 14h27
SpaceFrog Un petit tour par là ne te... 26/11/2008, 14h36
spax Merci c'était la bonne... 26/11/2008, 14h45
DoubleU C'est quoi le problème avec... 26/11/2008, 14h38
SpaceFrog eval is evil quand c'est... 26/11/2008, 14h45
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut Select Chainée Erreur IE ! XMLHTTPREQUEST
    Bonjour
    mon problème est pour pas changer lié aux différences entre IE et FF :
    Situation :
    j'ai 3 select que je veut chainer :
    1-Select Site :
    2- Select Serveur (disponible au site )
    3- Select feature (fonction disponible sur le serveur )

    Avec FF tout marche bien ,
    Avec IE la première dépendance se fait :

    Donc en sélectionnant le Site la liste des serveurs est mise a jour .
    Mais en continuant et sélectionnant Un serveur rien ne se passe sur la 3Eme select ( donc features ).

    je précise que j'utilise strictement le même procéder en ce qui concerne le JS et le PHP pour gérer la dépendance entre les 3 select.

    Néanmoins ce que j'ai remarquer c'est que quand la 2Eme select est mise a jour si je lance un Onchange="getValue()" une simple fonction pour avoir la valeur du selectedIndex ça me donne RIEN sous IE pourtant le SelectedIndex est bien une valeur >0 !!


    Voici le code :

    le javascript :

    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
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    /*************************************************************************************************
    * Function  : setXhr()
    *  Init an XMLHTTPREQUEST
    *
    **************************************************************************************************/
    function setXhr()
    {
    	var xhr;
    	if(window.XMLHttpRequest) // FIREFOX
    		xhr = new XMLHttpRequest();
    	else 
    		if(window.ActiveXObject) // IE
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		else 
    		{ // XMLHttpRequest non supporté par le navigateur  
    		} 
    	return xhr;
    }
     
    /*************************************************************************************************
    * Function  : getServer()
    * Dynamically got server's list for a given site
    *
    **************************************************************************************************/
     
    function getServer()
    {
    	var f = document.forms["showData"] ;
    	var s1 = f.elements["lssite"];
    	var s2 = f.elements["lsserver"];
    	var index = s1.selectedIndex;
    if(index<0)
    	f.elements["lsserver"].options.length = 0; 
    	else
    	{
    	var xhr = setXhr();
    	xhr.open("POST", "include/filteredserver.php", true); 
    	xhr.onreadystatechange = function() { 
    	      if(xhr.readyState == 4) 
    	         eval(xhr.responseText); 
    	   } 
     
    	   xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    	   var data = "site="+escape(s1.options[index].value)+"&form="+f.name+"&select=lsserver";
    	   xhr.send(data); 
    	}
     
    }
     
    /*************************************************************************************************
    * Function  : getSFeature()
    * Dynamically got features 's list for a given server
    *
    **************************************************************************************************/
     
     
    function getSFeature()
    {
    	var f = document.forms["showData"] ;
    	var s1 = f.elements["lsserver"];
    	var s2 = f.elements["lsfeature"];
    	var index = s1.selectedIndex;
    	if(index<0)
    	f.elements["lsfeature"].options.length = 0; 
    	else
    	{
    	var xhr = setXhr();
    	xhr.open("POST", "include/filteredserver.php", true); 
    	xhr.onreadystatechange = function() { 
    										if(xhr.readyState == 4) 
    								         eval(xhr.responseText); 
    										}
    		xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    		var data = "server="+escape(s1.options[index].value)+"&form="+f.name+"&select=lsfeature";
    		xhr.send(data);
    	}
    }
    Le php pour générer les nouvelles valeurs du select
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    <?php
    header('Content-type: text/html; charset=iso-8859-1'); 
    include("dbmanager.php");
    dbconnect();
    if(isset($_POST[site]))
    {
    $site = $_POST[site];
    $requete = ($site == "All")? "SELECT DISTINCT name FROM server" : "SELECT name FROM server WHERE site='$site'";
    $result = request($requete);
            echo 'var o = null;'; 
            echo 'var s = document.forms["'.$_POST["form"].'"].elements["'.$_POST["select"].'"];'; 
            echo 's.options.length = 0;'; 
            echo 's.options[s.options.length] = new Option("All");'; 
            while($r = mysql_fetch_array($result)) 
                echo 's.options[s.options.length] = new Option("'.$r[0].'");'; 
     
    }
    if(isset($_POST[server]))
    {
            $server = $_POST[server];
            $requete = ($site == "All")? "SELECT DISTINCT name FROM features where server!='local'" : "SELECT name FROM features WHERE server='$server'";
            $result = request($requete);
            echo 'var o = null;'; 
            echo 'var s = document.forms["'.$_POST["form"].'"].elements["'.$_POST["select"].'"];'; 
            echo 's.options.length = 0;'; 
            echo 's.options[s.options.length] = new Option("All");'; 
            while($r = mysql_fetch_array($result)) 
            echo 's.options[s.options.length] = new Option("'.$r[0].'");'; 
    }
            dbclose();
    ?>

    Et finalement le HTML du depart :


    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
    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
    62
    63
    64
    65
    66
    67
    68
    69
     
    <form name='showData' method="POST" action="index.php?page=data">
    	<p>
    	<table class = "specTable">
    	<tbody class = "specBody">
    	<tr>
    	<td>
    	<label>Site</label>
    	</td>
    	<td>
    	<select name="site" id="lssite" onChange="getServer()">
    	<option value="All">All</option>
    	<?php
                            
            $rep = request("SELECT DISTINCT site FROM server");
            while($data = mysql_fetch_array($rep))
            {
                    if(isset($chsite) && $data[0] == $chsite)
                    echo "<option value='".$data[0]."' selected='selected'>".$data[0]."</option>";
                    else
                    echo "<option value='".$data[0]."'>".$data[0]."</option>";
            }
            ?>
    	</select>
    	</td>
    	<td>
    	<label>Server</label>
    	</td>
    	<td>
    	<select name="server" id="lsserver" onChange="getSFeature()">
    	<option value="All">All</option>
    	<?php
            $query = $chsite != "All" ? "SELECT DISTINCT name FROM server WHERE site='$chsite' ORDER BY 'name' ASC" : "SELECT DISTINCT name FROM server";
            $rep = request($query);
            while($data = mysql_fetch_array($rep))
            {
                    if(isset($chserver) && $data[0] == $chserver)
                    echo "<option value='".$data[0]."' selected='selected'>".$data[0]."</option>";
                    else
                    echo "<option value='".$data[0]."'>".$data[0]."</option>";
            }
            ?>
    	</select>
    	</td>
    	<td>
    	<label>Feature</label>
    	</td>
    	<td>
    	<select name="feature" id ="lsfeature">
    	<option value="All">All</option>
    	<?php
            $query = $chserver != "All" ? "SELECT DISTINCT name FROM features WHERE server='$chserver' ORDER BY 'name' ASC" : "SELECT DISTINCT name FROM features WHERE server!='local'";
            $rep = request($query);
            while($data = mysql_fetch_array($rep))
            {
                    if(isset($chfeature) && $data[0] == $chfeature)
                    echo "<option value='".$data[0]."' selected='selected'>".$data[0]."</option>";
                    else
                    echo "<option value='".$data[0]."'>".$data[0]."</option>";
            }
            ?>
    	</select>
    	</td>
    	<td>
    	<input type="button" value="Go !" onclick ="validate()" />
    	</td>
    	</table>
    	</p>
    	</form>

    Merci pour l'aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     eval(xhr.responseText);
    au secours !!!

    c'est la pire des choses à faire ...
    ajax ne doit retourner que des paramètres ou eventuellement du code html, mais en aucun cas du js à interpréter !

    as tu regardé les tutos proposés sur ce forum pour les listes liées avec ajax ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut
    Ok ,
    je ne sais pas pourquoi cela est dangereux .
    en tous cas j'ai effectuer des modification pour retourné une chaine
    Name1|Name2|....|NameLast
    puis faire un split ( plus de JS a exécuter ).

    MAIS j'ai toujours le même problème sur FF ca marche mais pas sur IE en effet on dirai que IE ne prend pas en compte le changement dans le SELECT au milieu ? donc même si il est afficher plein et que IE peut renvoyé SelectedIndex elle renvoie null en parallèle comme valeur .
    voila le nouveau code :

    PHP : génération des nouvelles fonctions
    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
    18
    19
    20
    21
    22
    23
     
    <?php
    include("dbmanager.php");
    dbconnect();
    if(isset($_GET[site]))
    {
    $site = $_GET[site];
    $requete = ($site == "All")? "SELECT DISTINCT name FROM server" : "SELECT name FROM server WHERE site='$site'";
    $rep = request($requete);
    while($data = mysql_fetch_array($rep))
            echo "$data[0]|";
     
    }
    if(isset($_GET[server]))
            {
            $server = $_GET[server];
            $requete = ($site == "All")? "SELECT DISTINCT name FROM features where server!='local'" : "SELECT name FROM features WHERE server='$server'";
            $rep = request($requete);
            while($data = mysql_fetch_array($rep))
                    echo "$data[0]|";
            dbclose();
            }
    ?>
    Puis les fonctions Java script :
    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
    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
    62
    63
    64
    65
     
     
    /*************************************************************************************************
    * Function  : setXhr()
    *  Init an XMLHTTPREQUEST
    *
    **************************************************************************************************/
    function setXhr()
    {
    	var xhr;
    	if(window.XMLHttpRequest) // FIREFOX
    		xhr = new XMLHttpRequest();
    	else 
    		if(window.ActiveXObject) // IE
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		else 
    		{ // XMLHttpRequest non supporté par le navigateur  
    		} 
    	return xhr;
    }
     
    /*************************************************************************************************
    * Function  : getServer()
    * Dynamically got server's list for a given site
    *
    **************************************************************************************************/
     
    function getServer()
    {
    	var site = document.getElementById("lssite").options[document.getElementById("lssite").selectedIndex].value;					
    	var xhr = setXhr();
    	xhr.open("GET", 'include/filteredserver.php?site='+site,false);
    	xhr.send(null);
    	var tab = xhr.responseText.split("|");
    	var liste = document.getElementById("lsserver");
    	liste.options.length = 0;
    	liste.options[0] = new Option("All");
    	for(var i=0;i<tab.length-1;i++)
    		{
    		liste.options[i+1] = new Option(tab[i]);
    		}
    }
     
    /*************************************************************************************************
    * Function  : getFeatures()
    * Dynamically got features 's list for a given server
    *
    **************************************************************************************************/
     
    function getSFeature()
    {
    	var server = document.getElementById("lsserver").options[document.getElementById("lsserver").selectedIndex].value;					
    	var xhr = setXhr();
    	xhr.open("GET", 'include/filteredserver.php?server='+server,false);
    	alert('include/filteredserver.php?server='+server);
    	xhr.send(null);
    	var tab = xhr.responseText.split("|");
    	var liste = document.getElementById("lsfeature");
    	liste.options.length = 0;
    	liste.options[0] = new Option("All");
    	for(var i=0;i<tab.length-1;i++)
    		{
    		liste.options[i+1] = new Option(tab[i]);
    		}
    }
    Alors ?

  4. #4
    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
    Billets dans le blog
    20
    Par défaut
    elle renvoie null en parallèle comme valeur
    C'est normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste.options[i+1] = new Option(tab[i]);
    new Option prend en paramètres le texte de l'option puis son value, donc si tu ne précises qu'un seul argument, il n'y a pas de value.

    Ensuite, fais attention, il faut effectuer ta mise à jour au readyState 4, sinon tu auras des soucis sans ton alert car les données ne seront pas disponibles au moment où tu veux les traiter !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Un petit tour par là ne te fera pas de mal
    http://siddh.developpez.com/articles/ajax/
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut
    Merci c'était la bonne solution.

    voici le code JS ça peut intéresser quelqu'un .
    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
    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
     
     
    /*************************************************************************************************
    * Function  : getServer()
    * Dynamically got server's list for a given site
    *
    **************************************************************************************************/
     
    function getServer()
    {
    	var site = document.getElementById("lssite").options[document.getElementById("lssite").selectedIndex].value;					
    	var xhr = setXhr();
    	xhr.open("GET", 'include/filteredserver.php?site='+site,true);
    	xhr.onreadystatechange = function()
    									{
    										if (xhr.readyState == 4) 
    											if (xhr.status ==200) 
    											{
    												var tab = xhr.responseText.split("|");
    												var liste = document.getElementById("lsserver");
    												liste.options.length = 0;
    												liste.options[0] = new Option("All");
    												for(var i=0;i<tab.length-1;i++)
    													{
    														liste.options[i+1] = new Option(tab[i] , tab[i]);
    													}
    											}
    									}
    	xhr.send(null);
     
    }
     
    /*************************************************************************************************
    * Function  : getFeatures()
    * Dynamically got features 's list for a given server
    *
    **************************************************************************************************/
     
    function getSFeature()
    {
    	var server = document.getElementById("lsserver").options[document.getElementById("lsserver").selectedIndex].value;					
    	var xhr = setXhr();
    	xhr.open("GET", 'include/filteredserver.php?server='+server,true);
    	xhr.onreadystatechange = function()
    									{
    										if (xhr.readyState == 4) 
    											if (xhr.status ==200) 
    											{
    												var tab = xhr.responseText.split("|");
    												var liste = document.getElementById("lsfeature");
    												liste.options.length = 0;
    												liste.options[0] = new Option("All");
    												for(var i=0;i<tab.length-1;i++)
    													{
    														liste.options[i+1] = new Option(tab[i] , tab[i]);
    													}
    											}
    									}
    	xhr.send(null);
    }

  7. #7
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     eval(xhr.responseText);
    au secours !!!

    c'est la pire des choses à faire ...
    ajax ne doit retourner que des paramètres ou eventuellement du code html, mais en aucun cas du js à interpréter !

    as tu regardé les tutos proposés sur ce forum pour les listes liées avec ajax ...
    C'est quoi le problème avec eval(xhr.responseText) ?

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    eval is evil quand c'est utilisé n'importe comment !
    je deconseille fortement de mettre du string de code et d'en faire un eval ...
    mieux vaut 100 fois avoir le code sur la page et ne lui passer que les paramètres dont il a besoin (serialisation ou split ...)
    Avoir besoin de faire un eval d'une fonction en retour de code ajax est selon moi une erreur de codage.
    autant avoir differents scripts externes et les activer selon les besoins ..
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SELECTs chainés dans un formulaire
    Par duboisa dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/02/2010, 20h36
  2. pour toute chaine - erreur de doublon
    Par chapeau_melon dans le forum WinDev
    Réponses: 6
    Dernier message: 04/03/2008, 10h37
  3. Fin de liste chainée, erreur
    Par faulk dans le forum C
    Réponses: 3
    Dernier message: 21/10/2006, 20h02
  4. Réponses: 13
    Dernier message: 19/07/2006, 14h28
  5. Selection Chaine Caractere
    Par joxbl dans le forum Débuter
    Réponses: 4
    Dernier message: 18/06/2006, 19h27

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