Visualizzazione dei risultati da 1 a 6 su 6

Discussione: select multiple

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    254

    select multiple

    Salve a tutti,
    ho recuperato un codice nella sezione pillole postato da un utente.
    Lo script è semplice e carino, sposta gli elementi da una select multipla all'altra, per provarlo copiate e incollate il codice, funziona perfettamente:

    <script>
    // Due argomenti, sono due frecce, o --> o <--
    function sposta(direzione){
    j=0;
    form=document.form1
    if(direzione=='-->'){
    partenza=form.prima
    arrivo=form.seconda
    }
    else{
    partenza=form.seconda
    arrivo=form.prima
    }

    non_sel=new Array()
    sel=new Array()
    //per ogni opzione di partenza controlla:
    for(i=0;i<partenza.options.length;i++){
    //se è selezionata, mettila nell'array sel
    if(partenza.options[i].selected){
    partenza.options[i].selected=false
    sel.push(partenza.options[i])
    }
    //altrimenti non è selezionata, quindi mettila nell'array non_sel
    else{
    non_sel.push(partenza.options[i])
    }
    }
    //per ogni opzione di arrivo
    for(i=0;i<arrivo.options.length;i++){
    //aggiungi all'array sel tutti i valori di arrivo
    sel.push(arrivo.options[i])
    }
    function sorting(a,b){
    if(a.text<b.text)return -1
    if(a.text>b.text)return 1
    else return 0
    }
    sel.sort(sorting)
    non_sel.sort(sorting)
    //azzera le due select
    partenza.options.length=0;
    arrivo.options.length=0;
    //Per ogni valore in non_sel
    for(i=0;i<non_sel.length;i++){
    //scrivilo in partenza
    partenza.options[i]=non_sel[i]
    }
    //Per ogni valore in sel
    for(i=0;i<sel.length;i++){
    //scrivilo in arrivo
    arrivo.options[i]=sel[i]
    }
    }
    </script>

    <form name="form1">
    <select name="prima" multiple size=7>
    <option name="a">a</option>
    <option name="c">c</option>
    <option name="b">b</option>
    </select>
    <input type="button" value=">>" onClick="sposta('-->')" ><input type="button" value="<<" onClick="sposta('<--')" >
    <select name="seconda" multiple size=7>
    <option name="d">d</option>
    <option name="e">e</option>
    </select>
    Io sto cercando di personalizzarlo in modo che la prima select resta invariata e la seconda acquisisce i valori selezionati nella prima, ma deve esserci qualcosa che non so sulle select multiple perchè si blocca in un ciclo anche se non dovrebbe:

    codice:
    <script> 
    // Due argomenti, sono due frecce, o --> o  <-- 
    function sposta(){ 
        j=0; 
        form=document.form1 
            partenza=form.prima 
            arrivo=form.seconda 
        non_sel=new Array() 
        sel=new Array() 
        //per ogni opzione di partenza controlla:  
        for(i=0;i<partenza.options.length;i++){ 
            //se è selezionata, mettila nell'array sel 
            if(partenza.options[i].selected){ 
                partenza.options[i].selected=false 
                sel.push(partenza.options[i]) 
            } 
            //altrimenti non è selezionata, quindi mettila nell'array non_sel 
            else{ 
                non_sel.push(partenza.options[i]) 
            } 
        } 
        //per ogni opzione di arrivo 
        for(i=0;i<arrivo.options.length;i++){ 
            //aggiungi all'array sel tutti i valori di arrivo 
            sel.push(arrivo.options[i]) 
        } 
        function sorting(a,b){ 
            if(a.text<b.text)return -1 
            if(a.text>b.text)return 1 
            else return 0 
        } 
        sel.sort(sorting) 
        non_sel.sort(sorting) 
        //azzera le due select 
        arrivo.options.length=0; 
        //Per ogni valore in non_sel 
        //Per ogni valore in sel 
        for(i=0;i<sel.length;i++){ 
            //scrivilo in arrivo 
            arrivo.options[i]=sel[i]  //e qui si blocca
        } 
    }             
    </script> 
    
    <form name="form1"> 
    <select name="prima" multiple size=7> 
    <option name="a">a</option> 
    <option name="c">c</option> 
    <option name="b">b</option> 
    </select> 
    <input type="button" value=">>" onClick="sposta()" >
    <select name="seconda" multiple size=7> 
    </select>
    Sapete illuminarmi?
    So che potrei usare una text area invece della seconda select, ma vorrei fare altre modifiche per cui preferisco che sia una select anche la seconda.
    Grazie Angelo

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    254
    Nessuno riesce ad aiutarmi?

  3. #3
    Non lo ho affatto testato, comunque scorrendo il tuo codice per una ispezione diciamo "a prima vista", la riga:
    codice:
    arrivo.options[i]=sel[i]  //e qui si blocca
    è errata a prescindere dal fatto che il loop entri in un ciclo infinito o meno (non è chairo infatti se "qui si blocca" intende dire che il ciclo non termina mai o non viene eseguito).

    arrivo.options[i] devi poi specificare COSA della option di quella select deve ricevere quel valore: il text della option
    arrivo.options[i].text=sel[i];
    Il value del tag option
    arrivo.options[i].value=sel[i];
    o entrambi?
    arrivo.options[i].text=arrivo.options[i].value=sel[i];

    Intanto chiarisci/correggi questo, poi vediamo.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    254
    Grazie per la risposta,
    si blocca nel senso che esegue solo per i=0.
    non metto text e value perchè:
    [/CODE]
    for(i=0;i<partenza.options.length;i++){
    //se è selezionata, mettila nell'array sel
    if(partenza.options[i].selected){
    partenza.options[i].selected=false
    sel.push(partenza.options[i])
    }
    //altrimenti non è selezionata, quindi mettila nell'array non_sel
    else{
    non_sel.push(partenza.options[i])
    }
    }
    [/CODE]

    in questo modo mette nell'array gli elementi selezionati, credo sia value che text. E con:
    codice:
    for(i=0;i<sel.length;i++){ 
    //scrivilo in arrivo 
    arrivo.options[i]=sel[i] 
    }
    riporta nella select gli elementi selezionati.

    se eseguo tutto il codice funziona, se eseguo in modo personalizzato, ovvero lasciando invariata la prima select non funziona. Adesso provo a specificare i campi text e value.

  5. #5
    Se il sort delle option per te non è essenziale, basterebbe:

    codice:
    <script>
    
    var giaaggiunte={};
    
    function sposta(prima){ 
    if(prima.selectedIndex>=0 && !giaaggiunte[prima.selectedIndex]){
    var L=++document.form1.seconda.options.length-1;
    document.form1.seconda.options[L].text=prima.options[prima.selectedIndex].text;
    document.form1.seconda.options[L].value=prima.options[prima.selectedIndex].value;
    giaaggiunte[prima.selectedIndex]=true;
    };
    }   
    
    </script>
    
    
    <form name="form1">
    <select name="prima" multiple size=7 onchange="sposta(this)">
    <option name="a">a</option>
    <option name="c">c</option>
    <option name="b">b</option>
    </select>
    ----
    <select name="seconda" multiple size=7>
    <option name="d">d</option>
    <option name="e">e</option>
    </select>
    </form>
    Se poi rimettere assieme le option in ordine alfabetico è fondamentale, si può sempre aggiungere (a regola un sorter in loco, ma per farla più spiccia se non si tratta di menu con centinaia e centinaia di elementi, si fa un loop come nell' altro script, si collezionano le option, si rfa il sorting, e si riassegnano alla select nel nuovo ordine.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    254
    E' perfetto, ti ringrazio.
    Ciao Angelo
    Buone Feste

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.