6

フォームをループしてオブジェクトを作成するために、javascript で名前空間を作成しています。呼び出されたときの関数の目的は、特定のフォーム タイプのすべてをループし、html 入力の名前であるキーと現在の値としての値を持つオブジェクトを構築することです。ただし、未定義を返し続けます。

どんな助けでも大歓迎です:

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;
}​
4

3 に答える 3

10

呼び出しvar current_object = {};から宣言を取得したい。.each()関数の反復ごとに.each()再宣言され、効果的に消去されます。そして忘れてください$.extend()

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

ただし、現在のコードの簡単な概要からテストされていません。

于 2012-07-26T19:59:37.413 に答える
1

次のように、キーとインデックス値を指定する必要があります。

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;
}​
于 2012-07-26T19:57:49.487 に答える
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;
}

これを最適化するための提案はありますか?

于 2012-07-27T04:07:49.473 に答える