2012-07-26 145 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; 
} 

優化這有什麼建議?