2011-06-19 13 views
2

「ソフト」検証の一種としてjQuery UIダイアログを使用しようとしています - フォームが疑わしいと思われる場合は警告しますが、とにかく投稿を続行するには:jQuery UIダイアログコールバックでフォーム送信イベントを再トリガーする方法

// multiple submit buttons... 
var whichButton; 
$("#myForm").find("[type=submit]").click(function() 
{ 
    whichButton = this; 
} 

var userOkWithIt = false; 
$("#myForm").submit(function() 
{ 
    if (dataLooksFishy() && !userOkWithIt) 
    { 
    $("Are you sure you want to do this?").dialog(
    { 
     buttons: 
     { 
     "Yes": function() 
     { 
      $(this).dialog("close"); 

      // override check and resubmit form 
      userOkWithIt = true; 
      // save submit action on form 
      $("#myForm").append("<input type='hidden' name='" + 
      $(whichSubmit).attr("name") + "' value='" + 
      $(whichSubmit).val() + "'>"); 
      $("#myForm").submit(); /****** Problem *********/ 
     }, 
     "No": function() { $(this).dialog("close"); } 
     } 
    }); 
    return false; // always prevent form submission here 
    } // end data looks fishy 

    return true; // allow form submission 
}); 

私はこれをデバッグアラート文で確認しました。コントロールの流れはまさに私が期待しているものです。最初にdataLooksFishy()に失敗した場合、ダイアログが表示され、メソッドはfalseを非同期に返します。

は、「はい」をクリックすると、再トリガは、この方法で、この時間を行い、方法は私が欠けていると確信している

... しかし、フォームが実際に提出していない、trueを返しますより良い方法論ですが、主な目標は非同期ダイアログ()を使用して同期confirm()の動作をシミュレートすることです。

+0

おっと...タイプミス:「whichButton」と「whichSubmit」の変数名が一致する必要があります。その部分はうまく機能しています... –

答えて

0

あなたの問題を正しく理解していれば、ここに解決策があります。 (私は別々の機能(管理が容易)にアクションを分離しました):

  1. フォーム(通常は)エラーがあるかどうかを確認します提出する - エラーがある場合 dataLooksFishyは()
  2. を - ダイアログポップアップする必要があり
  3. 場合、ユーザーがクリック "はい" - フォームをして提出される "力= true" を

    var 
    form = $("#myForm"), 
    
    formSubmit = function(force){ 
        if (dataLooksFishy() && force !== true) return showWarning(); // show warning and prevent submit 
        else return true;            // allow submit 
    }, 
    
    showWarning = function(){ 
        $("Are you sure you want to do this?").dialog({ buttons: { 
         "Yes": function(){ $(this).dialog("close"); formSubmit(true); }, 
         "No": function() { $(this).dialog("close"); } 
        }}); 
        return false; 
    }, 
    dataLooksFishy = function(){ 
        return true;  // true when there are validation errors 
    }; 
    
    // plain JS form submitting (also works if you hit enter in a text field in a form) 
    form[0].onsubmit = formSubmit; 
    

あなたがここに投稿していないので、私はあなたのフォームでそれをテストすることができませんでした。 このソリューションに問題がある場合は、ここにコードを投稿してください。

+0

私のために素晴らしい作品! –

関連する問題