Jquery отримати поле масиву вводу


75

Я знайшов подібні запитання тут, але нічого для мене не працює.

мають такі входи:

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

намагаються отримати ці поля, як:

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

але мають порожні результати :(

як отримати всі поля? Я можу отримати це лише як$('input[name="pages_title[1]"]')



1
Ах, неправильно прочитане питання. Закрити голосування неправильно ... потрібно використовувати починається з селектора.
epascarello

@epascarello - як би почати з допомоги, щоб отримати їх усіх?
Рафаель Герсковічі

Я створив простий плагін, який генеруватиме рекурсивно подання об’єкта JSON цих "багатовимірних полів введення": codepen.io/alexweissman/pen/MyWZdN
alexw

Відповіді:



32

це зазвичай працює на прапорцях та перемикачах ... але, кожна назва повинна бути однаковою.

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

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

що "передбачається", щоб отримати всі поля у значеннях, розділених комами. ніколи не пробував із текстовими полями, тому не можу це гарантувати.

як прокоментував @ John: переглядати їх. $('input[name="pages_title[]"]').each(function() { var aValue = $(this).val(); });

РЕДАГУВАТИ: Не завжди вам потрібно просто відповісти на запитання OP, іноді вам потрібно навчити їх кращим методам. (вибачте, якщо це звучить зарозуміло)

КОМЕНТАР: визначення вхідних даних як

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

розбиває масив, кожен вхід має унікальну назву, тому це вже не масив.


3
Щоб переглядати кожну з них, використовуйте$('input[name="pages_title[]"]').each(function() { var aValue = $(this).val(); });
Luke Shaheen

1
вибачте, але це не спрацює, як я описав у своєму питанні. Це буде працювати, лише якщо у мене є назви полів, такі як pages_title [], але не pages_title [1] pages_title [2] pages_title [3]
abiku

3
@Dementic, але це цілком законно мати це. Ви можете мати більше розмірів name = "page_tile [1] [name]" та name = "page_title [2] [name]", тому вам потрібно підтримати [1] тощо
Dss

2
@Dss - це законно, але присвоєння імен представляє масив, тоді [1]буде представляти інший масив[2]
Рафаель Герсковічі

3
-1 Це не тільки законно, але це абсолютно необхідне, коли у мене є змінна кількість полів, пов’язаних із масивом полів, і жодної гарантії порядку чи включення кожного з них. Я повинен мати можливість надати унікальні посвідчення особи, на які я можу розраховувати після подання.
oucil

25

Використовуючи метод map, ми можемо отримати вхідні значення, які зберігаються в масиві.

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

13

Вам потрібно використовувати старти з селектора

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

Але кращим рішенням є додавання класу до елементів та посилання на клас. Причиною цього є швидший пошук.


і що тоді трапляється у випадку name="pages_titles"? також, навіщо використовувати клас, коли його clear the nameповинен бути однаковим? додаткова націнка для розваги?
Рафаель Герсковічі

2
Ні, це не весело ... тому що ^=це набагато повільніше, ніж селектор класу. Він повинен розібрати рядки та перевірити збіг. І я не маю уявлення, що ви маєте на увазі зname="pages_titles"
epascarello

1
відповідно до вашої відповіді, починається з, також буде ловити pages_titles(замість pages_title). я згоден з тим, що він повинен звузити його вибір до чогось подібного, #divId[name='pages_title']але навіщо додавати клас? різниця була б настільки маленькою, що її не помічають.
Рафаель Герсковічі

ще одна річ (вибачте за вибір ..), оскільки ajax не згадувався, ця форма може надсилатися регулярно, а щодо вашого add classрішення він не отримає результатів на стороні сервера.
Рафаель Герсковічі

1
Ця відповідь цікава і навіть при глибших думках щодо споживання регулярного виразу, наприклад, для плагіна було б кращим вибором піти з класами - набагато швидше, погодитися з epascarello.
Артур Кушман,

13

Помістіть ім'я вводу між одинарними лапками, щоб дужки []розглядались як рядок

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

9

Ви можете дати введеним текстовим полям назви класів, наприклад:

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

і повторюйте так:

$('input.pages_title').each(function() {
    alert($(this).val()); 
});

Це чудова відповідь. Мені це дуже допомагає.
Суміт Кумар Гупта

7

Я думаю, найкращий спосіб - це використовувати форму Propper та використовувати 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.a-form').serializeArray(),
        success: function(response){
            ...
        }
    });
});
</script>

Ці значення будуть доступні в PHP як $_POST['field'][INDEX].


3

Найчастіше використовується це:

$("input[name='varname[]']").map( function(key){
    console.log(key+':'+$(this).val());
})

Нічого, що ви отримуєте ключ розташування масиву та значення.


2

Ви можете уникнути квадратних дужок за допомогою подвійних зворотних скісних рисок, наприклад:

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


2

Ви можете використовувати селектор вмісту:

[ім'я * = ”значення”] : вибирає елементи, що мають вказаний атрибут зі значенням, що містить заданий підрядок.

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

1

Для того, щоб вибрати елемент за атрибутом, що має певну характеристику, ви можете створити новий селектор, як у наступному фрагменті, використовуючи шаблон регулярного виразу. Використання регулярного виразу має на меті максимально гнучко налаштувати новий селектор:

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[]">

Інше рішення може базуватися на:

  • [ім’я ^ = ”значення”] : вибирає елементи, що мають вказаний атрибут, значення якого починається саме з заданого рядка.

  • .filter () : зменшити набір відповідних елементів до тих, що відповідають селектору або проходять перевірку функції.

  • шаблон регулярного виразу

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[]">


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.