2012-02-08 16 views
12

Devo gestire un modulo generato da una terza parte. Questo modulo fornisce alcuni attributi di "selezione multipla". Ma i nomi di input sono identici e PHP $ _POST non può gestire chiavi identiche (vengono gestiti solo gli ultimi dati).Come selezionare tutti gli ingressi con lo stesso nome e indicizzarli con il loro nome

Ecco un esempio della forma:

<form> 
    <input type="checkbox" name="attr1" value="1" /> 
    <input type="checkbox" name="attr1" value="2" /> 
    <input type="checkbox" name="attr1" value="3" /> 
    <input type="checkbox" name="attr1" value="4" /> 
    <input type="checkbox" name="attr2" value="xx" /> 
    <input type="checkbox" name="attr3" value="a" /> 
    <input type="checkbox" name="attr3" value="b" /> 
    <input type="checkbox" name="attr3" value="c" /> 
    <input type="checkbox" name="attr3" value="d" /> 
    <input type="text" name="attr4" value="" /> 
</form> 

mi piacerebbe analizzare tutti gli ingressi di caselle di controllo, ottenere solo gruppo di ingressi stesso nome e aggiungere "[]" per il loro nome ...

Quello che voglio ottenere dopo l'elaborazione jQuery:

<form> 
    <input type="checkbox" name="attr1[]" value="1" /> 
    <input type="checkbox" name="attr1[]" value="2" /> 
    <input type="checkbox" name="attr1[]" value="3" /> 
    <input type="checkbox" name="attr1[]" value="4" /> 
    <input type="checkbox" name="attr2" value="xx" /> 
    <input type="checkbox" name="attr3[]" value="a" /> 
    <input type="checkbox" name="attr3[]" value="b" /> 
    <input type="checkbox" name="attr3[]" value="c" /> 
    <input type="checkbox" name="attr3[]" value="d" /> 
    <input type="text" name="attr4" value="" /> 
</form> 

c'è un modo per identificare un gruppo di ingressi con lo stesso nome?

+0

C'è una ragione si sta facendo questo con JavaScript e non modificare direttamente il markup? Immagino che non ti dispiaccia alienare gli utenti con JS disabilitato, corretto? –

+0

Questo modulo HTML è fornito da una terza parte (XML trasformato da XSL) e non voglio modificare l'XSL fornito (è versione e l'ho ricevuto da un webservice). E hai ragione, non mi occupo di utenti disabili di JS (non è un sito Web pubblico ma un'applicazione di servizio online). – AlterPHP

risposta

19

Questo aggiungerà [] al nome di ogni elemento della casella di controllo se esiste un altro elemento con lo stesso nome.

var name_map = {}; 
$("input[type=checkbox]") // for all checkboxes 
    .each(function() { // first pass, create name mapping 
     var name = this.name; 
     name_map[name] = (name_map[name]) ? name + "[]" : name; 
    }) 
    .each(function() { // replace name based on mapping 
     this.name = name_map[this.name]; 
    }); 

Demo: http://jsfiddle.net/gnfsG/

+0

Non male! +1 per una soluzione semplice :) – Stefan

+0

Grazie, è esattamente ciò di cui avevo bisogno! – AlterPHP

+0

@ PéCé Prego. –

4

Prova questa:

var group = $('input[name="attr1"]'); 

if (group.length > 1){ 
    group.each(function() { 
     $(this).attr("name",$(this).attr("name")+"[]"); 
    }); 
} 
+0

Voglio abbinare solo gli ingressi che hanno fratelli con lo stesso nome, non tutti gli ingressi. Non so se sia effettivamente possibile ... – AlterPHP

+0

Puoi spiegarlo in dettaglio? Come solo la casella di controllo? Nella mia risposta sto cambiando il nome di solo controllo casella di controllo usando il selettore ': checkbox'. –

+0

Volevo cambiare nome, SOLO se l'input ha un fratello con lo stesso nome. Ecco perché la tua soluzione non è perfetta;) – AlterPHP

0

Sarà necessario utilizzare $('input[name^="attr"]') nel tuo caso. Come i tuoi articoli ha attr1, attr2, attr3 ecc. Il selettore di cui sopra corrisponderà a tutti.

È possibile controllare questo in azione @http://jsfiddle.net/cT78Y/2/

$('input[name^="attr"]:checkbox').each(function(i){ 
    $(this).attr("name",$(this).attr("name")+"[]"); 
}); 

Questo vi darà.

<form> 
    <input type="checkbox" name="attr1[]" value="1"> 
    <input type="checkbox" name="attr1[]" value="2"> 
    <input type="checkbox" name="attr1[]" value="3"> 
    <input type="checkbox" name="attr1[]" value="4"> 
    <input type="checkbox" name="attr2[]" value="xx"> 
    <input type="checkbox" name="attr3[]" value="a"> 
    <input type="checkbox" name="attr3[]" value="b"> 
    <input type="checkbox" name="attr3[]" value="c"> 
    <input type="checkbox" name="attr3[]" value="d"> 
    <input type="text" name="attr4" value=""> 
</form> 

Spero che questo ti aiuti.

0

Questo è molto lungo soluzione

var array =[]; 
       $('input[type="checkbox"]').each(function(){ 
        array.push($(this).attr('name')); 
       }); 

       var sorted_arr = array.sort(); // You can define the comparing function here. 
       // JS by default uses a crappy string compare. 
       var results = []; 
       for (var i = 0; i < array.length - 1; i++) { 
        if (sorted_arr[i + 1] == sorted_arr[i]) { 
         results.push(sorted_arr[i]); 
        } 
       } 
       var names = []; 
       names = jQuery.unique(results); 
       $.each(names ,function(key,value){ 
        $('input[name ="'+value+'"]').attr("name",value+"[]"); 
       }); 
0
$("input[name=attr\\[\\]]"); 

ottenere tutti gli input dove name = attr[]

Problemi correlati