2012-07-26 102 views
2

我在javascript中创建一个名称空间来循环表单并创建一个对象。被调用函数的目标是遍历所有的表单类型,并构造一个对象,该对象具有一个作为html输入名称和该值作为其当前值的键。但是,它会一直返回undefined。使用jquery.each()循环创建对象键

任何帮助,将不胜感激:

get_form_data.radio = function(container) { //will return the value 
    var data = {}; //function data object to return 
    container.find('input[type="radio"]:checked').each(function() { 

     var current_object = {}; //loop temporary object 
     var current = $(this); //current element 
     var current_key = current.attr('name'); //property category 
     var current_value = current.attr('value'); //value to update the database with 
     current_object[current_key] = current_value; //temporary object 
     console.log(current_object.length); //RETURNS UNDEFINED 
     $.extend(data, current_object); 

    }); 

    console.log(data.length); //returns undefined 
    return data; 
}​ 
+0

在我看来,这将起作用,虽然有点迂回,正如其他评论所暗示的。我们可以看到HTML吗?输入实际上是否有名称,并且在页面首次加载时是否有名字? – 2012-07-26 20:02:57

+0

你好,输入有名称,他们是静态建立与PHP。我有一个具有多种形式的父母div,并将每个表单作为容器发送到这个名称空间函数。如果我只是在循环中提醒一个单独的值或名称,它可以正常工作,但不能在循环外工作 – JonMorehouse 2012-07-26 20:23:11

回答

6

你想从.each()呼叫中获取var current_object = {};声明。 .each()函数的每次迭代都会重新声明它,并有效地将其擦除。忘记$.extend()

var data = {}; 
container.find('input[type="radio"]:checked').each(function() { 
    data[this.name] = this.value; 
}); 
return data; 

虽然从当前代码的快速浏览中未尝试。

+1

我想补充说,它可能会支付读取实际的DOM属性而不是属性,作为属性并不总是同步。更短: 'data [this.name] = this.value;' – 2012-07-26 20:05:19

+0

@ZachShipley同意。没有理由把'this'完全包装在jQuery中。 – jbabey 2012-07-26 20:09:38

+0

@ZachShipley〜的确如此。我会编辑。 – 2012-07-26 20:11:00

1

你需要指定键和索引值,像thtat:

array.each(function(index, value) { 
    alert(index + ': ' + value); 
}); 

你的情况:

get_form_data.radio = function(container) { //will return the value 
    var data = {}; //function data object to return 
    container.find('input[type="radio"]:checked').each(function(index,value) { 

     var current_object = {}; //loop temporary object 
     var current = value; //current element 
     var current_key = current.attr('name'); //property category 
     var current_value = current.attr('value'); //value to update the database with 
     current_object[current_key] = current_value; //temporary object 
     console.log(current_object.length); //RETURNS UNDEFINED 
     $.extend(data, current_object); 

    }); 

    console.log(data.length); //returns undefined 
    return data; 
}​ 
0

问题通过查看全球范围解决。看起来上面的代码工作,但我的全局命名空间令每个循环内的current = $(this)和表单数据的全局对象this.data混淆。

继承人我form_submit命名空间:

this.data = {}; 

this.property_status = function() { 

     var property_status = {}; 

     this.container.children('form').each(function() { 
      var current = $(this); 
      property_status[current.attr('data-property_id')] = get_form_data.radio(current); 
     }); 

     $.extend(this.data, property_status); 
    }; 

和get_form_data命名空间:

get_form_data.radio = function(container) {//will return the value 

    var form_data = {};//function data object to return 

    container.find('input[type="radio"]:checked').each(function() { 

     form_data[this.name] = this.value; 
    }); 


    return form_data; 
} 

优化这有什么建议?