Ajax und <select><option>

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ajax und <select><option>

    Hi....
    Kann mir mal jemand sagen, was hier schief geht. Der verfluchte IE treibt mich gleich in den Wahnsinn. Mach da schon seit 4 Stunden rum.

    Ich lasse eine <select>-Liste per Ajax mit <option> füllen. Je nachdem, was in der Liste zuvor ausgewählt wurde, werden andere Einträge in den <select>-Knoten eingebaut. Ist ja schade, dass der IE so verflucht blöd ist. Der Firefox blickts zumindest wenn man das Select-Element mit meinselect.innerHTML = "<option>123</option><option>456</option"; füllt.
    Aber für IE muss ich das übers DOM machen. Toll.
    Und nun möchte ich, wenn in der Liste zuvor eine andere Option ausgewählt wird erst alle Einträge in der ajax-Select-Liste gelöscht und wieder neu gefüllt werden.
    Ich verwende dazu eine for-Schleife... Er lässt mir aber manchmal 2 oder einen Eintrag drin stehen, also löscht nicht alle <option> aus der Liste raus. Und ich frage mich warum?? Ich hab alles schon degebuggt... wenn ich mir
    document.meinform.meinselect.meinoption.length ausgeben lasse, ist das nach dem Löschvorgang immer noch 2!!!!

    Hier der Code: this.req.responseText liefert einen Datenstring zurück mit Benutzern und seinen daten, z.B.
    "1|name1|admin#1|name2|user#3|name3|user#"
    Die benutzer werden mit "#" getrennt und deren Daten mit "|"

    Quellcode

    1. function handleGetSupervisors() {
    2. result = this.req.responseText;
    3. alert(result);
    4. list = new Array();
    5. var tmp = result.split('#');
    6. for(i=0; i<(tmp.length-1); i++) {
    7. var tmp2 = tmp[i].split('|');
    8. list[i] = new Array();
    9. list[i][0] = tmp2[0]; // ID
    10. list[i][1] = tmp2[1]; // Benutzername
    11. list[i][2] = tmp2[2]; // Rolle
    12. }
    13. alert("BEGIN---------> Length:"+document.benutzer_anlegen.leiter.options.length);
    14. // Löschen, aber das funktioniert nicht
    15. var length = document.benutzer_anlegen.leiter.options.length;
    16. for(i=0; i<length; i++) {
    17. document.benutzer_anlegen.leiter.options[i] = null;
    18. alert("deleted "+i);
    19. }
    20. alert("MIDDLE---------> Length:"+document.benutzer_anlegen.leiter.options.length);
    21. // Select-Form mit options füllen
    22. for(i=0; i<list.length; i++) {
    23. alert("create "+i);
    24. newOption = new Option(list[i][1]+" ("+list[i][2]+")", list[i][0], false, false);
    25. document.benutzer_anlegen.leiter.options[i] = newOption;
    26. }
    27. alert("ENDE---------> Length:"+document.benutzer_anlegen.leiter.options.length);
    28. //}
    29. }
    Alles anzeigen
  • hi,
    also indem du dem objekt "null" zuweist, wirst du das objekt sicherlich nicht löschen.
    Für dein anderes Problem musst du dich sowieso in abstrakte datentypen einarbeiten.

    hier brauchst du einen stack.
    beschrieben wird dieser hier
    http://de.selfhtml.org/javascript/objekte/array.htm#pop

    Quellcode

    1. <html><head><title>Test</title>
    2. <script type="text/javascript">
    3. var Zahlen = new Array(1, 2, 3, 4, 5);
    4. alert(Zahlen.length + " Zahlen im Array");
    5. function Entfernen () {
    6. Zahlen.pop();
    7. alert(Zahlen.length + " Zahlen im Array");
    8. }
    9. </script>
    10. </head><body>
    11. <a href="javascript:Entfernen()">Zahl entfernen</a>
    12. </body></html>
    Alles anzeigen
  • oh, sorry, ich hab ganz übersehen, dass du dem formular element direkt "null" zuweist
    ich dachte es ginge um ein normales array

    so geht das natürlich doch:
    http://de.selfhtml.org/javascript/objekte/options.htm#elemente_loeschen

    hier eine optimierte version:

    Quellcode

    1. <html><head><title>Test</title>
    2. <script type="text/javascript">
    3. function Loeschen () {
    4. var idx = document.Testform.Auswahl.options.selectedIndex;
    5. document.Testform.Auswahl.options[idx] = null;
    6. alert('noch '+document.Testform.Auswahl.options.length+' elemente im array');
    7. }
    8. </script>
    9. </head><body>
    10. <form name="Testform" action="">
    11. <select name="Auswahl" size="8">
    12. <option>Auswahl 1</option>
    13. <option>Auswahl 2</option>
    14. <option>Auswahl 3</option>
    15. <option>Auswahl 4</option>
    16. <option>Auswahl 5</option>
    17. </select>
    18. <br>
    19. <input type="button" value="L&ouml;schen" onclick="Loeschen()">
    20. </form>
    21. </body></html>
    Alles anzeigen


    klärt allerdings nicht, warum das bei dir nicht geht.
    teste mal diesen code mit IE und firefox
  • Ja, so hatte ich es ja angedacht. Wenn 5 Einträge in mein select geladen werden und ich ein anderes Feld mit 1 Eintrag auswähle, dann lässt er den ersten und dritten noch drin (löscht das nicht, obwohl ich doch in der for-schleife komplett alle Einträge durchgehe!!!) und überschreibt dann den ersten <option> Eintrag. Der dritte steht aber weiterhin drin!!! Ich finde dazu einfach KEINE Erklärung... und KEINEN Sinn!!! Das ist das Schlimmste.... wenn es zumindest einen logischen Hintergrund hätte. Ich geh wirklich in der for-schleife alle option durch und setze sie auf "null".

    Ach ja, der IE gibt mir eine Fehlermeldung aus: Die für den Vorgang erfolderlichen Daten sind noch nicht verfügbar.
  • Echt komisch!! Meinst Du so lässt sich das lösen? Ist echt tricky... bin schon am überlegen, ob ich das einfach auf ne andere Weise löse.

    Something nebenbei....
    Kennst Du die Javascript-Methode, um strings auf Expressions zu überprüfen?
    Z.B. ob ^[_/.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$ im String vorkommt?
    Finde im Netz nicht di passende Methode.
  • Also nur wenn ich das so mache:

    Quellcode

    1. var length = document.benutzer_anlegen.projektleiter.options.length;
    2. while(++i < length+2) {
    3. document.benutzer_anlegen.projektleiter.options[0] = null;
    4. }


    Warum ich die +2 an die Länge dranhängen muss, ist mir immer noch unklar... ist mir jetzt eigentlich auch schnuppe. :)

    Was das match() angeht mit meinem Expression-String... was bekomm ich denn da zurückgeliefert? True oder false wahrscheinlich nicht. In einem Textfeld soll eine Email-Adresse validiert werden.
  • @length+2: Ach so... Is klar.

    @match: Nee, match() gibt mir null, bzw. einen komischen String zureuck.

    Quellcode

    1. erg = email.match("^[_/.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$");
    2. if(erg==null)
    3. alert("Email nicht gueltig");


    Funktioniert soweit auch, wenn ich Email-Adressen blabla, blabla@ und blabla@bla eingebe (-> Aufruf: Email nicht korrekt)
    Sobald ich aber eine Email-Adresse bla_bla@blaaa eingebe, gibt er mich NICHT MEHR die gewuenschte Fehlermeldung aus, sondern sieht sie als gueltig an. (???)
    Ich will das ueberprueft wird, ob er auch den . nach den @-Zeichen eingibt.

    Und noch eine Sache, die mir beim IE stinkt. Ok..das mit der <select>-Listen Auswahlt funktioniert jetzt, aber falls neue Eintraege in die Datenbank eingefuegt werden, zeigt er mir der IE die nicht gleich an. Ich muss erst den Cache loeschen, damit der neue Eintrag in meiner Liste erscheint.
    Ist es sinnvoll, das META-Tag no-cache zu setzen, oder wird meine Anwendung dann lahm????
  • Aber selbst, wenn ich im Mainframe <meta http-equiv="cache-control" http-equiv="no-cache" /> einfüge, zeigt mir der IE, nicht die aktuelle Liste an, wenn ich zuvor eine Änderung durchgeführt habe. Sondern immer noch die im Zustand davor.
    Beim FF funktionierts jedenfalls... auch ohne no-cache zu setzen.

    Habe den Beitrag easy-coding.de/ajax-und-ie-cache--t1776.html verfolgt, wo das selbe Problem auftrat. Ich habe header("Cache-Control: no-cache, must-revalidate") in meine PHP-datei, als auch in meine PHP-Func geschreiben. Der IE cacht mir das aber noch immer.

    Könnte sich die komplette Internetgemeinschaft nicht dafür ausprechen KOMPLETT AUF IE ZU VERZICHTEN??? Also ich würde nichts vermissen! Haha...kleiner gag nebenbei :lol:
  • probiers mal mit ner anderen regex funktion

    Quellcode

    1. var test = 'testString';
    2. if (!test.match(/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$/i))
    3. alert('gültig');
    4. else
    5. alert('ungültig');


    btw. so ein ajax check mit ajax wäre doch auch ganz nett.. dann könntest du auch die verfügbarkeit der domain überprüfen

    die header funktionen müssen in die von ajax aufgerufene php datei. hast du gemacht, oder?
    das sollte schon reichen - ansonsten bleibt ja noch der raute-workaround, wie hier beschrieben: http://www.easy-coding.de/ajax-und-ie-cache--t1776.html#6660