2011-01-31 13 views
0

私は複数のdiv要素を持ち、それぞれにフォームフィールド(テキストの入力と選択)のセットを持っています。jQuery - reproduce serialize()

name属性の代わりに、これらのフィールドには、「name」と同じ値を持つrel属性があります。

これらのフィールドでjQueryのシリアライズ(http://api.jquery.com/serialize/)の動作を再現するにはどうすればよいですか?

HTMLは次のようになりますように、

<div> 
    <input type="text" rel="title" value="bla" /> 
    <input type="text" rel="count" value="5" /> 
    <select rel="page"> 
    <option value="home">home</option> 
    <option value="about" selected="selected">about</option> 
    <option value="404">404</option> 
    </select> 
    <input type="hidden" name="serialize_above_fields[]" value="" /> 
</div> 

<div> 
    <input type="text" rel="title" value="bla" /> 
    <input type="text" rel="count" value="5" /> 
    <select rel="page"> 
    <option value="home">home</option> 
    <option value="about" selected="selected">about</option> 
    <option value="404">404</option> 
    </select> 
    <input type="hidden" name="serialize_above_fields[]" value="" /> 
</div> 

... 

基本的に私はそれが存在するのdiv内のフィールドのすべての値を非表示入力フィールドを生成(及びキーとして相対者を使用)したい:

<input type="hidden" name="serialize_above_fields[]" value="title=bla&count=5&page=check2&page=about" /> 
+0

すぐにオプションの 'name'属性を与えていますか? –

+0

名前を追加すると$ _GET、yesになります:) – Alex

答えて

2

jQueryのmapユーティリティを使用すると、それを簡単に行うことができます。

$('div').each(function() { 
    var serializedData = $(this).find(':text, select').map(function(i, el) { 
    return $(el).attr('rel') + '=' + $(el).val(); 
    }).get(); 

    $(this).find('input[type=hidden]').val(serializedData.join('&')); 
}); 
+0

それは動作します、ありがとう! – Alex

+0

スリック。いい答えだ。 – Dutchie432

2

ご入力要素がすべて<form></form>内であれば、あなたがこのようなものを使用して、フォームをシリアル化しようとすることができます:

$.fn.serializeObject = function() 
{ 
    var o = {}; 
    var a = this.serializeArray(); 
    $.each(a, function() { 
     if (o[this.rel]) { 
      if (!o[this.rel].push) { 
       o[this.rel] = [o[this.rel]]; 
      } 
      o[this.rel].push(this.value || ''); 
     } else { 
      o[this.rel] = this.value || ''; 
     } 
    }); 
    return o; 
}; 
+0

しかし、私はすでにフォームを上記のすべてのHTMLを含んでいるので、それらを 'form'の中にラップすることはできません – Alex

+0

次にdiv、 divをシリアル化しますか? 100%ではありませんが、これはjQueryの前にシリアライズするために使っていたものです。 – Dutchie432