0

私は将来のプロジェクトのためにコードのライブラリを書くことに取り組んでいます。私が取り組んできた機能の 1 つに一時停止機能があります。これまでのところ、スクリプトが 10 秒間の一時停止でも長時間実行されているというエラー報告に問題はありません。これは主に悪意のあるユーザーを忙しくさせておくためのもので、非常に長い時間を設定するとうまく機能します。直面する可能性があることに注意する必要があるエラーがあるかどうか疑問に思っていましたか? これがコードです...

pause = function(a) {
    var b = new Date().getTime();
    e = false;
    function wait() {
    d=10;
    for(i=0;i<d;i++) {
        d++;
        var c = new Date().getTime();
        if(c-b>=a) {
            e = true;
            break;
        }
        if(d>1000000) {
            break;
        }
    }
}
wait();
if(e==false) {
    pause(a-(new Date().getTime()-b));
}};
4

3 に答える 3

4

Javascriptでこの種のことをしたくはありませんお気づきのように、ブラウザはスクリプトに時間がかかりすぎると文句を言います。さらに、これには必要以上のエネルギーが必要になります。これは、バッテリー容量が限られているモバイルデバイスにとって重要です。

代わりに、標準setTimeout()関数を使用して後でコードを実行します。

于 2012-08-23T06:25:50.060 に答える
0

Javascript にはすでにそれを行う方法があります。setTimeout() を使用して、操作を続行する匿名関数に渡します。2 番目の引数はミリ秒単位の遅延です。

例:

setTimeout(function(){ alert('hello'); }, 2000);

于 2012-08-23T06:28:11.540 に答える
0

これまでのコメントで述べたように、javascript で半無限ループを実行しようとすることは決して良い考えではありません。

注意すべき問題のいくつかを次に示します。

  1. 一定時間後に JavaScript スレッドの実行を終了してブラウザーのイベント ループに戻らない場合、ブラウザーは停止し、そのブラウザー ウィンドウで JavaScript を強制終了するようにユーザーに促します。
  2. あなたのコードは、宣言されていない変数の束を使用しているため、暗黙的なグローバル変数になっています。それらは共通の名前を持っているため、他のコードに簡単に干渉する可能性があります。
  3. JavaScript はシングル スレッドであるため、ループが実行されている間、そのウィンドウの他のブラウザー イベントは実行できず、ブラウザー ウィンドウが実質的にフリーズされます。ユーザーはハングしていると考えるでしょう。患者のユーザーは、それが完了するかどうかを確認するために、より長く待つ可能性があります。せっかちなユーザーはブラウザ ウィンドウを閉じます。

基本的に、あなたがやろうとしているのは、ユーザーのブラウザに対するサービス拒否攻撃です。彼らがあなたの Web ページに対して行っていることは気に入らないかもしれませんが、彼らを攻撃するのは適切ではないようです。ブラウザを攻撃する方法ではなく、ブラウザに適した方法でページへのアクセスをブロックする方がはるかに優れています。

提案:

あなたが実際にやろうとしていることが、ある状況でページを使い物にならないようにすることだけである場合 (なぜそうしようとしているのか、どのような状況があなたの欲求を引き起こしているのかをまだ説明していません)、ブラウザを終了させようとせずに、ページを役に立たなくしたり有益なものにしたりするだけです。次の方法でそれを行うことができます:

  1. ウィンドウが空白になるように、DOM 内のすべてを非表示にするだけです。
  2. ウィンドウが空白になるように、すべての DOM 要素を削除します。
  3. ウィンドウ全体に透明なレイヤーを配置して、入力イベントがページ要素に到達できないようにしますが、ビジュアルはそこにとどまります。そのウィンドウにメッセージを追加できます。
  4. ページの内容を適切なメッセージに置き換えます。
于 2012-08-23T07:01:17.023 に答える