1

「保存」と「閉じる」の2つのボタンがあります。ユーザーがメイン ページにリダイレクトする前に保存するかどうかを尋ねるには、[閉じる] ボタンが必要です。以下のコードは、私が達成したいことを示しています。

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    $('#saveButton').click();
    window.location.href = "main.html";
  } else {
    window.location.href = "main.html";
  }
});

ただし、問題は、ページ全体がリダイレクトされる前に、saveButton クリック イベントが終了するのに十分な時間がないことです。したがって、私の質問は、この状況でコールバックを実行して、保存ボタンをクリックしてからメイン ページにリダイレクトする最善の方法は何かということです。

4

3 に答える 3

2

保存ボタンが JavaScript 関数を呼び出すと仮定すると、次のようなことができます。

function saveFunction(doRedirect){
    //normal save code
    if(doRedirect)
        window.location.href = "main.html";
}

注: 「通常の保存コード」が AJAX 呼び出しの場合doRedirect、ajax リクエストの成功コールバックにチェックを追加する必要があります。

そして、次のように使用できます:

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    saveFunction(true);
  } else {
    window.location.href = "main.html";
  }
});

独自のコールバックを使用した代替アプローチ:

function saveFuncton(callback){
   //normal save code

   //when done (or on AJAX success)
   if(callback)
      callback(true);//or false if not successful
}

その後....

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    saveFunction(function(success){
       if(success){
          window.location.href = "main.html";
       }
    });
  } else {
    window.location.href = "main.html";
  }
});

HACKY アプローチ (他に代替手段がまったくない場合を除き、使用しないでください)

var isSaving = false;
$(document).ajaxStop(function () {
    if (isSaving) {
        window.location.href = "main.html";
    }
});

その後...

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    isSaving = true;
    $('#saveButton').click();
  } else {
    window.location.href = "main.html";
  }
});

これは機能する可能性がありますが、保存機能がどのように機能するか、および他の何かが同時に ajax 呼び出しを実行している可能性があるかどうかに大きく依存します。また、保存機能が複数の AJAX 呼び出しを行う場合、このメソッドは失敗する可能性があります。これはハッキーなアプローチです。自己責任で使用してください。

于 2013-05-15T17:11:17.583 に答える
1

イベントをトリガーするときにイベントにデータを渡すことができるため、次のようにすることができます。

$('#closeButton').click(function(e) {
    if(confirm('..')) {
         $('#saveButton').trigger('click', [true]);
    } else {
         window.location.href = "main.html";
    }
});

$('#saveButton').click(function(e, close) {
    // do saving stuff ..
    // for normal clicks "close" will be undefined, otherwise close when done
    if(close) {
        window.location.href = "main.html";
    }
});

それについてもっとDRYにしたい場合は、saveButton の終了コードを closeButton と同様のトリガーにして、force強制的に終了させる種類の変数を使用して、リダイレクト URL を 2 つの異なる部分で繰り返さないようにすることができます。コード。

保存ロジックを変更できない場合 (疑わしいことのように思えますが、大丈夫です...)、保存ロジックが単一の AJAX 呼び出しで構成され、他の AJAX 要求が起動していないと仮定すると、これを行うことができます。 . そうした場合は、settings変数をチェックして、閉じる前に正しい変数であることを確認できます。

$('#closeButton').click(function(e) {
    if(confirm('..')) {
         $(document).ajaxComplete(function(e, xhr, settings) {
             window.location.href = "main.html";
         });
         $('#saveButton').click();
    } else {
         window.location.href = "main.html";
    }
});
于 2013-05-15T17:14:28.987 に答える
0

saveButton のクリックで実行されるスクリプトが何であれ、フォームが保存されるときに、そこの変数に応答を設定します。次に、その値を確認します。例は次のとおりです。

$('#closeButton').click(function() {
  if(confirm("CloseWarning")) {
    $('#saveButton').click(function(){
         // Code to save the form 
         if(saved == true){
              window.location.href = "main.html";
         }
    });
  } else {
    window.location.href = "main.html";
  }
});
于 2013-05-15T17:12:05.313 に答える