2010-12-17 2 views
4

簡単な質問のようです。私はjQueryの魔法のビットを追加しました:これが配置されるとダブル提出を防ぐためにクリックすると、Drupalフォーム送信ボタンを無効にする方法はありますか?

$("#edit-save").click(function(event) { 
    $(this).attr("disabled", "true"); 
}); 

しかし、私のフォームは呼び出されませんハンドラを提出します。

これはhook_menuで定義されている私自身のパス上のカスタムフォームです:フォームで

$items['my_form'] = array(
    'title' => 'My form', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('mymod_myform'), 
    'type' => MENU_CALLBACK, 
); 

、私は送信ボタンとキャンセルボタンがあります。

$form['cancel'] = array(
    '#type' => 'submit', 
    '#value' => t('Cancel'), 
); 

$form['save'] = array(
    '#type' => 'submit', 
    '#value' => t('Save'), 
); 

と私は自分自身を定義しますハンドラを提出:

$form['#submit'][] = 'mymod_myform_submit'; 

私はスニフにdrupal_get_form()関数内のコードをトレースするビットを入れていますフォームが送信されるときの$ _POST変数jQueryの魔法が無効になっている場合は、$ _POST変数が「OP」のパラメータが含まれています

Array 
    (
    [op] = Save 
    [form_build_id] => form-6e74c87390e3fc48d0bebd2f5193315b 
    [form_token] => 33db6e34c0350e33c48861a63a38d45f 
    [form_id] => dh_seo_workload_item_form 
) 

が、私はそれがクリックされています後、送信ボタンを無効にするには、jQueryの魔法を有効にした場合、「OP」パラメータは、もはやありません$ _POST配列に含まれているため、Drupalはフォームがまだ提出されていないと考えています。

私はPrevent double submission of forms in jQueryに質問を見ましたが、これは本当にハックリな修正のように思えますし、より良い方法があるはずです。

+0

私はあなたがリンクしている質問に答えを加えました。 –

+0

クリック時にボタンが無効になっているために呼び出されない可能性があります。私の解決策は、これを回避するために1ミリ秒でsetTimeoutを使用します。 – Nick

答えて

1

ボタンのクリックイベントにバインドしているという事実は、クリックイベントがフォームにバブルアップしてサブミットを引き起こす前にボタンが無効になっていることを意味します。

私たちのチームは、送信ボタンを無効にするとほとんど常にInternet Explorerに問題が発生することが判明しました。私たちはこの問題を解決するための小さなプラグインを作った。ここでのコードを参照してください。https://stackoverflow.com/a/4473801/4376

+0

あなたのソリューションに感謝します。ライブは非難されているので、ライブの代わりにバインドを使用することをお勧めします。 – Roger

+0

@Roger - 実際には 'on()'は更新されたバージョンです。 'bind'もまた廃止され、' live'や 'on'とは異なり、呼び出し時にページ上の要素に対してのみ働きました。それに応じて修正されました。 –

+0

ありがとうございます。ありがとう、ネイサン! – Roger

0

私はそれをこのように今日の午後を固定し、外の問題で送信されたフォーム情報を取得することができた:

$("#id_of_button").click(function() { 
    var submit = $(this); 
    setTimeout(function(){ 
    submit.attr('disabled','disabled') 
    },1); 
}); 
2

それともあなたがこれを行うことができ、1つのライナーの追加としてPHPフォームの配列レベル...

$form['submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Save'), 
    '#attributes' => array(
    'onclick' => 'javascript:var s=this;setTimeout(function(){s.value="Saving...";s.disabled=true;},1);', 
), 
); 
0

はちょうどあなたの送信ボタン(display:none)を隠し、そしてすでに代わりに無効になって別のボタンを示しています。私は、この問題の解決策の残りの部分よりもハッキリではないと思います。私は通常、私のページに2つのボタンがあり、1つは表示され、もう1つは表示されず、onClickは、それらを切り替えます。

無効なボタンでポストバックが発生しないため、この問題が発生します。

関連する問題