2013-10-22 17 views
54

Ho trovato domande simili qui ma non funziona per me.Jquery ottiene campo matrice di input

hanno ingressi come:

<input type="text" value="2" name="pages_title[1]"> 
<input type="text" value="1" name="pages_title[2]"> 

cercando di ottenere questi campi come:

$('input[name="pages_title[]"]') 

ma sono risultati vuoti :(

come ottenere tutti i campi posso solo ottenere? come $('input[name="pages_title[1]"]')

+0

possibile duplicato [selettore jQuery per ingressi con parentesi quadre name] (http: // StackOverflow .com/questions/2364982/jquery-selector-for-inputs-with-parentesi quadre-in-the-name-attributo) – epascarello

+1

Ah, domanda errata. Lo stretto voto è sbagliato ... la necessità di usare inizia con il selettore. – epascarello

+0

@epascarello - come iniziare con l'aiuto per ottenere tutti loro? – Dementic

risposta

25

questo solito w ork su caselle di controllo e pulsanti di opzione ... ma, ogni nome dovrebbe essere lo stesso.

<input type="text" value="2" name="pages_title[]"> 
<input type="text" value="1" name="pages_title[]"> 

var x = $('input[name="pages_title[]"]').val(); 

che si "suppone" per farti tutti i campi di valori separati da virgola. mai provato con caselle di testo, quindi non posso garantirlo.

come @John ha commentato: per iterare su di loro. $('input[name="pages_title[]"]').each(function() { var aValue = $(this).val(); });

MODIFICA: Non sempre è necessario solo rispondere alle domande OP, a volte è necessario insegnare loro metodi migliori. (scusate se questo suona Arrogante)

COMMENTO: ingressi definiscono come

<input type="text" value="1" name="pages_title[1]"> 
<input type="text" value="2" name="pages_title[2]"> 

sta rompendo la matrice, ciascun ingresso ha un nome univoco, Perciò, non è più un array.

+2

Per eseguire l'iterazione su ciascuno di essi, utilizzare '$ ('input [nome = "pages_title []"] '). each (function() {var aValue = $ (this) .val();}); ' –

+1

scusa ma questo non funzionerà, come ho descritto nella mia domanda. Funzionerà solo se ho nomi di campi come pages_title [] ma non pages_title [1] pages_title [2] pages_title [3] – abiku

+3

non dovresti avere '[1]', '[2]', '[3]', questo è il punto. – Dementic

11

È necessario utilizzare il starts with selector

var elems = $("[name^='pages_title']"); 

Ma una soluzione migliore è quella di aggiungere una classe agli elementi e riferimento alla classe. La ragione per cui è una ricerca più veloce.

+0

e poi cosa succede nel caso di 'name =" pages_titles "'? inoltre, perché usare una classe, quando è chiaro il 'nome' dovrebbe essere la stessa? markup extra per divertimento? – Dementic

+2

No, non è divertente ... perché '^ =' è molto più lento di un selettore di classe. Deve analizzare stringhe e verificare una corrispondenza. E non ho idea di cosa intendi con 'name =" pages_titles "' – epascarello

+1

in base alla tua risposta, inizia con, prenderà anche 'pages_titles' (invece di' pages_title'). Sono d'accordo che dovrebbe restringere il selettore a qualcosa come '#divId [name = 'pages_title']' ma perché aggiungere una classe? la differenza sarebbe così piccola, non si noterà. – Dementic

73

Utilizzare il starts with selector

$('input[name^="pages_title"]').each(function() { 
    alert($(this).val()); 
}); 

jsfiddle example

Nota: In accordo con @epascarello che la soluzione migliore è quella di aggiungere una classe agli elementi e di riferimento quella classe.

+0

per favore vedi i miei commenti risposta @espascarello. – Dementic

+0

funziona perfettamente – sajushko

6

Potete dare ai vostri nomi caselle di testo di classe di ingresso, in questo modo:

<input type="text" value="2" name="pages_title[1]" class="pages_title"> 
<input type="text" value="1" name="pages_title[2]" class="pages_title"> 

e iterare in questo modo:

$('input.pages_title').each(function() { 
    alert($(this).val()); 
}); 
9
var multi_members=""; 
$("input[name='bayi[]']:checked:enabled").each(function() { 
    multi_members=$(this).val()+","+multi_members; 
}); 
5

Penso che il modo migliore, è quello di utilizzare un modulo Propper e per utilizzare jQuery.serializeArray.

<!-- a form with any type of input --> 
<form class="a-form"> 
    <select name="field[something]">...</select> 
    <input type="checkbox" name="field[somethingelse]" ... /> 
    <input type="radio" name="field[somethingelse2]" ... /> 
    <input type="text" name="field[somethingelse3]" ... /> 
</form> 

<!-- sample ajax call --> 
<script> 
$(document).ready(function(){ 
    $.ajax({ 
     url: 'submit.php', 
     type: 'post', 
     data: $('form[name="a-form"]).serializeArray(), 
     success: function(response){ 
      ... 
     } 
    }); 
}); 
</script> 

I valori saranno disponibili in PHP come $_POST['field'][INDEX].

1

si può sfuggire le parentesi quadre con doppi backslash come questo:

$('input[name="pages_title\\[\\]"]')

8

uso mappa metodo possiamo ottenere valori di input che memorizzati nella matrice.

var values = $("input[name='pages_title[]']").map(function(){return $(this).val();}).get(); 
+0

Consiglio eccellente, grazie mille! – ImShogun

1

È possibile utilizzare il selettore contenere:

[name*=”value”]: seleziona gli elementi che hanno l'attributo specificato con un valore che contiene una determinata stringa.

$(document).on("keyup", "input[name*='pages_title']", function() { 
    alert($(this).val()); 
}); 
1

Per selezionare un elemento da attributo avente una caratteristica specifica è possibile creare un nuovo selettore come nel seguente frammento usando un'espressione regolare. L'uso di regex è destinato a rendere flessibile il nuovo selettore per quanto possibile:

jQuery.extend(jQuery.expr[':'], { 
 
    nameMatch: function (ele, idx, selector) { 
 
     var rpStr = (selector[3] || '').replace(/^\/(.*)\/$/, '$1'); 
 
     return (new RegExp(rpStr)).test(ele.name); 
 
    } 
 
}); 
 

 

 
// 
 
// use of selector 
 
// 
 
$('input:nameMatch(/^pages_title\\[\\d\\]$/)').each(function(idx, ele) { 
 
    console.log(ele.outerHTML); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
<input type="text" value="2" name="pages_title[1]"> 
 
<input type="text" value="1" name="pages_title[2]"> 
 
<input type="text" value="1" name="pages_title[]">

Un'altra soluzione può essere basata su:

  • [name^=”value”]: seleziona elementi che hanno l'attributo specificato con un valore che inizia esattamente con una determinata stringa.

  • .filter(): ridurre il set di elementi corrispondenti a quelli corrispondenti al selettore o superare il test della funzione.

  • regex

var selectedEle = $(':input[name^="pages_title"]').filter(function(idx, ele) { 
 
    // 
 
    // test if the name attribute matches the pattern..... 
 
    // 
 
    return /^pages_title\[\d\]$/.test(ele.name); 
 
}); 
 
selectedEle.each(function(idx, ele) { 
 
    console.log(ele.outerHTML); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
<input type="text" value="2" name="pages_title[1]"> 
 
<input type="text" value="1" name="pages_title[2]"> 
 
<input type="text" value="1" name="pages_title[]">

Problemi correlati