Problem mit Ajax und select

  • Hi,


    ich bin neu hier und mit Javascript, jQuery, etc. nur sehr wenig vertraut.
    Dein Tutorial ist sehr gut!
    Jedoch stehe ich vor dem Problem, dass ich in meinem Formular DropDown-Menüs habe.
    Nun möchte ich neben den Values (1,2,3,...) auch den Text mit an die validate.php übergeben.


    Ich habe schon versucht, "data" wie folgt zu generieren:


    JavaScript
    var catid = $( "#cat" ).val();
    var cat =  $( "#cat option:selected" ).text();
    var subcatid = $( "#subcat" ).val();						
    var subcat =  $( "#subcat option:selected" ).text();
    
    
    
    
    var data = 'cat=' + cat.val() + '&catid=' + catid.val() + '&subcat='  + subcat.val() + '&subcatid=' + subcatid.val();


    Jedoch spuckt mir die validate.php immer den Fehler "Index subcat und cat nicht definiert" aus.


    Woran liegt das?


    Vielen Dank & Grüße
    Schmakus

  • Hallo Schmakus und wilkommen im Forum :) ,


    schau dir mal an was val() dir zurückliefert. http://api.jquery.com/val/


    Zitat

    The .val() method is primarily used to get the values of form elements such as input, select and textarea. In the case of select elements, it returns null when no option is selected and an array containing the value of each selected option when there is at least one and it is possible to select more because the multiple attribute is present.


    Es gibt dir nämlich bereits die ausgewählten Elemente/das ausgewählte Element der Dropdownliste als Array zurück.
    Somit brauchst du zweiteres mit dem Zugriff auf den Text der Select nicht mehr, da du diesen bereits als Rückgabewert
    von val() erhälst :)



    mfg Nita

  • Hi,


    das verstehe ich nicht ganz.
    Mit dem oben beschriebenen Tutorial wird mir doch nur das Value einer Selectbox übergeben?! Also z.B: "1".
    Wie mache ich den Text "sichtbar"?


    Diesen möchte ich gerne in einem Cookie weiterverwenden.


    Gruß
    Schmakus

  • Bau dir doch einmal ein Form NUR mit deinem Dropdownmenü und dann probier doch mal aus, was in deine var catifd und subcatid geschrieben wurde, zB via einem alert

    JavaScript: 9
    /* [..]data = form.serialize();
    alert(data); // Guck mal, was hier mitgegeben wurde
    
    
    
    
    var catid = $("#cat").val();
    alert(catid); // Guck mal, was hier ausgegeben wird


    Eigentlich müsste nämlich beide Male ein NULL ausgegeben werden, falls nichts markiert wurde, oder ein Array mit den verschiedenen Values.


  • Mit dem oben beschriebenen Tutorial wird mir doch nur das Value einer Selectbox übergeben?! Also z.B: "1".
    Wie mache ich den Text "sichtbar"?



    Gruß
    Schmakus



    Hm, ich weiß jetzt gerade nicht was du meinst ?(



    HTML
    <select id="single">
      <option>Single</option>
      <option>Single2</option>
    </select>



    JavaScript
    var singleValues = $( "#single" ).val(); //enthält Single/Single2


    Das Ganze gibt dir doch den Text des Option-Feldes zurück, was genau erwartest du dir denn?




    Poste am Besten mal deinen HTML-Code auf den du das Ganze anwenden möchtest, vlt können wir/ich das Ganze dann besser verstehen:)

  • Bau dir doch einmal ein Form NUR mit deinem Dropdownmenü und dann probier doch mal aus, was in deine var catifd und subcatid geschrieben wurde, zB via einem alert

    JavaScript: 9
    /* [..]data = form.serialize();
    alert(data); // Guck mal, was hier mitgegeben wurde
    
    
    
    
    var catid = $("#cat").val();
    alert(catid); // Guck mal, was hier ausgegeben wird


    Eigentlich müsste nämlich beide Male ein NULL ausgegeben werden, falls nichts markiert wurde, oder ein Array mit den verschiedenen Values.

    OK, beide male wird jeweils nur das "Value" ausgegeben. D.h. z.B.: "1" und "5".
    Anmerkung: Die Daten werden aus MySQL bezogen. Der HTML Code sieht so aus: <select id="cat" value="1" selected>Text1</select> (Hätt ich vlt. schon früher erwähnen sollen)


    Hab's jetzt mal folgendermaßen gemacht. (Über eine Vereinfachung würde ich mich freuen!):


    JavaScript
    var CatSelect = document.getElementById("cat");
    	var CatText = CatSelect.options[CatSelect.selectedIndex].text;
    	var SubCatSelect = document.getElementById("subcat");
    	var SubCatText = SubCatSelect.options[SubCatSelect.selectedIndex].text;
    
    	var	data = form.serialize() + '&CatText=' + CatText + '&SubCatText=' + SubCatText;
  • Also, du hast select wie folgt:

    HTML
    <select name="foo" id="cat">
      <option value="1">Irgendein Text</option>
      <option value="2">Anderer Text</option>
    </select>


    Wenn du aber den Text und nicht die eigentlich value haben willst, wieso setzt du dann nicht den Text selbst als value ein?

    HTML
    <select name="foo" id="cat">
      <option value="Irgendein Text">Irgendein Text</option>
      <option value="Anderer Text">Anderer Text</option>
    </select>
  • Weil ich immer mit der ID arbeite. D.h. meine SQL Datenbank arbeitet eigentlich nur mit ID's.
    Ich übergebe mit dem DropDown der SQL eine ID. In einer Tabelle werden dann nur ID's gespeichert, welche wiederum mit anderen Tabellen verknüpft ist.
    Irgendwo am Ende steht dann mal ein Text.


    Den Text benötige ich für die Darstellung auf der Seite oder z.B. zum Speichern in einem Cookie.


    Wenn ich hier auch mit der ID arbeiten würde, müsste ich immer eine SQL-Abfrage starten, um an den Text zu kommen.


    Da ich ja aber schon eine Abfrage für das DropDown habe, wäre eine weitere ja überflüssig?!

  • Warum denn eine Vereinfachung? Findest du das kompliziert? Man kann nun mal nicht immer alles mit einer Zeile Code lösen.


    Wenn's schön aussehen soll kannst du ja ein Herz draus machen:



    Aber mal Spaß beiseite. Wenn du das Ganze etwas übersichtlicher gestalten möchtest würde ich eine Funktion empfehlen:


    JavaScript
    function readOption(element) {
            return {
                text: element.options[element.selectedIndex].text,
                value: element.options[element.selectedIndex].value
            };
        }


    Jetzt kannst du beliebig viele Select Elemente immer wieder durch readOption() auslesen, so zum Beispiel:


    HTML
    <form name="formular">
            <select name="foo" id="cat">
                <option value="1">Irgendein Text</option>
                <option value="2">Anderer Text</option>
            </select>
            <input type="submit" name="submit">
        </form>
    JavaScript
    var CatSelect = document.forms.formular.foo;
        var Cat = readOption(CatSelect);
    
    
    
    
        var data = "&CatText=" + Cat.text +"&CatValue=" + Cat.value;
    JavaScript
    // Oder in nicht ganz so schön aber auch funktionsfähig:
        var Cat = document.forms.formular.foo;
        var data = "&CatText=" + readOption(Cat).text + "&CatValue=" + readOption(Cat).value;


    Es ist nicht nötig seine Scripts kurz zu halten, man muss auch schon mal weiter ausholen (gerade bei JavaScript mit Browserweichen, z.B. ermitteln von Mausbewegung unter Berücksichtigung von Touch-Geräten). Wenn du dem Benutzer am Ende wirklich den Bruchteil einer tausendstel Sekunde sparen willst kannst du vor dem online stellen immer noch Leerzeichen entfernen und deine Funktionen einfach mit Buchstaben benennen:


    JavaScript
    var a = document.forms.formular.a;
        var b = "&CatText=" + c(a).d + "&CatValue=" + c(a).e;

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!