2012-03-25 4 views
6

Может кто-нибудь, пожалуйста, дайте мне знать, как получить значения из нескольких полей ввода?Получить массив значений из нескольких входов с помощью jQuery

У меня есть список с несколькими входами, как это:

<li> 
<label>Additional Title: </label><input type='text' name='additionaltitlename' ... /> 
</li> 
<li> 
<label>Additional Title: </label><input type='text' name='additionaltitlename' ... /> 
</li> 

У меня есть решение в Javascript (по форме представить):

... 
var extratitles = document.getElementsByName('additionaltitlename'); 
var str = ''; 
     for (var i = 0; i < extratitles.length; i++) { 
     str = str + '|' + extratitles.item(i).value; 
    } 
} 

Как сделать то же самое в JQuery? родной serialize функция

ответ

16

Недопустимо иметь два входа с одинаковым именем. Если вы хотите сделать это, вы можете использовать <input name="titles[]">

Вы можете попробовать это:

<input name="titles[]"> 
<input name="titles[]"> 
​<button>submit</button>​​​​​​​​​​​​​​​​​​​​​​​ 

С этим JQuery

// click handler 
function onClick(event) { 
    var titles = $('input[name^=titles]').map(function(idx, elem) { 
    return $(elem).val(); 
    }).get(); 

    console.log(titles); 
    event.preventDefault(); 
} 

// attach button click listener on dom ready 
$(function() { 
    $('button').click(onClick); 
}); 

See it working here on jsFiddle

EDIT

Этот ответ дает вы заголовки в массиве вместо строки usin g a | разделитель. Лично я считаю, что это намного более удобно.

Если вы просто заполните форму и вы хотите поддерживать несколько значений, используйте метод .serialize, как описано в другом ответе

+0

Почему бы не использовать 'this.value'? Действительно ли необходимо использовать _jQuery_ для каждой простой операции? –

+0

@IulianOnofrei, [скажите мне, если это необходимо] (https://github.com/jquery/jquery/blob/master/src/attributes/val.js#L10-L69). Точка использования lib, как jQuery, заключается в: a) облегчении беспокойства по большинству угловых случаев и b) обеспечении последовательного, интуитивного api. Да, для элементов INPUT вы можете использовать 'this.value' довольно надежно, но это изменяется для таких вещей, как SELECT. В любом случае jQuery не волнует и дает вам интуитивный метод '.val' для работы в любом сценарии. –

+0

@IulianOnofrei, кроме того, я дал ответ, который использует jQuery и написан с использованием иконов jQuery *, потому что * этот вопрос был помечен 'jquery'. Если бы это был вопрос ванильного JavaScript, я бы ответил на него совершенно по-другому. –

2

Использовать JQuery в:

var data = $('input[name="additionaltitlename"]').serialize(); 

docs

Метод .serialize() создает текстовую строку в стандартный URL-кодированных обозначений. Он работает с объектом jQuery, представляющим набор элементов формы.

+0

Это на самом деле не поставить названия в работоспособной форме, если он хочет сделать дополнительные обработка с помощью javascript –

+0

@macek. он написал, что хочет передать значения с помощью ajax-запроса. 'serialize()' является нативным решением. – gdoron

0

Средства:

str = ''; 
$("input[type='text']").each(function() { 
str = str + '|' + $(this).val(); 
}); 

или

str = ''; 
$("input[name='additionaltitlename']").each(function() { 
str = str + '|' + $(this).val(); 
}); 

?

0

В дополнение к ответам @ gdoron или @ macek, которые, вероятно, подходят, я хотел бы добавить, что все, что не так с кодом, который вы опубликовали, это то, что у вас есть один } слишком много. Это работает (хотя она по-прежнему имеет место для совершенствования):

$('#getpreviewbutton').click(function(){ 

    var extratitles = document.getElementsByName('additionaltitlename'); 
    var str = ''; 
      for (var i = 0; i < extratitles.length; i++) { 
      str = str + '|' + extratitles.item(i).value; 
      } 

});​ 

См: http://jsfiddle.net/8XJcc/

Я не знаю, какой браузер вы используете, но с использованием н как Firebug или инструментов Chrome Dev может быть очень удобно чтобы обнаружить простые ошибки, подобные этому. См. this reference для Chrome или this one для Firefox. Даже IE имеет один - просто нажмите F12.

Смежные вопросы