hawkmaster: selected=selected per JS übergeben?

Hallo zusammen,

Die Funktion showserviceproperties(x) zeigt bei einem Klick auf die Auswahlliste "sel_services" im benachbarten Select "sel_serviceproperties"
die Optionen an.
Also wenn etwa in "sel_services" auf "Location" geklickt wird, wird in der Liste daneben "Left","Right","Bottom","Top" angezeigt.
In "sel_serviceproperties" kann man mehrere Werte markieren. Diese werden dann bei einem Submit in einer Datenbank gespeichert.
Jetzt hätte ich gerne das nach dem Submit bei einem neuen Klick auf die Auswahlliste, die gespeicherten Werte markiert werden damit es für den Anwender klar ist, welche Werte schon ausgewählt wurden.

folgender JS Code:

  
var groups=document.forms[0].sel_services.options.length  
var group=new Array(groups)  
for (i=0; i<groups; i++)  
group[i]=new Array()  
group[0][0]=new Option("2","Automatic")  
group[0][1]=new Option("3","Test1")  
group[0][2]=new Option("4","Test2")  
group[1][0]=new Option("7","Left")  
group[1][1]=new Option("8","Right")  
group[1][2]=new Option("10","Bottom")  
group[1][3]=new Option("11","Top")  
var temp=document.forms[0].sel_serviceproperties  
function showserviceproperties(x){  
for (m=temp.options.length-1;m>0;m--)  
temp.options[m]=null  
for (i=0;i<group[x].length;i++){  
temp.options[i]=new Option(group[x][i].value,group[x][i].text)  
}  
}  

ICh hätte jetzt gerne sowas:
group[0][0]=new Option("2","Automatic")
group[0][1]=new Option("3 selected='selected'","Test1")
group[0][2]=new Option("4 selected='selected'","Test2")
group[1][0]=new Option("7","Left")
group[1][1]=new Option("8","Right")
group[1][2]=new Option("10","Bottom")
group[1][3]=new Option("11","Top")

Irgendwie funktioniert das aber so nicht. Vermutlich weil das "3 selected='selected" alles als Value interpretiert wird?

Kann mir jemand weiterhelfen wie das richtig heissen muss. Habe keine Idee mehr?

