Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39

    [JS forms] Iterare Array Associativo di input

    Ho un form del genere (uso checkbox, ma il discorso vale per qualunque input)


    codice HTML:
    <form name="myform" id="myform" method="POST" action="">
       <input type="checkbox" name="mychecks[]" value="1" checked><br>
       <input type="checkbox" name="mychecks[]" value="2" checked><br>
       <input type="checkbox" name="mychecks[]" value="3" checked><br>
       <input type="checkbox" name="mychecks[]" value="4" checked><br>
       <input type="checkbox" name="mychecks[]" value="5" checked><br>
    </form>

    in questa situazione, posso "iterare" il mio array di input cosi':

    codice:
    var check_list = document.forms['myform'].elements[ 'mychecks[]' ];
    
    
    for(check in check_list)
    {
       if (check_list[check].checked) console.log(check_list[check].value);
    }

    o selezionare un "singolo" elemento cosi':


    codice:
    console.log(check_list[3].value);

    Ma se invece volessi usare un array associativo, tipo:


    codice HTML:
    <input type="checkbox" name="mychecks[primo]" value="1" checked><br>
    <input type="checkbox" name="mychecks[secondo]" value="2" checked><br>
    <input type="checkbox" name="mychecks[terzo]" value="3" checked><br>
    <input type="checkbox" name="mychecks[quarto]" value="4" checked><br>

    come posso accedere/iterare i campi??


    il selettore "mychecks[]" non funziona!!!!

  2. #2
    "elements" non è altro che un array, i cui indici sono composti dai name dei campi del modulo.
    Se più elementi del form hanno lo stesso name, ad esempio: "el_name", elements['el_name'] conterrà a sua volta un array con tutti gli oggetti del DOM con quel name.

    Nell'array "elements" quindi, il name/indice "mycheck[primo]" è diverso dal name/indice "mycheck[secondo]"
    ecco perché document.forms['myform'].elements[ 'mychecks[]' ]; non funziona se cambi i name delle checkbox.

    Per individuare, all'interno del modulo, degli elementi con names non uguali, bisogna usare altri "elementi di aggregazione", che variano da modulo a modulo.

    Questo esempio utilizza sempre l'array "elements" e filtra le checkbox in base al loro name:
    codice:
    //tutti gli elementi del form
    var el_list = document.forms['myform'].elements; 
    
    //array che conterrà le checkbox
    var check_list=[]; 
    
    //scorro gli elementi del modulo "myform"
    for(var i=0; i<el_list.length; i++){
        
        //se il name dell'input contiene la stringa 'mychecks'
        if(el_list[i].name.indexOf('mychecks')>-1){
    
            check_list.push(el_list[i]); //aggiungo il checkbox all'array check_list
    
        }
        
         /*per la verifica avrei potuto usare l'attributo type: 
        if(el_list[i].type=='checkbox')
        nel caso in cui le checkbox da selezionare siano le uniche checkbox nel modulo
        oppure altri criteri come, ad esempio, una classe o un data-attribute*/
    
    }
    Un'alternativa, utilizzando il DOM3, potrebbe essere:

    codice:
    var check_list = document.querySelectorAll('input[name^="mychecks"]');
    Oppure con jQuery:
    codice:
    var check_list = $('input[name^="mychecks"]');
    Notare l'identica sintassi tra jQuery e l'ultima versione del DOM che, a quanto pare, ha preso a piene mani da jQuery.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    Un'alternativa, utilizzando il DOM3, potrebbe essere:

    codice:
    var check_list = document.querySelectorAll('input[name^="mychecks"]');

    Bella! Questa mi piace

    [EDIT]

    Ah.. ehm .. ma come siamo messi a compatibilità con "querySelector" ??
    Ultima modifica di marmz; 06-08-2016 a 21:49

  4. #4
    Quote Originariamente inviata da marmz Visualizza il messaggio
    Bella! Questa mi piace

    [EDIT]

    Ah.. ehm .. ma come siamo messi a compatibilità con "querySelector" ??
    Il browser deve supportare la versione 3 del DOM.
    Per la retrocompatibilità devi usare jQuery.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.