2009-08-16 11 views
1

私は現在、連絡フォームを送信するためにajaxリクエストでform.serialize()を使用していますが、私の問題はform.serialize()が "ボタン".serialize()と.serializeElements()との混同

例形式:

name (input type = text) 
email (input type = text) 
body (text area) 
submit (input type = button) 
clear (input type = reset) 

私は唯一のタイプBUTTON、RESETまたはパスワードがされていないフォーム要素をシリアル化したいと思います。

これには簡単な解決策がありますか?

+0

フォームのHTMLコードとserialize()コールの実際の結果をコピー(またはリンク)できますか? – Zed

答えて

3

ボタン入力のnameパラメータを省略すると、ボタンはシリアル化されないことが予想されます。私の期待は、シリアライズは、フォームが提出時にシリアル化される方法を模倣し、名前のない入力はフォームパラメータとして送信されないという事実に基づいています。私はこれを示すような単純なテストをコード化しました。 [Examine]ボタンをクリックすると、 "text = bob"と表示されます。チェックボックスをオンにすると、 "cb2 = on & text = bob"と表示されます。送信ボタンの値は決して含まれません。

<script type="text/javascript"> 
    $(document).observe('dom:loaded', function() { 
     $('btn').observe('click', function() { 
      alert($('form').serialize()); 
      return false; 
     }); 
    }); 
</script> 
</head> 
<body> 
<form id='form'> 
Checkbox 1 <input type="checkbox" id="cb1" name="cb1" /> 
Checkbox 2 <input type="checkbox" id="cb2" name="cb2" /><br /> 
<input type='text' name='text' value='bob' /> 
<input type="submit" id="btn" value="Examine" /> 
</form> 
+0

うん、それはそれです!デフォルトでは "name"パラメータフォームのフィールドは無視されます – SkyLar

+0

あなたの問題を解決したのでこれを答えとして受け入れることができます。それは、これが解決策であることを他の人に知らせる(誰があなたのコメントを読まない)かを知ることになります。 – tvanfosson

0

それは野生の推測のビットだし、おそらく唯一の解決策が、私は考えている一つの方法は次のとおりです。これらを除外し$('YOUR_FORM_ID').getElements()

  • を使用して、フォームのすべての要素を識別し

    • あなたは今、あなたはあなたが残しておきたいものがあることEnumerable.reject
    • を使用して、維持する必要はありません、あなたはコードではForm.serializeElements

    を使用することができるはずなので、これを行う可能性があるようmething:

    Form.serializeElements(
        // We need the list of all elements 
        // that are not rejected by the inner function 
        $('YOUR_FORM_ID').getElements().reject(function (formElement) { 
         // this function must return : 
         // - true for an element that you want to keep 
         // - false for an element you don't want to keep (you have to return false for your buttons, for instance) 
         if (formElement.type == 'radio' || formElement.type == 'checkbox') { 
          return false; 
         } else { 
          return true; 
         } 
        }) 
    ); 
    

    そして(もちろん、あなたが変数にキャプチャしたいと思うでしょう、)出力、このように気にいらないです:

    "lol=15&dt=0" 
    

    および/またはあなたクエリ文字列ではなく、ハッシュ/オブジェクトを取得する場合は、Form.serializeElementsという2番目のオプションのパラメータを使用できます。


    注:この例では、私はあなたが指定した要素を除外していない:私は、テストに使用されるフォームはあなたが求めていた正確に何を持っていなかったので、私はいくつかの他のものを除外。 ..

    したがって、関数内で条件を適合させる必要があります。


    このヘルプが必要です。楽しむ !

  • +0

    私はプロトタイプの人ではありませんが、CSS3セレクタを使用できるように見えます。 http://overfloweb.com/blog/index.php/archives/11 –