6

ブラウザをロックせずにJavaScriptの実行を停止できますか?通常、実行を停止する方法は無限ループを実行することですがwhile()、FireFoxの場合、ループが終了するまでブラウザをロックします。

これについてどう思いますか? HTMLを使用して独自のダイアログを実装する


ためにオーバーライドしようとしています。window.confirm()私はこれを行っているので、既存のコードを変更する必要はありません(かなり大きなコードベースです)。

ユーザー入力を許可するには、実行を停止できる必要があります。次に、標準の確認機能のようにブール値を返します。

if (confirm("..."))
{
    // user pressed "OK"
}
else
{
    // user pressed "Cancel"
}



アップデート

私の知る限り; これらの関数は、与えられたコードを非同期で実行するため、setTimeout()またはを使用してこれを行うことはできません。setInterval()

4

7 に答える 7

9

confirm() prompt()およびalert()は特別な関数です。これらはJavaScriptサンドボックスからブラウザーに呼び出され、ブラウザーはJavaScriptの実行を一時停止します。機能をJavaScriptに組み込む必要があるため、同じことを行うことはできません。

次のようなリストラを行わずに、代替品をドロップする優れた方法はないと思います。

myconfirmfunction(function() {
   /* OK callback */
}, function() {
   /* cancel callback */
});
于 2010-01-19T21:53:45.057 に答える
7

JavaScriptではイベントスレッドを停止できないため、代わりに、通常はコールバック関数を使用して問題を回避する必要があります。これらは後で実行される関数ですが、JavaScriptの他のオブジェクトと同じように渡すことができます。あなたはAJAXプログラミングからそれらに精通しているかもしれません。したがって、たとえば:

doSomeThing();
var result = confirm("some importart question");
doSomeThingElse(result);

次のように変換されます:

doSomeThing();
customConfirm("some importart question", function(result){
  doSomeThingElse(result);
});

ここでcustomConfirm、質問を受け取り、その結果を引数として受け取る関数に渡します。ボタンを使用してDOMダイアログを実装する場合は、イベントリスナーを[OK]ボタンと[キャンセル]ボタンに接続し、ユーザーがボタンの1つをクリックしたときにコールバック関数を呼び出します。

于 2010-01-19T22:08:51.620 に答える
7

コールバックを使用するか、コードをFirefox専用にします。JavaScript 1.7以降をサポートするFirefoxでは、yieldステートメントを使用して目的の効果をシミュレートできます。この目的のために、async.jsというライブラリを作成しました。async.jsの標準ライブラリには、次のように使用できるconfirmメソッドが含まれています。

if (yield to.confirm("...")) {
  // user pressed OK
} else {
  // user pressed Cancel
}
于 2010-01-20T02:16:03.657 に答える
3

StratifiedJSと呼ばれるJavaScript言語の拡張機能があります。これはすべてのブラウザーで実行され、ブラウザーをフリーズせずに1行のJavaScriptコードを停止するというまさにそれを実行できます。

階層化されたJavaScriptを有効にするには、たとえば、次のようにWebページにOni Apollo(http://onilabs.com/docs)を含めます。

<script src="http://code.onilabs.com/latest/oni-apollo.js"></script>
<script type="text/sjs"> your StratifiedJS code here </script>

コードは次のようになります。

var dom = require("dom");
displayYourHtmlDialog();
waitfor {
  dom.waitforEvent("okbutton", "click");
  // do something when the user pressed OK
}
or {
  dom.waitforEvent("cancelbutton", "click");
}
hideYourHtmlDialog();
// go on with your application
于 2010-09-23T10:54:23.220 に答える
2

通常実行を停止する方法は、無限のwhileループになることはほとんどありません。

SetTimeoutを使用して呼び出す作業をパーツに分割します

これを変える:

  DoSomeWork();
  Wait(1000);
  var a = DoSomeMoreWork();
  Wait(1000);
  DoEvenMoreWork(a);

これに:

 DoSomeWork();
 setTimeout(function() {
    var a = DoSomeMoreWork();
    setTimeout(function() { 
        DoEvenMoreWork(a);
    }, 1000);
 }, 1000);
于 2010-01-19T21:54:16.630 に答える
1

自分のJavaScriptでconfirm()やprompt()の機能を合理的に再現する方法はないと思います。これらは、ネイティブブラウザライブラリへの呼び出しとして実装されるという意味で「特別」です。JavaScriptでは、この種のモーダルダイアログを実際に実行することはできません。

モーダルダイアログのように見えて動作する要素をページの上部に配置することで効果をシミュレートするさまざまなUIライブラリを見てきましたが、それらは非同期コールバックを使用して実装されています。

window.confirmを置き換えるのではなく、既存のライブラリを変更する必要があります。

于 2010-01-20T02:08:13.207 に答える
0

これにはタイトループを使ってみまし。ネイティブイベントの速度を落とす必要がありました(非同期で再設計できない同期待機の唯一のユースケースはAFAIKです)。ブラウザをロックしないと主張するループの例はたくさんあります。しかし、それらのどれも私のために機能しませんでした(ブラウザーはロックされませんでしたが、そもそも私が待っていたことを実行できませんでした)、それで私はそのアイデアを放棄しました。

次に、これを試しました。イベントの保存と再生ですが、クロスブラウザでも不可能のようです。ただし、イベントや必要な柔軟性によっては、近づくことができます。

結局、私はあきらめ、それに対してずっと気分が良くなりました。ネイティブイベントの速度をまったく落とさずにコードを機能させる方法を見つけました。

于 2010-08-01T04:16:56.510 に答える