Javascript 循环遍历一组HTML表单元素以获取对象中的当前值
从如下所示的HTML设置中获取:Javascript 循环遍历一组HTML表单元素以获取对象中的当前值,javascript,jquery,html,backbone.js,underscore.js,Javascript,Jquery,Html,Backbone.js,Underscore.js,从如下所示的HTML设置中获取: <nav data-filters class=""> <input type="radio" name="type" value="company" checked>Company <input type="radio" name="type" value="product">Product <input type="radio" name="type" valu
<nav data-filters class="">
<input type="radio" name="type" value="company" checked>Company
<input type="radio" name="type" value="product">Product
<input type="radio" name="type" value="service">Service
<select name="category_1" multiple>
<option value="a" selected>a</option>
<option value="b">b</option>
<option value="c" selected>c</option>
</select>
<select name="category_2" multiple>
<option value="a" selected>a</option>
<option value="b" selected>b</option>
<option value="c">c</option>
</select>
<input type="radio" name="startswith" value="a" checked>a
<input type="radio" name="startswith" value="b">b
<input type="radio" name="startswith" value="c">c
<input type="radio" name="startswith" value="num">#
<input name="keyword" type="text">
</nav>
这是我当前的设置(注意:这。$el只是指$(nav)):
这似乎容易出错,我认为这不是最好的方法。
我该怎么做呢
关于此问题背景的注释:
我正在用主干网建立一个小目录。这发生在
过滤器视图中,其中当前条件被转换为对象,该对象将作为fetch()函数的数据传递给集合。您可以使用$.serializeArray
方法()将表单序列化为名称和值的数组。然后,您只需将结果转换为所需的形式:
var inputs = $('nav :input').serializeArray();
var obj = {};
_.each(inputs, function(val){
if(obj[val.name]){
obj[val.name].values.push(val.value);
}else{
obj[val.name] = {values: [val.value]};
}
});
JSBin演示:您不需要
,而且
可能是更大的
的一部分,因此结构可能不实用。您可以这样说:$('nav:input')。serializeArray()
不过:您是对的,谢谢您指出这一点。我已经相应地更新了我的答案。如果您不想预先声明obj
,也可以var obj=(输入)。reduce(函数(h,val){…},{})
serializeArray
是最主要的一点,\每个与\相比,reduce
并不十分重要。
var obj = {};
this.$el.find('[name]').each(function(i, input) {
var val = (function() {
if ( input.type == "radio" || input.type == "checkbox" )
return $(input).filter(':checked').val();
return $(input).val()
})(),
name = input.name;
if (val) {
obj[name] = {
values: _.flatten([val]) // Always return an array
}
}
});
return obj;
var inputs = $('nav :input').serializeArray();
var obj = {};
_.each(inputs, function(val){
if(obj[val.name]){
obj[val.name].values.push(val.value);
}else{
obj[val.name] = {values: [val.value]};
}
});