3

アップデート

したがって、両方の回答を読んだ後、ブラウザー ウィンドウがいつ閉じられたかを判断する信頼できる方法がないことに気付きました。もともと私は、ページが閉じられたときにデータベース内のレコードのロックを解除するためにこれを使用することを計画していました. 基本的に、ユーザーがページをロードすると、アクセスしているレコードがロックされ、ページが閉じられるとロックが解除されます。これを別の方法/より良い方法で行う方法について何か提案はありますか? X ではなく閉じるボタンを使用してフォームを閉じる必要があるという通知をページに投稿することを考えていました。X を使用して閉じた場合、アクセスできるようになるまで、レコードはたとえば 5 分間ロックされたままになります。また。


このコードは、テストしただけなので非常に単純です。基本的に、このページを IE と Chrome で実行すると、アラートは問題なく発生します。Firefox で 1 つのタブのみで実行し、ブラウザ全体を閉じると、アラートは発生しません。ただし、複数のタブがあり、ページを新しいタブとして開き、タブの X を使用して閉じると、アラートが発生します。Firefoxがそこで何をしているのか誰か知っていますか?

onunload を起動するためだけに複数のタブを開く必要があるのは非常に望ましくないため、どんな助けもありがたいです。

<html>
<head runat="server">
    <title></title>
    <script type="text/javascript">

        window.onunload = function() {
            alert("unload event detected!");
        }

    </script>
</head>
<body>
</body>
</html>
4

2 に答える 2

2

onunloadハンドラーの起動はまったく期待できません(Firefoxだけではありません)。onbeforeunloadハンドラーの信頼性はわずかに高くなりますが、わずかです。

更新フォローアップの質問への回答:ロックを使用する必要ある場合は、はい、間違いなくサーバー側のタイムアウトを使用します(他に選択肢はありません。たとえば、ユーザーのワークステーションのブルースクリーンの場合は、ある時点でレコードのロックが解除されました)。ユーザーからのアクティビティを確認するたびにタイムアウトをリセットし(ページが開いているときにajax pingを使用できます)、前述のように、ユーザーにレコードを明示的に解放する手段を提供することをお勧めします。そのタイムアウトの長さはあなた次第ですが、ajax pingメカニズムを使用した場合、5分である必要はありません。1分のタイムアウトと30秒のajax ping、または30秒のタイムアウトと15秒のpingなど。サーバーにどのような負荷をかけたいかによって異なります。

于 2010-10-06T21:09:13.540 に答える
0

X をクリックしてブラウザを閉じると、Firefox はすぐに閉じます。何らかの理由で、onunload イベントの呼び出しを「忘れて」います。

于 2010-10-06T21:06:20.237 に答える