jQueryでシリアル化されたフォームデータを変更するにはどうすればよいですか?


82

フォームをAJAXで送信しようとしているので、データをserialize()する必要があります。しかし、私は使用していてfckEditor、jQueryはそれを処理する方法を知らないので、シリアル化後、手動で値を変更しようとしていますが、今のところ運がありません...アイデアはありません

if(content_val!=""){
    var values = $("#frmblog").serialize();
    values.content = content_val; //content_val is the manually fetched data which I am trying to insert into the serialized content.
    alert(content_val); alert(values);
}

シリアル化する前に挿入してみませんか?
Adam Arold 2011

問題は、セリリゼーションプロセス中に「content」キーにいくつかのデフォルト値が設定されているため、新しい値を添付するだけではなく、すでに含まれている値を更新する必要があることです
Bluemagica 2011

ああ、それは物事を変える。私の更新された答えを参照してください。
TJ Crowder 2011

回答:


155

serializeフォームフィールドを含むURLエンコードされた文字列を返します。追加する必要がある場合は、標準のURLエンコードされた文字列ルールを使用して追加します。例:

var values = $("#frmblog").serialize();
values += "&content=" + encodeURIComponent(content_val);

(上記はvaluesserialize呼び出し後に常に1つの値があることを前提としています。それが必ずしも当てはまらない場合は、追加する前に、空&かどうかに基づいて使用するかどうかを決定valuesしてください。)

または、必要に応じて、を使用serializeArrayして配列に追加し、を使用jQuery.paramして結果をクエリ文字列に変換することもできますが、これは長い道のりのようです。

// You can also do this, but it seems a long way 'round
var values = $("#frmblog").serializeArray();
values.push({
    name: "content",
    value: content_val
});
values = jQuery.param(values);

更新:後で追加されたコメントであなたは言った:

問題は、セリリゼーションプロセス中に「content」キーにいくつかのデフォルト値が設定されているため、新しい値を添付するだけではなく、すでに含まれている値を更新する必要があることです。」

それは物事を変えます。contentURLエンコードされた文字列内を探すのは面倒なので、配列を使用します。

var values, index;

// Get the parameters as an array
values = $("#frmblog").serializeArray();

// Find and replace `content` if there
for (index = 0; index < values.length; ++index) {
    if (values[index].name == "content") {
        values[index].value = content_val;
        break;
    }
}

// Add it if it wasn't there
if (index >= values.length) {
    values.push({
        name: "content",
        value: content_val
    });
}

// Convert to URL-encoded string
values = jQuery.param(values);

これを再利用可能な関数にしたいと思うかもしれません。


4

これは@TJの回答に基づいた完全なjqueryプラグインです。あなたは呼び出すことができます

$('form#myForm').awesomeFormSerializer({
    foo: 'bar',
})

これは、パラメータ 'foo'を値 'bar'(またはオブジェクトに追加する他のパラメータ)に置き換えるか追加します

jQueryプラグイン:

// Not builtin http://stackoverflow.com/a/5075798/2832282
(function ( $ ) {
    // Pass an object of key/vals to override
    $.fn.awesomeFormSerializer = function(overrides) {
        // Get the parameters as an array
        var newParams = this.serializeArray();

        for(var key in overrides) {
            var newVal = overrides[key]
            // Find and replace `content` if there
            for (index = 0; index < newParams.length; ++index) {
                if (newParams[index].name == key) {
                    newParams[index].value = newVal;
                    break;
                }
            }

            // Add it if it wasn't there
            if (index >= newParams.length) {
                newParams.push({
                    name: key,
                    value: newVal
                });
            }
        }

        // Convert to URL-encoded string
        return $.param(newParams);
    }
}( jQuery ));

3

ES15で今。代わりに、現在送信されている値(最短値)を編集するためにこれを使用できます。

var values = $("#frmblog").serializeArray();
values.find(input => input.name == 'content').value = content_val;
console.log(values);

またはネイティブ関数

var values = $("#frmblog").serializeArray();
values.find(function(input) { 
    return input.name == 'content';
}).value = content_val;
console.log(values);

1

それが私のために働いた次の機能を使用してください

function(elementName,newVal)
{
    var postData = $("#formID").serialize();

var res = postData.split("&");
var str = "";

for(i=0;i<res.length;i++)
  {
    if(elementName == res[i].split("=")[0])
      {
        str += elementName + "=" + newVal+ "&";
      }
      else
      {
        str += res[i] + "&";
      }
  }
return str;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.