クリックが発生するまで関数が戻るのを遅らせる方法
-
06-07-2019 - |
質問
次の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の記事を読んだ後、それがより意味をなしてくれるでしょう。
次の関数が呼び出される前にタイムアウトを追加できます