javascript/jqueryで実行を停止することはできますか?
-
22-08-2019 - |
質問
基本的に、指定されたメソッド/jquery アニメーションの実行が終了するまで実行を続行できないように、任意のコマンドを $.holdTillFinished() メソッドでラップできるようにしたいと考えています。
これは JavaScript では難しいか不可能であると思われますが、誰かが知ってくれることを願っています。
アニメーションにコールバックを渡してアニメーションを完了時に実行する方法などについては聞きたくありません。
そのようなことが可能かどうか、そしてどのようにすればよいのかを知りたいです。
ユーザー定義メソッドとアニメーションの両方をキューに入れることができる優れたキュー プラグインを誰かが知っていれば、そのようなことが起こらないのであれば、それも素晴らしいでしょう。ただし、私が本当に望んでいるのは、実行を遅らせる方法です。(アニメーションを機能させながら)
解決
これはJavaScriptでは難しいか不可能であると思われます
あなたの疑念は正しい。アニメーション、ユーザー入力ループ、「async=true」XMLHttpRequests などのメソッド しなければならない 続行するには制御をブラウザに返します。ブラウザは、関数呼び出しのすべてのネスト レベルが返されるまで制御を取り戻すことはできません。つまり、「holdTillFinished()」を呼び出した関数を含むすべてのコードをアンワインドする必要があります。したがって、「holdTillFinished()」は不可能です。
他の言語にはフロー制御機能があり、非同期プロセスを呼び出し元には同期しているように見せかけ、非同期プロセスを効果的に実行したり、その逆を実行したりすることができます。最もよく知られているのは、 スレッド そして 続き. 。JavaScript にはこれらの機能がないため、できるのはタイムアウトとコールバックだけです。
(コールバックをインライン関数として定義して、クロージャ内で囲んでいる関数の変数にアクセスすると、少なくとも一部の手間は軽減されます。他の一部の言語では、これを実現するために、オブジェクトのプロパティで囲んでいる状態のすべてのビットをラップし始める必要があります。)
他のヒント
あなたはおそらく http://docs.jquery.com/Effects/queueを探していますA>
しかし、あなたは物事を遅らせるより一般的な方法を探しているなら、私は(私はすべてのクレジットは、元の作者に行き、それを書いていない)の前に、このスニペットを使用しました。
//Simple wrapper enabling setTimout within chained functions.
$.fn.wait = function(time, type) {
time = time || 1000;
type = type || "fx";
return this.queue(type, function() {
var self = this;
setTimeout(function() {
$(self).dequeue();
}, time);
});
};
パブリッシュ/サブスクライブ アーキテクチャを使用して、目的を達成できます。正確に何を達成したいのかよく分からないとしても、これはうまくいくだろうと思います。
これがどのように機能するかというと、関数の完了をイベントとして認識し、それをリッスンしてハンドラーをアタッチできるということです。 Dojo には pubsub メカニズムがあります, 、他にもあると思いますが。
これは、状況に守るが、通常、AJAXが呼び出され、または任意のループはJavaScriptで実行されたときに表示される処理画像を表示することが必要です。私は、処理画像が表示されている表示するユーザーのために、ループ内でAJAXを呼び出しています状況があります。私はトリックを行って終了するには。この機能は、私は、これは実行がfalseを返すtrueで、スクリプトが停止します場合は、グローバル変数をtrueにして、私はこの世界的なチェックをしていますループ内で「cancelJob」を言う設定が呼び出されたときに、私は仕事をキャンセルするボタンを配置しています。
var cancelJob = false;
foreach(){
if(cancelJob == true)
return false;
}
function cancelButtonPress(){
cancelJob = true;
}