vielen Dank und viele Grüße
hawk

  1. group[0][1]=new Option("3 selected='selected'","Test1")

    new Option erzeugt ein option-Element, das hat die Eigenschaft http://de.selfhtml.org/javascript/objekte/options.htm#selected@title=selected.

    group[0][1].selected = true;

    Mathias

    1. Hallo MAthias,

      vielen Dank für deine Hilfe.
      Ich habe es jetzt mal so versucht.

        
      var groups=document.forms[0].sel_services.options.length  
      var group=new Array(groups)  
      for (i=0; i<groups; i++)  
      group[i]=new Array()  
      group[0][0]=new Option("2","Automatic")  
      group[0][1]=new Option("3","Test1")  
      group[0][1].selected = true;  
      group[0][2]=new Option("4","Test2")  
      group[0][2].selected = true;  
      group[1][0]=new Option("7","Left")  
      group[1][1]=new Option("8","Right")  
      group[1][2]=new Option("10","Bottom")  
      group[1][3]=new Option("11","Top")  
      
      

      Leider werden mir die Einträge jedoch nicht markiert.
      Habe ich was falsch geschrieben?

      vielen Dank und viele Grüße
      hawk

      1. Leider werden mir die Einträge jedoch nicht markiert.
        Habe ich was falsch geschrieben?

        Hast du daran gedacht, dass Mehrfachauswahl das Attribut multiple braucht?

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
        1. Hallo Beat,

          Hast du daran gedacht, dass Mehrfachauswahl das Attribut multiple braucht?

          danke auch dir.
          Ja das habe ich .
          im <select> steht multiple=multiple

          Wie gesagt. Die Mehrfachauswahl klappt ja, nur das anschließende wieder markieren nicht.

          vielen Dank und viele Grüße
          hawk

      2. Mahlzeit hawkmaster,

        tu Dir selbst einen Gefallen und schließe Javascript-Befehle mit einem Semikolon ab - es ist zwar nicht unbedingt erforderlich, erhöht die Übersichtlichkeit und Lesbarkeit von Quellcode aber enorm. Desweiteren möchte ich Dir eine sinnvolle Einrückungsmethode ans Herz legen. So wie er jetzt ist, ist Dein Code extrem leseunfreundlich.

        var groups=document.forms[0].sel_services.options.length

        Hier speicherst Du die Anzahl der in einer Auswahlliste enthaltenen Optionen in einer Variable.

        var group=new Array(groups)

        Hier legst Du ein neues Array an, das exakt genauso viele Elemente hat wie die Auswahlliste Optionen.

        for (i=0; i<groups; i++)

        Hier gehst Du durch das Array hindurch ...

        group[i]=new Array()

        ... erzeugst als Arrayelemente für das Array wieder neue Arrays ...

        group[0][0]=new Option("2","Automatic")
        group[0][1]=new Option("3","Test1")
        group[0][1].selected = true;
        group[0][2]=new Option("4","Test2")
        group[0][2].selected = true;
        group[1][0]=new Option("7","Left")
        group[1][1]=new Option("8","Right")
        group[1][2]=new Option("10","Bottom")
        group[1][3]=new Option("11","Top")

        ... und als Arrayelement dieses inneren Arrays legst Du Option-Objekte mit bestimmten Eigenschaften an.

        Mehr nicht. <http://de.selfhtml.org/javascript/objekte/options.htm#neue_elemente@title=Insbesondere hängst Du die Optionen nicht in die Auswahlliste ein.>

        Darüber hinaus frage ich mich, was Du mit dieser verschachtelten Array-Struktur vorhast. Wenn es Dir um die Gruppierung von Optionen geht, <http://de.selfhtml.org/javascript/objekte/htmlelemente.htm#optgroup@title=verwende das dafür vorgesehene Element>.

        Leider werden mir die Einträge jedoch nicht markiert.

        Natürlich nicht - weil Du niemals dafür sorgst, dass die von Dir erzeugten Optionen auch der Auswahlliste zugeordnet werden.

        Habe ich was falsch geschrieben?

        Grundsätzlich kaum. Dein Konzept scheint aber überarbeitungswürdig zu sein - <http://de.selfhtml.org/javascript/objekte/htmlelemente.htm#select@title=informiere Dich im entsprechenden Kapitel in SELFHTML>.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hallo EKKi

          erst mal vielen Dank an dich für deine tolle Erklärung.
          Es ist so das ich eine Windows Anwendung nachbauen muss und meine Javascript Kenntnisse immer noch bescheiden sind. Ich bin froh das ich es überhaupt bis hierher geschafft habe :-).
          Und auch hier hatte mir früher bei was ähnlichem schon mal jemand geholfen.

          Im Prinzip funktioniert ja das Ganze. Bei einem Klick im linken Auswahlmenü werden die Optionen in der rechten Liste angezeigt.

          Natürlich nicht - weil Du niemals dafür sorgst, dass die von Dir erzeugten Optionen auch der Auswahlliste zugeordnet werden.

          Die Elemente bzw. Optionen werden doch aber angezeigt?
          Ich verstehe es leider nicht wie du das meinst mit dem "einhängen"?

          vielen Dank und viele Grüße
          hawk

          1. Mahlzeit hawkmaster,

            Im Prinzip funktioniert ja das Ganze. Bei einem Klick im linken Auswahlmenü werden die Optionen in der rechten Liste angezeigt.

            Nur anhand des von Dir geposteten Code-Fragments ist das leider nicht zu prüfen. Online-Beispiel?

            »» Natürlich nicht - weil Du niemals dafür sorgst, dass die von Dir erzeugten Optionen auch der Auswahlliste zugeordnet werden.

            Die Elemente bzw. Optionen werden doch aber angezeigt?

            Das kann ich - s.o. - nicht überprüfen. Solange Du kein Online-Beispiel zeigst, zwingst Du Deine Leser dazu, im Nebel zu stochern ... insbesondere wenn es um "eigentümliche Verhaltensweisen" geht.

            Ich verstehe es leider nicht wie du das meinst mit dem "einhängen"?

            <http://de.selfhtml.org/javascript/objekte/options.htm#neue_elemente@title=Ich hatte Dir dazu den entsprechenden Bereich aus SELFHTML verlinkt.> Alternativ kannst Du natürlich - wie molily vorschlug - das Einhängen DOM-konform mittels http://de.selfhtml.org/javascript/objekte/document.htm#create_element@title=createElement() und http://de.selfhtml.org/javascript/objekte/node.htm#append_child@title=appendChild() vornehmen.

            In jedem Fall allerdings ist Dein bisheriges Array-Anlegen, Durchs-Array-laufen, Hin-und-her-kopieren usw. mindestens unübersichtlich, eventuell sogar überflüssig oder gar falsch. Ganz so direkt lässt sich das bisher aber nicht sagen.

            Wie wär's mit einer ganz einfachen Beschreibung dessen, was Du *erreichen* willst? Ganz ohne Code, technischem Schnickschnack usw. ... dann können Deine Leser nämlich auch versuchen zu verstehen, was in Deinem Kopf vorgeht.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Hallo EKKI,
              vielen Dank für deine Geduld:

              in meinem Eröffnungsposting hatte ich die gesamte JS Funktion gepostet, die auch soweit funktioniert. Aber egal. Ich erkläre dir mal was ich machen will, ohne Code.
              In einer Windows Anwendung kann man ein neues Produkt anlegen.
              Man gibt in einem Textfeld den neuen Produktnamen an und eine Beschreibung.
              Dann gibt es noch eine Combobox "Service". Es werden z.b. Werte aufgelistet wie "Standort", "Farbe", "Gewicht".
              In einem weiteren Auswahlmenü "Serviceoptions" darunter werden dann die dazugehörigen Optionen der jeweiligen Services angezeigt.
              Also bei "Standort" wir "Oben", "Unten", "Rechts", "Links" angezeigt.
              Bei "Farbe" "rot", "grün", "blau".
              Das Menü "Serviceoptions"  dient nicht nur der Anzeige. in der Auswahlliste sind Checkboxen die man dann auswählen kann (ich weiss nicht wie man dazu genau sagt) Der Anwender kann als bei "Farbe" nur die Option "rot" und "blau" wählen.
              Ein Klick auf "OK" speichert das Ganze in einer DB.

              Das möchte ich nun gerne nachbauen.
              Mein erster Versuch war daher per JS die einzelnen Menüoptionen in einem Array zu gruppieren.
              group[0][0]=new Option("2","Automatic")
              group[0][1]=new Option("3","Test1")
              group[0][2]=new Option("4","Test2")
              ...
              Mit einem Klick werden diese dann angezeigt.
              Wie gesagt, das alles funktioniert bis jetzt. Nur das markieren nach dem speichern noch nicht.

              Ich hoffe es ist nun etwas klarer geworden?

              Vielleicht hast du ja auch einen ganz anderen Ansatz?

              vielen Dank und viele Grüße
              hawk

              1. hallo again hawk,

                Vielleicht hast du ja auch einen ganz anderen Ansatz?

                man koennte auch kurz einen blick in Deinen vorherigen thread werfen:

                »Idee gesucht, Auswahlliste mehrere Werte merken«

                so long - peterS. - pseliger@gmx.net

              2. Mahlzeit hawkmaster,

                Vielleicht hast du ja auch einen ganz anderen Ansatz?

                Ja. Bzw. Der Martin hatte einen für Dich.

                Mal wieder ein gutes Beispiel dafür, warum Doppelpostings hier nicht gern gesehen sind.

                Solange es um ein Thema, das gleiche Problem oder verwandte Dinge geht, bleibe bitte in Deinem Thread. Du kannst jederzeit das Thema und den Themenbereich ändern. Wenn Du stattdessen ständig neue Threads eröffnest, spaltest Du die Aufmerksamkeit der Leser ... nicht jeder liest in jedem Thread mit, nicht jeder kann alles lesen. Und so musst Du alles mehrfach erklären, Deine Leser wissen nicht, was schon herausgefunden oder empfohlen wurde usw.

                Es hat einen Sinn, warum immer wieder darauf hingewiesen wird.

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                1. Hallo
                  sorry wegen dem Doppelposting.
                  Ich dachte eigentlich das würde nicht zum alten Thema passen bzw. das auch der Thread zu alt ist.
                  Aber ich gelobe Besserung :-)
                  Ich habe es jetzt duch lesen in self
                  http://de.selfhtml.org/javascript/objekte/options.htm#neue_elemente
                  was das "options" Object genau macht hinbekommen und auch kapiert.
                  Ich habe das zweite "einhängen" weggelassen und übergebe direkt mit
                  document.forms[0].sel_serviceproperties.options[i] = group[x][i];

                  Nochmals vielen Dank an alle Helfer für die Mühe und Geduld.

                  vielen Dank und viele Grüße
                  hawk

  2. Hallo,

    Hallo zusammen,

    ICh hätte jetzt gerne sowas:~~~javascript

    group[0][0]=new Option("2","Automatic")
    group[0][1]=new Option("3 selected='selected'","Test1")
    group[0][2]=new Option("4 selected='selected'","Test2")
    group[1][0]=new Option("7","Left")
    group[1][1]=new Option("8","Right")

      
    Richtig gedacht, aber falsch notiert. `new Option()`{:.language-javascript} nimmt vier Argumente (<http://de.selfhtml.org/javascript/objekte/options.htm#neue_elemente@title=siehe hier>), von denen das vierte die selected-Eigenschaft angibt.  
      
    
    > Ich verstehe es leider nicht wie du das meinst mit dem "einhängen"?  
      
    Naja, du hast ein select-Element und erzeugst mehrere Option-Elemente, aber die "wissen" zunächst nicht, wessen Optionen sie sein sollen (die des select-Elements nämlich).  
      
    Du musst die Optionen also noch "einhängen" in den DOM-Baum als Kinder deines select-Elements. Wie das geht, ist <http://de.selfhtml.org/javascript/objekte/options.htm#neue_elemente@title=ebenfalls hier> beschrieben.  
      
    Aber Achtung: Gerade gestern hatte ich das Problem, dass die .appendChild()-Methode, mit der man sowas machen kann, im IE nicht richtig arbeitet. Wenn man ein Option-Element etwa mit `mySelect.appendChild(myOption)`{:.language-javascript} ins select-Element einhängt, ist es zwar nachher drin, aber der Text wird im IE nicht angezeigt, er ist irgendwie "weg", obwohl vorhanden (man kann ihn im Script auslesen) \*grummel\*.  
      
    Dann gibt es noch die add()-Methode des select-Elements, die aber angeblich auch nicht breit unterstützt wird.  
      
    Am sichersten um Anhängen ist anscheinend eine Zuweisung mit:  
    `mySelect.options[mySelect.options.length] = myOption;`{:.language-javascript}  
      
    Gruß, Don P  
    
    
    1. Gerade gestern hatte ich das Problem, dass die .appendChild()-Methode, mit der man sowas machen kann, im IE nicht richtig arbeitet.

      new Option und appendChild ist auch die Vermischung zweier »Universen«. Das eine ist Netscape JavaScript, das andere ist DOM. Wie sieht es mit createElement und appendChild aus?

      Dann gibt es noch die add()-Methode des select-Elements, die aber angeblich auch nicht breit unterstützt wird.

      Neuere Browser sollten sie können, denn sie ist DOM 1 HTML.
      Eine Notwendigkeit dafür besteht natürlich nicht, wenn man schon die robusteren DOM Core und Netscape JS zur Verfügung hat.

      Am sichersten um Anhängen ist anscheinend eine Zuweisung mit:
      mySelect.options[mySelect.options.length] = myOption;

      Richtig, das ist auch die »älteste« Methode aus Netscape JavaScript.

      Mathias

      1. Hallo,

        new Option und appendChild ist auch die Vermischung zweier »Universen«. Das eine ist Netscape JavaScript, das andere ist DOM.

        Achso, bei diesem Wirrwarr blicke ich noch nicht ganz durch... Gibts irgendwo eine übersichtliche Doku, wo das alles gegenübergestellt ist?

        Wie sieht es mit createElement und appendChild aus?

        Weiß nicht. Habe ich gar nicht probiert, denn das scheint mir am umständlichsten: Erst createElement für die Option, dann womöglich noch createElement für einen Textknoten oder so, dann Eigenschaften wie value, selected usw. einzeln zuweisen, und schließlich nochmal appendChild zum Einhängen ins Select-Element... da krieg' ich die Motten. Was ist denn so toll daran?

        Bin eigentlich davon ausgegangen, dass new Option() heutztage bloß Abkürzung für die ganzen createElement-Kapriolen implementiert ist, d.h. dass man einfach zwischen den "Universen" tunneln kann. Ist wohl doch nicht so. Schön, dass es den IE gibt, sonst wäre ja alles viel zu einfach...

        »» Dann gibt es noch die add()-Methode des select-Elements, die aber angeblich auch nicht breit unterstützt wird.

        Neuere Browser sollten sie können, denn sie ist DOM 1 HTML.
        Eine Notwendigkeit dafür besteht natürlich nicht, wenn man schon die robusteren DOM Core und Netscape JS zur Verfügung hat.

        Mit DOM Core meinst du die "createElement-Kapriolen"?
        Ist Netscape JS eigentlich noch zu empfehlen, abgesehen davon, dass es am zuverlässigsten ist, denn wer weiß wie lange noch?

        Gruß, Don P

        1. Gibts irgendwo eine übersichtliche Doku, wo das alles gegenübergestellt ist?

          Nicht dass ich wüsste.

          Wie sieht es mit createElement und appendChild aus?

          Weiß nicht. Habe ich gar nicht probiert, denn das scheint mir am umständlichsten

          Ist es auch. Mir ging es um die Kombination.

          Was ist denn so toll daran?

          Es ist nicht toll im Vergleich zu new Option, ich habe mich nur gefragt, ob es vielleicht besser funktioniert im Vergleich zu new Option und appendChild, weil diese unterschiedlicher Herkunft sind.

          Bin eigentlich davon ausgegangen, dass new Option() heutztage bloß Abkürzung für die ganzen createElement-Kapriolen implementiert ist

          Ja, vermute ich auch - aber wenn du im IE Schwierigkeiten festgestellt hast, kann es auch sein, dass es in manchen Browsern Unterschiede gibt.

          Ist Netscape JS eigentlich noch zu empfehlen, abgesehen davon, dass es am zuverlässigsten ist, denn wer weiß wie lange noch?

          Kein JavaScript-fähiger Browser wird plötzlich anfangen, Netscape JavaScript  nicht mehr zu unterstützen. Da würde ja vieles wegfallen, denn nicht alles ist in DOM HTML o.ä. später standardisiert worden.

          Mathias

    2. Hallo zusammen,
      nochmals Danke an alle für die Tips.
      ich habe nun mal ein wenig weiter geforscht und die Beispiel in self angeschaut.
      Ich versuche nun das markieren nachträglich zu machen.

      Nach dem Submit mit ausgewählten Werten lese ich diese aus der DB und speichere sie in einem neuen JS Array savedIDs,
      Da steht dann also etwa "2", "4" drin, also die Values von dem Select.

      Mein problem ist nun aber, das der Vergleich mit
      "if(savedIDs[i] == document.forms[0].sel_serviceproperties.options[i].value){"
      nicht klappt weil die Reihenfolge wie die Werte im Array stehen nicht mit der Reihenfolge aus dem Select übereinstimmen.

      Bei PHP gibt es sowas wie "in_array". Gibt es vielleicht sowas auch für JS?
      Sorry wenn ich mich so doof anstelle, aber ich bin mit den ganzen Funktionen und Möglichkeiten in JS noch nicht so vertraut.

        
      if(document.forms['form1'] && document.forms['form1'].sel_services.options.selectedIndex != '-1')  
      {  
      showserviceproperties(document.forms[0].sel_services.options.selectedIndex);  
      for(i=0;i<document.forms[0].sel_serviceproperties.length;i++){  
        if(savedIDs[i] == document.forms[0].sel_serviceproperties.options[i].value){  
          document.forms[0].sel_serviceproperties.selected = true;  
        }//if  
      }//for  
      
      

      vielen Dank und viele Grüße
      hawk

      1. Hallo
        irgendwie drehe ich mich im Kreis.
        Ich habe hier in Self eine Funktion gefunden die so etwas wie "in_array" macht.
        im Array savedIDs sind die Werte 2 und 4 drin.
        ein
        alert(document.forms[0].sel_serviceproperties.options[i].value);
        bringt auch 2 und 4
        Die Prüfung
         if (savedIDs.contains(v))
        bringt jedoch nie "gefunden" zurück
        Ein
         if (savedIDs.contains(4))
        hingegen schon.

          
        for(i=0;i<document.forms[0].sel_serviceproperties.length;i++){  
          v = document.forms[0].sel_serviceproperties.options[i].value;  
          if (savedIDs.contains(v)) alert('gefunden');  
          
        }  
          
        Array.prototype.contains = function(value) {  
            for (var i = 0; i < this.length; i++) {  
                if (this[i] === value) return true;  
            }  
            return false;  
        };  
          
        
        

        vielleicht kann mir das jemand erklären?
        und..
        Was bedeutet das "prototype" ??

        vielen Dank und viele Grüße
        hawk

        1. Hallo,

          irgendwie drehe ich mich im Kreis.

          Eine Spirale, immerhin.

          im Array savedIDs sind die Werte 2 und 4 drin.

          Als numerische Werte, nehme ich an.

          alert(document.forms[0].sel_serviceproperties.options[i].value);
          bringt auch 2 und 4

          Ja, aber es sind immer Strings in options[i].value

          Die Prüfung
          if (savedIDs.contains(v))
          bringt jedoch nie "gefunden" zurück
          Ein
          if (savedIDs.contains(4))
          hingegen schon.

          Notiere mal if (savedIDs.contains(+v))
          Durch das + wird v numerisch übergeben, und der typgenaue Vergleich if (this[i] === value) sollte dann auch klappen, wenn deine savedIDs numerisch sind.

          Was bedeutet das "prototype" ??

          Array.prototype ist die "Mutter" aller Arrays. Wenn man dort eine Eigenschaft oder Methode hinzufügt, haben automatisch alle Arrays diese Eigenschaft oder Methode.

          Gruß, Don P

  3. Hallo,

    Sehe gerade, dass du die Optionen wohl doch einhängst, mit:

    temp.options[i]=new Option(group[x][i].value,group[x][i].text)

      
    Aber wozu jetzt nochmal neue Option-Elemente erzeugen?  
    Sie sind doch schon im Group-Array vorhanden.  
    Das sollte m.E. reichen:  
      
    ~~~javascript
      
    temp.options[i] = group[x][i];  
    
    

    Gruß, Don P

  4. Hallo zusammen,
    nachdem ich nun ein wenig getestet habe ist mir noch etwas aufgefallen was ich mir nicht erklären kann.
    Ich hoffe der Thread ist nicht zu alt und es schaut noch mal jemand rein. Ich möchte aber auch kein Doppelposting machen.

    Folgende Ausgangssituation:
    Zwei Select Listen. Bei Klick auf "sel_services" werden die Optionen in ""sel_serviceproperties" angezeigt.
    Wird auf "Location" geklickt, sind die Einträge "Left","Bottom","Top" markiert.
    Beim ersten Klick funktioniert das noch. Wenn man nun aber in "sel_serviceproperties" z.b. den Eintrag "Right" markiert, dann wieder auf "sel_services" "Farbe" klickt und wieder auf "Location" dann ist immer noch "Right" markiert und nicht mehr so wie in der Ausgangssituation "Left","Bottom","Top".
    So als ob die letzte Markierung im Cache ist.
    Ich verstehe nicht warum das so ist?
    An der Gruppierung bzw. der Vorauswahl ändert sich doch nichts.
    Oder ist das ein ganz normales Verhalten des Browsers?

      
    select name="sel_services" size="10" onclick = "showserviceproperties(this.options.selectedIndex);" >  
    	<option value="4">Farbe</option>  
    	<option value="5">Location</option>  
    </select>  
      
    <select name="sel_serviceproperties[]" size="10" multiple="multiple" >  
    </select>  
    
    
      
    var groups=document.forms[0].sel_services.options.length  
    var group=new Array(groups)  
    for (i=0; i<groups; i++)  
    group[i]=new Array()  
    group[0][0]=new Option("Gelb","2")  
    group[0][1]=new Option("Rot","3",false,true)  
    group[0][2]=new Option("Blau","4")  
    group[1][0]=new Option("Left","7",false,true)  
    group[1][1]=new Option("Right","8")  
    group[1][2]=new Option("Bottom","10",false,true)  
    group[1][3]=new Option("Top","11",false,true)  
      
    var temp=document.forms[0].sel_serviceproperties  
      
    function showserviceproperties(x){  
       for (m=temp.options.length-1;m>0;m--)  
        temp.options[m]=null  
       for (i=0;i<group[x].length;i++){  
         document.forms[0].sel_serviceproperties.options[i] = group[x][i];  
       }  
    }  
    
    

    vielen Dank und viele Grüße
    hawk

    1. Yerf!

      So als ob die letzte Markierung im Cache ist.
      Ich verstehe nicht warum das so ist?
      An der Gruppierung bzw. der Vorauswahl ändert sich doch nichts.
      Oder ist das ein ganz normales Verhalten des Browsers?

      Firefox? Zumindest von dem kenn ich das Verhalten, dass er sich die letzte Auswahl des Benutzers auf der Seite merkt und damit die im Dokument mitgegebene Vorauswahl überschreibt.

      Ein cache-control:no-store als HTTP-Header hat da gehlofen.

      Gruß,

      Harlequin

      --
      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
      1. Hallo Harlequin,
        vielen Dank für deine Hilfe.

        ja Firefox.
        hm,
        ich hatte mal testweise dieses Script das ähnlich arbeitet ausbrobiert.

        http://www.christoph-schnauss.de/prog/javascript/dropdown7.htm

        Hier hatte ich das "menu2" auf "multiple=multiple" gestellt.
        Aber hier ist es egal was ich auswähle, der Index ist immer wieder o.
        Ich werde es aber mal mit dem "cache-control" versuchen.

        vielen Dank und viele Grüße
        hawk

        1. Hallo,

          Ich werde es aber mal mit dem "cache-control" versuchen.

          Glaube nicht, dass es daran liegt. Der Code kann so m.M.n. gar nicht funktionieren.

          1. Mit
          <select name="sel_serviceproperties[]" size="10" multiple="multiple"></select>

          vergibst du den Namen "sel_serviceproperties[]", und willst später mit

          document.forms[0].sel_serviceproperties

          darauf zugreifen. Wo sind jetzt die eckigen Klammern des name-Attributs geblieben? Das kann doch so nicht funktionieren.

          2. Die versch. Option-Elemente werden einmalig erzeugt und in Arrays referenziert. Wenn ein Select-Feld damit gefüllt wird, enthält es wieder nur Referenzen auf diese Option-Elemente.
          Die Veränderung einer Option im Select-Feld müsste sich also direkt auf das im Array referenzierte Option-Element auswirken. Wenn es später mit showserviceproperties(x) erneut zugewiesen wird, hat es natürlich dieselben Eigenschaften, wie nach der letzten Veränderung.
          Das muss nichts mit dem Cache zu tun haben.

          Noch etwas: Mit

             for (m=temp.options.length-1;m>0;m--)  
              temp.options[m]=null  
          
          

          willst du anscheinend die Options-Auflistung leeren. Dabei wird a) das erste Element nicht auf null gesetzt (wegen Bedingung m>0), und b) ginge das viel einfacher mit

          temp.options.length = 0.

          Gruß, Don P

          1. Hallo Don P.
            auch dir vielen Dank.

            vergibst du den Namen "sel_serviceproperties[]", und willst später mit

            document.forms[0].sel_serviceproperties

            darauf zugreifen. Wo sind jetzt die eckigen Klammern des name-Attributs geblieben? Das kann doch so nicht funktionieren.

            Die eckige Klammer bei "sel_serviceproperties[]" brauche ich aber, weil es multiple ist und ich später mit PHP die markierten Werte auswerten bzw. speichen möchte.

            Wenn ich aber hingegen ein;
            var temp=document.forms[0].sel_serviceproperties[]

            mache, bekomme ich einen Syntax Fehler.

            Das ganze funktioniert schon soweit. Die Ansicht und Zuordnung klappt. Mir ist nur nicht ganz klar warum immer der Wert der zuletzt gespeichert wurde gespeichert wird.

            vielen Dank und viele Grüße
            hawk

            1. Hallo,

              Wenn ich aber hingegen ein;
              var temp=document.forms[0].sel_serviceproperties[]

              mache, bekomme ich einen Syntax Fehler.

              Ich hatte an sowas gedacht: document.forms[0]["sel_serviceproperties[]"]

              Das ganze funktioniert schon soweit. Die Ansicht und Zuordnung klappt.

              Das wundert mich zwar, aber ok.

              Mir ist nur nicht ganz klar warum immer der Wert der zuletzt gespeichert wurde gespeichert wird.

              Das habe ich dir doch erklärt. Die Option-Objekte sind immer dieselben. Wenn du eins änderst (z.B. durch selektieren), dann steht seine selected-Eigenschaft auf true. Da es im Array referenziert und später erneut zugewiesen wird, bleibt das auch so.

              Gruß, Don P

              1. Yerf!

                Das habe ich dir doch erklärt. Die Option-Objekte sind immer dieselben. Wenn du eins änderst (z.B. durch selektieren), dann steht seine selected-Eigenschaft auf true. Da es im Array referenziert und später erneut zugewiesen wird, bleibt das auch so.

                Das ist auch der Punkt, an dem ich geschlafen hab... zwischen den verschiedenen Auswahlen passiert ja kein Post-Back. Nur dann könnten die Cache-Einstellungen betroffen sein.

                Hier bleiben die Einstellungen erhalten, weil das Option-Element nur ein einziges mal gebaut wird und dann immer dieses Wiederverwendet wird. Und das merkt sich natürlich seinen Selected-Zustand.

                Gruß,

                Harlequin

                --
                <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                1. Hallo

                  Das ist auch der Punkt, an dem ich geschlafen hab...

                  Hier bleiben die Einstellungen erhalten, weil das Option-Element nur ein einziges mal gebaut wird und dann immer dieses Wiederverwendet wird. Und das merkt sich natürlich seinen Selected-Zustand.

                  so gaaaanz langsam kapier ich glaub was ihr meint.
                  Ich dachte ursprünglich folgendes:
                  Das Array "group" wird ja nur einmal aufgebaut und ist immer gleich.

                  var group=new Array(groups)
                  for (i=0; i<groups; i++)
                  group[i]=new Array()
                  group[0][0]=new Option("Gelb","2")
                  group[0][1]=new Option("Rot","3",false,true)
                  group[0][2]=new Option("Blau","4")
                  group[1][0]=new Option("Left","7",false,true)
                  group[1][1]=new Option("Right","8")
                  group[1][2]=new Option("Bottom","10",false,true)
                  group[1][3]=new Option("Top","11",false,true)

                  Wenn die Funktion showserviceproperties(x) werden immer die gleichen Zustände geladen egal was in "sel_serviceproperties" ausgewählt wird.

                  vielen Dank und viele Grüße
                  hawk

      2. Hallo Harlequin,

        Habe nun mal ein;
        header("Expires: Mon, 12 Jul 1995 05:00:00 GMT");
        header("Last-Modified: ". gmdate("D, d M Y H.i:s") . " GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");

        eingebaut.
        Leider ist das Verhalten noch genauso.

        vielen Dank und viele Grüße
        hawk

        1. Hallo,

          Leider ist das Verhalten noch genauso.

          Wie genau soll es sein? Immer wieder die ursprünglichen Einstellungen wie beim Initalisieren der Arrays? Dann mach's z.B. so:

            
          var groups = document.forms[0].sel_services.options.length,  
              group = new Array(groups);  
            
          for (i=0; i<groups; i++) {group[i]=[];}  // [] bedeutet new Array()  
            
          group[0][0] = {text:"Gelb",   value:"2"} // Objekt mit den Parametern  
          group[0][1] = {text:"Rot",    value:"3",  dflt:false, select:true}  
          group[0][2] = {text:"Blau",   value:"4")  
          group[1][0] = {text:"Left",   value:"7",  dflt:false, select:true)  
          group[1][1] = {text:"Right",  value:"8")  
          group[1][2] = {text:"Bottom", value:"10", dflt:false, select:true)  
          group[1][3] = {text:"Top",    value:"11", dflt:false, select:true)  
            
          function showserviceproperties(x){  
            
             var mulSelect = document.forms[0]["sel_serviceproperties[]"];  
             mulSelect.options.length = 0; // options-Auflistung leeren  
            
             for (var i=0; i<group[x].length; i++){  
               var o = group[x][i]; // Objekt mit den Parametern holen  
               mulSelect.options[i] = new Option(o.text, o.value,!!a.deflt,!!a.select); // !! erzwingt boolean  
             }  
          }  
          
          

          Gruß, Don P

          1. Hallo Don P,
            ich habe es gleich mal in meinem PHP Code eingebaut.
            Und siehe da, es funktioniert!
            ich kann dir garnicht sagen wie sehr mich das freut.
            Ich mache damit nun schin ewig rum.

            Ich muss aber zugeben, das ich nicht so ganz verstehe was jetzt anders ist.
            Liegt es daran das wir nun das "new Option" erst am Schluss machen und nicht schon bei "group[]" ?

            Diese Bezeichnungen bei;
            {text:"Rot",    value:"3",  dflt:false, select:true}
            also "text", "value", "dflt" und "select" können die frei wählbar sein?

            und was bedeuten die zwei !! bei
            !!o.dflt,!!o.select

            Nochmals tausend Dank

            vielen Dank und viele Grüße
            hawk

            1. Hallo,

              ich habe es gleich mal in meinem PHP Code eingebaut.
              Und siehe da, es funktioniert!
              ich kann dir garnicht sagen wie sehr mich das freut.

              Freut mich auch :-)

              Ich muss aber zugeben, das ich nicht so ganz verstehe was jetzt anders ist.
              Liegt es daran das wir nun das "new Option" erst am Schluss machen und nicht schon bei "group[]" ?

              Ja. Das Multiple-Select-Element wird jetzt jedes mal mit nagelneuen Option-Elementen bestückt, die stets genau die Einstellungen erhalten, die ursprünglich mit den Parameter-Objekten festgelegt wurden.

              In deinem ursprünglichen Code wurde dagegen immer mit den alten Option-Elementen weitergearbeitet, die sich ihren Zustand (selected oder nicht) jeweils gemerkt haben.

              Diese Bezeichnungen bei;
              {text:"Rot",    value:"3",  dflt:false, select:true}
              also "text", "value", "dflt" und "select" können die frei wählbar sein?

              Ja. Ich habe sie aber so benannt, weil daraus ihre Bedeuung für new Option() hervorgeht. Ein Option-Element hat ja Eigenschaften mit genau diesen Namen. Nur "default" habe ich abgekürzt zu "dflt", weil es in javascript ein reserviertes Wort ist (kann also nicht frei vergeben werden).

              und was bedeuten die zwei !! bei
              !!o.dflt,!!o.select

              Falls "dflt" bzw. "select" im Parameter-Objekt nicht definiert sind (was ja vorkommt), dann würde man an new Option() die Werte "undefined" übergeben (vllt. nicht unbedingt schlimm, aber unschön).
              !! ist eine doppelte Verneinung, weil !undefined === true bedeutet und daher !!undefined === false ist.
              Also wird dadurch false übergeben, falls nicht definiert, und true wird übergeben, falls der Parameter bereits true ist (wegen !true === false und !!true === true).

              Langer Rede kurzer Sinn: Durch !!wert wird ein entsprechender boolescher wert (true/false) erzwungen, es gilt z.B. (man beachte den typgenauen Vergleich mit ===):

              !!0 === false  
              !!"" === false  
              !!null === false  
              !!false === false  
              !!undefined === false  
              !!-1 === true  
              !!"text" === true
              

              usw.

              Viel Spass noch,
              Don P

            2. Hallo hawk,

              Da wir gerade dabei sind, noch ein Rat zu Variablennamen:

              Es hat sich meiner Erfahrung nach bewährt, wenn man sich jeweils ein paar Gedanken zur Benennung macht. Sprechende Namen sind unbedingt von Vorteil, wenn man den Code später mal wieder vor Augen hat und ihn verstehen will.

              Z.B. übergibst du "x" an eine Funktion, wobei x anscheinend die index-Nummer deiner "group" ist. Was spricht dagegen, das Ding z.B. "groupNr" oder "groupIdx" zu nennen? Dann weiß man immer gleich, was gemeint ist. Könnte natürlich sein, dass "x" bei dir immer eine Index-Nummer bedeutet, dann wäre es ok.

              Auch eine Variable "temp" macht selten Sinn. "temp" ist dein Select-Objekt (multiple), also nennt man es z.B. mulSelect, das spricht für sich. Die Tatsache, dass eine Variable nur temporär verwendet wird, wird schon allein dadurch deutlich, dass sie nur lokal innerhalb einer Funktion oder einer for-Schleife initialisiert bzw. verwendet wird.

              Es gibt nichts schlimmeres, als eigenen Code überarbeiten zu müssen, den man selbst nicht mehr versteht, nur weil man die Variablen unüberlegt benannt hat...

              Gruß, Don P