とにかく私が見た、これを行うための信頼できる方法は本当にありません。
ブラウザーのonbeforeunload
イベントを使用して、サーバーに「今ページを離れます」と伝えることができます。問題は、ページのアンロードを実際にブロックできないことです。ユーザーが実際にブラウザを閉じている場合、開いているソケットはすぐに閉じられます。Web サーバーは、要求を時間内に取得する場合と取得しない場合があります。このアプローチでは、非常に不安定な結果が得られました。
有効なアプローチの 1 つは、ある種のタイムアウトメカニズムを採用することです。ページは 30 秒ごとにサーバーに ping を送信し、「私はまだここにいます」と言っています。数分経ってもサーバーがこの更新を取得しない場合、セッションが無効になり、そのドキュメントが解放されます。おそらく、これは、新しい人がやってきたときに最後のpingをチェックすることで最適化できます. これに関する 1 つの問題は、誰かがページを離れた場合、次のユーザーがページに移動する前に 1 ~ 2 分待たなければならない可能性があることです。次に、サーバーにトラフィックが殺到しないだけでなく、次のユーザーが長時間待たされることのない ping 頻度を見つける必要があります。
これら 2 つの方法を組み合わせることも可能です。ユーザーがページを離れると、onbeforeunload
イベントをトラップし、すぐにセッションを無効にします。ただし、これが機能しない場合は、1 分間 ping を受信しないとセッションがタイムアウトになります。
より良い解決策はありますか?
Web アプリでドキュメントをロックして、複数のユーザーが編集できないようにする必要がある場合は、全体的な設計を調査することをお勧めします。ユーザーがデータを破壊することを恐れていますか? その場合は、マージの競合を解決できるメカニズムを採用するか、両方の変更セットを組み合わせることができるかどうかを検出してください。
真の Web 2.0 に移行したい場合は、Google Docs に似たものを設計して、変更が行われたときにライブで表示されるようにすることができます。どこにも保存ボタンは必要ありません!