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

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Points : 140
    Points
    140
    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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    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 ...

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Points : 140
    Points
    140
    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
    Points : 91 220
    Points
    91 220
    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 !

  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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    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/

  6. #6
    Membre expérimenté 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
    Points : 1 388
    Points
    1 388
    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) ?

  7. #7
    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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    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 ..

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Points : 140
    Points
    140
    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);
    }

+ 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, 21h36
  2. pour toute chaine - erreur de doublon
    Par chapeau_melon dans le forum WinDev
    Réponses: 6
    Dernier message: 04/03/2008, 11h37
  3. Fin de liste chainée, erreur
    Par faulk dans le forum C
    Réponses: 3
    Dernier message: 21/10/2006, 21h02
  4. Réponses: 13
    Dernier message: 19/07/2006, 15h28
  5. Selection Chaine Caractere
    Par joxbl dans le forum Débuter
    Réponses: 4
    Dernier message: 18/06/2006, 20h27

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