4

ブラウザが一時停止/フリーズ/ハングしたことを検出する方法はありますか (例: OS ロック画面による)?

ajax タイマー メカニズムに問題があります。ボタンをクリックすると、クロックを開始するコントローラに ajax リクエストが送信されます。ブラウザがオンになっている間、別のスクリプト (「setInterval」による) が時計を動かします。ボタンが再度クリックされると、ajax リクエストがタイマーを停止し、setInterval が強制終了されます。

ただし、ブラウザーがフリーズした (javascript が停止した) ことを検出する必要があります。その場合は、タイマーを更新する ajax 要求を行います。

JavaScriptと最新のブラウザで実際に可能かどうか疑問に思っていました。それは...ですか?

編集:最初はうまく説明できなかったと思います。無限ループ必須です。これらの要素はタイマー (ストップウォッチ) です。また、js のバグやブラウザーの過負荷が原因でスクリプトがフリーズしているかどうかを検出したくありません。

OS のロック画面、OS のスリープなどのためにブラウザ (js) が停止したかどうかを検出したいと考えています。

4

3 に答える 3

2

ブラウザ間の互換性や標準準拠の保証はありません。それは少しハックで、状況に依存します。

(function() {
    // milliseconds
    var lastTime = (new Date).getTime()
    ,   acceptableDelta = 500
    ,   tick = 1000
    ,   hung = false;

    function hangman() {
        var now = (new Date).getTime();
        if(now - lastTime > (tick + acceptableDelta)) {
            hung = true;
        } else if(hung) {
            hung = false;
            console.warn('Possible browser hangup detected.');
        }
        lastTime = now;
    }

    setInterval(hangman, tick);
}());

この背後にある概念は、ブラウザーがユーザーのランナウェイ スクリプトを停止できるが、ページの残りの部分を何らかの形でそのままにしておくことができる場合、タイマーはこの不一致を検出し、コンソールでユーザーに警告するというものです。

jsFiddle のデモンストレーションhere、公正な警告、実際に無限ループを開始したい場合を除き、ボタンをクリックしないでください。


最終的には、そもそもなぜこれを行っているのかを再考し、設計レベルで潜在的なブラウザー ハングアップの原因と闘うことをお勧めします。一時停止、無限ループ、プロセッサを集中的に使用する操作などのない、重いシーケンシャル ワークロードを回避します。非同期コールバックでタスクの間隔を空け、コードに戦略的な遅延を配置して、ブラウザーとユーザーのコンピューターに余裕を持たせます。

于 2013-01-07T09:41:42.493 に答える
1

ありえない。それにリモートで近い唯一のことは、ウィンドウが閉じるのをリッスンし、息を切らしてコードの最後のコードを実行することです。

window.onbeforeunload = function(event) {
    //do something, ask if the user really wants to exit the page, cancel ajax or whatever it is you need to achieve.
}
于 2013-01-07T09:25:22.513 に答える
0

Ajax リクエストは JavaScript コードで行われます。JavaScript が原因でブラウザがハング/フリーズした場合、その特定の JavaScript コードの前に移動できないバグがある可能性があります。ブラウザがフリーズすると、BROWSER はバグを検出しようとします (スクリプト自体がフリーズされているため、スクリプトではありません)。それはソフトウェアにあります(ブラウザソフトウェアはIE/FF/chromeです)。

最善の方法は、JavaScript コードを次のようにラップすることです。

try
{
}
catch
{
}

エラーをキャプチャします。

于 2013-01-07T09:24:56.070 に答える