[Javascript]Objet attendu

Résolu
Bonjour,

un petit problème qui devrait être simple à résoudre:

objectif:
recharger un tableau en gardant les éléments d'une catégorie choisie dans une liste déroulante

la fonction js:

<!--
function tri(categorie) {
if (categorie.liste_cat.selectedIndex != 0)
var cat=categorie.liste_cat.options[categorie.liste_cat.selectedIndex].value;
document.location.href = ("http://mon_url/affich_liste.php?obj_cat="+cat;
}
--></script>

le formulaire:

<FORM ACTION="" METHOD=POST name="choix_categorie">
<SELECT name="liste_cat" onChange="tri(this.form)">
<OPTION SELECTED>Toutes</OPTION>
<?
WHILE($res_cat!=$j){
$cat= mysql_result($req_cat,$j,"obj_cat");
?>
<OPTION VALUE="<? echo $cat ?>"><? echo $cat ?></OPTION>
<?
$j++;
}
?>
</SELECT>
</FORM>

J'extrais d'une table de ma base les éléments à lister dans le tableau, ils font partie de plusieurs catégories, je souhaite permettre à l'utilisateur de choisir de voir une catégorie, au moyen d'une liste déroulante.

Lorsqu'il change la catégorie, je recharge la page, en donnant une valeur à la variable obj_cat qui me sert de clé de tri lorsqu'elle est définie.

Actuellement, à chaque fois j'ai une erreur js: Objet attendu, qui pointe sur la ligne: <SELECT name="liste_cat" onChange="tri(this.form)"> (caractère 1)

Et je ne parviens pas à faire fonctionner l'ensemble.

Si quelqu'un peut me donner un coup de pouce.

Merci
Configuration: Windows XP
Internet Explorer 6.0

5 réponses

  1. Bonjour,

    Lorsque tu écris ça : "<SELECT name="liste_cat" onChange="tri(this.form)">", le "this" point sur l'élément SELECT. this.form n'existe donc pas...

    Je te conseille de modifier tout ça en mettant :

    <script language="javascript"><!--
    function tri(categorie) {
    if (categorie != "#all")
    {
      document.location.href = "http://mon_url/affich_liste.php?obj_cat="+categorie;
    }
    --></script>
    <FORM ACTION="" METHOD=POST name="choix_categorie">
      <SELECT name="liste_cat" onChange="tri(this.options[this.selectedIndex].value)">
        <OPTION SELECTED value="#all">Toutes</OPTION>
    <?
    WHILE($res_cat!=$j){
    $cat= mysql_result($req_cat,$j,"obj_cat");
    ?>
        <OPTION VALUE="<? echo $cat ?>"><? echo $cat ?></OPTION>
    <?
    $j++;
    }
    ?>
      </SELECT>
    </FORM> 
    1. Merci beaucoup, ça fonctionne :)

      Il ne me reste plus qu'à gérer un détail... mes catégories sont des chaines comportant des espaces... la redirection en Php les digère mal mais ça devrait être vite réglé :)

      Encore merci pour cette réponse aussi rapide qu'efficace.
      1. Ah par contre je vois que je ne peux pas réafficher l'ensemble des catégories.

        J'ai donc ajouté la ligne suivante:

        if (categorie == "#all"){
        document.location.href = "http://monurl/affich_liste.php";
        }

        Cependant quand je cliques sur "Toutes" la page ne se recharge pas.

        J'ai essayé en modifiant aussi le champ option du formulaire:
        <OPTION value="#all">Toutes</OPTION> (enlevé le "selected")

        Mais pas moyen de ré-afficher la page avec toutes les catégories.

        Un 2eme coup de pouce?

        Merci.
        1. Si on reprend ton code php, le mieux serait en fait de sélectionner l'élément qui a été choisi par l'utilisateur. C'est mieux pour l'utilisateur, et ça permettra d'activer le "onchange" si on veut revenir à "TOUT".
          FORM ACTION="" METHOD=POST name="choix_categorie">
            <SELECT name="liste_cat" onChange="tri(this.options[this.selectedIndex].value)">
          <?
          if (isset($_GET["obj_cat"]))
          {
            $obj_cat = $_GET["obj_cat"];
            $selected = "";
          }
          else
          {
            $obj_cat = "";
            $selected = "selected";
          }
          
          echo "<OPTION value=\"#all\" $selected >Toutes</OPTION>";
          
          WHILE($res_cat!=$j){
          $cat= mysql_result($req_cat,$j,"obj_cat");
          if ($cat == $obj_cat)
          {
            $selected = "selected";
          }
          else
          {
            $selected = "";
          }
          
          echo "<OPTION VALUE=\"".$cat."\" $selected >".$cat."</OPTION>";
          
          $j++;
          }
          ?>
            </SELECT>
          </FORM>
          Voilà, le principe est donc de sélectionner uniquement l'élément qui a été sélectionné par l'utilisateur (si existant), et l'élément par défaut sinon.
          1. ok, je comprend, merci pour le tuyau n°2

            j'ai du faire quelques modifs puisqu'ensuite je testais si $obj_cat était set ou non, et vu qu'il est setté à "", je ne passais plus que dans le cas isset($obj_cat)=true, où j'utilisais $obj_cat pour construire une requète.

            Maintenant je teste la longueur du contenu de la variable, si elle est nulle, je construis ma requète sans $obj_cat :)

            et ça marche au poil, merci Reivax :D