2012-02-08 14 views
12

3番目のパートで生成されたフォームを処理する必要があります。このフォームは、チェックボックスの「複数選択」属性を提供します。しかし、入力名は同じで、PHP $ _POSTは同じキーを扱うことができません(最後のデータだけが処理されます)。同じ名前のすべての入力を選択し、名前でインデックス付けする方法

<form> 
    <input type="checkbox" name="attr1" value="1" /> 
    <input type="checkbox" name="attr1" value="2" /> 
    <input type="checkbox" name="attr1" value="3" /> 
    <input type="checkbox" name="attr1" value="4" /> 
    <input type="checkbox" name="attr2" value="xx" /> 
    <input type="checkbox" name="attr3" value="a" /> 
    <input type="checkbox" name="attr3" value="b" /> 
    <input type="checkbox" name="attr3" value="c" /> 
    <input type="checkbox" name="attr3" value="d" /> 
    <input type="text" name="attr4" value="" /> 
</form> 

私は自分の名前に「[]」は、すべてのチェックボックスの入力を解析し、同じ名前の入力のグループのみを取得し、追加したいのですが...

:ここ

は、フォームの例です

私はjQueryの処理の後に取得したい:

<form> 
    <input type="checkbox" name="attr1[]" value="1" /> 
    <input type="checkbox" name="attr1[]" value="2" /> 
    <input type="checkbox" name="attr1[]" value="3" /> 
    <input type="checkbox" name="attr1[]" value="4" /> 
    <input type="checkbox" name="attr2" value="xx" /> 
    <input type="checkbox" name="attr3[]" value="a" /> 
    <input type="checkbox" name="attr3[]" value="b" /> 
    <input type="checkbox" name="attr3[]" value="c" /> 
    <input type="checkbox" name="attr3[]" value="d" /> 
    <input type="text" name="attr4" value="" /> 
</form> 

は、同じ名前の入力のグループを特定する方法はありますか?

+0

あなたはJavaScriptでこれをやっている理由は、すべての入力を取得しますマークアップを直接変更しないでください。あなたはJSを無効にしてユーザーを疎遠にしても構わないと思いますか? –

+0

このHTMLフォームは3番目のパート(XSLで変換されたXML)によって提供され、提供されたXSLを変更したくないです(バージョン管理されており、Webサービスから取得します)。そしてあなたが正しいです、私はJSの無効化されたユーザー(公共のWebサイトではなくオンラインサービスアプリケーション)を扱っていません。 – AlterPHP

答えて

19

これは、同じ名前の別の項目が存在する場合は、各チェックボックス項目の名前に[]を追加します。

var name_map = {}; 
$("input[type=checkbox]") // for all checkboxes 
    .each(function() { // first pass, create name mapping 
     var name = this.name; 
     name_map[name] = (name_map[name]) ? name + "[]" : name; 
    }) 
    .each(function() { // replace name based on mapping 
     this.name = name_map[this.name]; 
    }); 

デモ:http://jsfiddle.net/gnfsG/

+0

悪くない! +1の簡単な解決策:) – Stefan

+0

ありがとう、それは私が必要としたものです! – AlterPHP

+0

@PéCéよろしくお願いします。 –

4

はこれを試してみてください:

var group = $('input[name="attr1"]'); 

if (group.length > 1){ 
    group.each(function() { 
     $(this).attr("name",$(this).attr("name")+"[]"); 
    }); 
} 
+0

すべての入力ではなく、同じ名前の兄弟を持つ入力のみと照合したい。私はそれが実際に可能かどうかわかりません... – AlterPHP

+0

これについて詳しく説明できますか?チェックボックスだけのように?私の答えでは、 ':checkbox'セレクタを使ってチェックボックスコントロールの名前だけを変更しています。 –

+0

名前を変更したかったのですが、同じ名前の兄弟が入力されている場合のみでした。だからあなたの解決策は完璧ではない;) – AlterPHP

0

あなたはあなたのケースで$('input[name^="attr"]')を使用する必要があります。あなたの商品はattr1attr2attr3などです。上記のセレクタはすべて一致します。

あなたは、これはあなたを与えるだろうhttp://jsfiddle.net/cT78Y/2/

$('input[name^="attr"]:checkbox').each(function(i){ 
    $(this).attr("name",$(this).attr("name")+"[]"); 
}); 

@この動作を確認することができます。

<form> 
    <input type="checkbox" name="attr1[]" value="1"> 
    <input type="checkbox" name="attr1[]" value="2"> 
    <input type="checkbox" name="attr1[]" value="3"> 
    <input type="checkbox" name="attr1[]" value="4"> 
    <input type="checkbox" name="attr2[]" value="xx"> 
    <input type="checkbox" name="attr3[]" value="a"> 
    <input type="checkbox" name="attr3[]" value="b"> 
    <input type="checkbox" name="attr3[]" value="c"> 
    <input type="checkbox" name="attr3[]" value="d"> 
    <input type="text" name="attr4" value=""> 
</form> 

希望します。

0

この非常に長いソリューションです

var array =[]; 
       $('input[type="checkbox"]').each(function(){ 
        array.push($(this).attr('name')); 
       }); 

       var sorted_arr = array.sort(); // You can define the comparing function here. 
       // JS by default uses a crappy string compare. 
       var results = []; 
       for (var i = 0; i < array.length - 1; i++) { 
        if (sorted_arr[i + 1] == sorted_arr[i]) { 
         results.push(sorted_arr[i]); 
        } 
       } 
       var names = []; 
       names = jQuery.unique(results); 
       $.each(names ,function(key,value){ 
        $('input[name ="'+value+'"]').attr("name",value+"[]"); 
       }); 
0
$("input[name=attr\\[\\]]"); 

は名前= attr[]

関連する問題