これが Javascript の問題なのか Vaadin の問題なのかわからないので、Vaadin フォーラムよりもここで質問するのが最善だと思いました。
ブラウザーが閉じられたときにすぐにリソースをクリーンアップするために (可能な場合)、Vaadin アプリケーションに次のコードを追加しました。
JavaScript.getCurrent().addFunction("catchClose", new JavaScriptFunction() {
private static final long serialVersionUID = 1L;
@Override
public void call(JSONArray arguments) throws JSONException {
VaadinSession.getCurrent().close();
/*causes detach() to be called which does all my cleanup*/
}
});
Page.getCurrent().getJavaScript().execute(
"window.addEventListener('beforeunload', "
+ "function() {"
+ "var e = window.event;"
+ "e.returnValue = '';"
+ "catchClose(); "
+ "return '';"
+ "}, false);"
);
また、Vaadin フォーラムのこの投稿で説明されているように、イベント リスナーを追加するのではなく、onbeforeunload 関数を直接設定しようとしました。
Firefox では、これは期待どおりに機能し、イベントはサーバーに送り返され、ページを離れたいかどうかをユーザーに尋ねるプロンプトは表示されません。彼らを去らせてください。
ただし、IE 10 (および Chrome ですが、現時点では IE 10 のみが関連しています) ではメッセージが送信され、Vaadin セッションが閉じられますが、ユーザーに退出するかどうかを確認するよう求められます。私はすでにセッションを閉じているので、彼らが留まることを選択した場合、これは明らかにいくつかの大きな問題を引き起こすでしょう.
onbeforeunload イベントに関する IE のドキュメントによると、空の値を返す場合、ダイアログは表示されません。空の文字列を返すことに加えて、プロンプトのメッセージをそれぞれ「null」と「false」に設定したnull
とを返すことも試みました。また、をまったくfalse
設定せずに、またはを に設定して、上記の試行のさまざまな順列を組み合わせて試しました。e.returnValue
e.returnValue
null
false
つまり、問題は、IE 10 で「退出してもよろしいですか」というプロンプトが表示されないようにするには、上記のコードをどのように変更する必要があるかということです。Javascript に何か問題がありますか、それとも IE のドキュメントで見逃したものがありますか?
ありがとう!