質問

次のconfirmDialog関数は、別のjquery関数の途中で呼び出されます。このconfirmDialogがtrueを返すと、他の関数は続行することになっていますが、そうではありません。この理由は、続行ボタンがクリックされるまでに、confirmDialog関数全体が既に実行されている(falseを返す)ためと思われます。ボタンがクリックされるまで、何かを返すのを遅らせるにはどうすればよいですか?

(または、完全に間違った方向に進んでいる場合、問題は何ですか、どうすれば修正できますか?)

function confirmDialog(message) {
....
    $('input#continue', conf_dialog).click(function() {
        $(this).unbind();
        $('p',conf_dialog).fadeOut().text('Are you really sure you want to '+message).fadeIn();
        $(this).click(function() {
            $(conf_dialog).remove();
            return true;
        });
    }); 
    $('input#cancel', conf_dialog).click(function() {
        $(conf_dialog).remove();
        return false;
    }); 
}
役に立ちましたか?

解決

function callingFunction() {
  $('a').click(function() {
    confirmDialog('are you sure?', dialogConfirmed);
    // the rest of the function is in dialogConfirmed so doesnt 
    // get run unless the confirm button is pressed
  })
}

function dialogConfirmed() {
  // put the rest of your function here
}

function confirmDialog(message, callback) {
  ...
  $('input#continue', conf_dialog).click(function() {
    callback()
    $(conf_dialog).remove();
    return false;
  }),
  $('input#cancel', conf_dialog).click(function() {
    $(conf_dialog).remove();
    return false;
  })
  ...
}

他のヒント

できるかどうかわからない。 confirm alert 、または prompt などのAFAIKのみの組み込み関数は、回答を求めているときにブロックできます。

一般的な回避策は、コールバックを使用する(または組み込み関数を使用する)コードをリファクタリングすることです。つまり、呼び出し元の関数を2つに分割し、入力が取得されたときに2番目の部分を実行することを意味します。

confirmDialogでは、confirmDialogの実行時ではなく、イベントの発生時に実行されるイベントハンドラーを設定しています。もう1つの問題は、イベント関数内でtrueまたはfalseを返すため、外側の関数confirmDialongには適用されないことです。

ボタンの押下に依存する部分は、リファクタリングする必要があります。おそらく別の関数に入れて、クリックハンドラーから呼び出します:

var afterConfirm = function(bool) {
    if(bool) {
        //continue clicked
    } else {
        //cancel clicked
    }
    //do for both cases here
}

//inside confirmDialog input#continue
$(this).click(function() {
    $(conf_dialog).remove();
    afterConfirm(true);
});

遅延オブジェクトの使用を検討することもできます。それらを説明する2つのリンクを次に示します。

http://www.sitepen.com/ blog / 2009/03/31 / queued-demystifying-deferreds /

http://api.dojotoolkit.org/jsdoc/1.3/dojo.Deferred

遅延オブジェクトを使用すると、呼び出し関数を使用できます:

function doSomething () {
  // this functions does something before calling confirmDialog
  if (confirmDialog) {
    // handle ok
  } else {
    // handle cancel
  }
  // just to be difficult lets have more code here
}

次のようにリファクタリングします:

function doSomethingRefactored() {
  // this functions does something before calling confirmDialog

  var handleCancel = function() { /* handle cancel */};
  var handleOk = function() { /* handle ok */};
  var doAfter = function() { /* just to be difficult lets have more code here */};

  var d = new dojo.deferred();
  d.addBoth(handleOk, handleCancel);
  d.addCallback(doAfter);
  confirmDialog(message, d);
  return d;
}
  • ConfirmDialogは d.callback()を呼び出すように更新または trueを返す代わりにd.errback() またはfalse
  • 呼び出す関数 doSomethingは待つ必要があります doSomething to finish itを追加できます コールバックチェーンに対する独自の関数

これが役立つことを願っています... sitepenの記事を読んだ後、それがより意味をなしてくれるでしょう。

次の関数が呼び出される前にタイムアウトを追加できます

http://www.w3schools.com/htmldom/met_win_settimeout.asp

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top