ブラウザーが許可することはほとんどありonbeforeunload
ません。一体、それらのすべてがそれをサポートしているわけではありません。Opera はそうではないと確信しています。
このイベントの目的は、退出するかどうかを尋ねる確認ボックスを表示することです。それでおしまい。または を呼び出しalert
たりconfirm
、ユーザーをリダイレクトしたり、(非同期) AJAX 呼び出しを行ったり、他の多くのことを行うことはできません。
できることは、文字列を返すことです。返された文字列は、退出するかどうかを尋ねるブラウザ レンダリング アラートに表示されます。注: Firefox は実際には文字列を表示しません (バグ # 588292を参照)。
var internalLink = false;
function pageUnload() {
if (!internalLink && location.protocol != 'http:') {
internalLink = true;
var s = 'Alert Message';
// You cannot alert or set location.href here
// This will show your message in a confirm popup
return s;
}
}
window.onbeforeunload = pageUnload;
したがって、ご覧のとおり、ブラウザーはonbeforeunload
. 注意して使用してください。
ユーザーが「退出」または「滞在」をクリックしたかどうかを知る「公式」の方法はありません。事実上の方法は、unload
イベントと aを使用することですsetTimeout
が、非常にハックです。
var internalLink = false,
stayTimeout, stayClicked;
function pageUnload() {
if(stayClicked){
// Don't run this multiple times
return;
}
if (!internalLink && location.protocol != 'http:') {
internalLink = true;
// To mark that we've ran this event once
stayClicked = true;
// If the user opted to stay, this will be ran
setTimeout(stayOnPage, 1000);
var s = 'Alert Message';
// You cannot alert or set location.href here
// This will show your message in a confirm popup
return s;
}
}
function stayOnPage(){
// The user opted to stay, do something
location.href= 'foo.com';
// If you are not going to redirect, set stayClicked to false
// otherwise leave it alone
// stayClicked = false;
}
function leavePage(){
// The user has chosen to leave the page, clear the timeout
clearTimeout(stayTimeout);
}
window.onbeforeunload = pageUnload;
window.unload = leavePage;
はるかに優れた解決策は、イベントを<a>
タグに割り当て、独自のconfirm
ボックスを使用してから何でもすることです。
var a = document.getElementsByTagName('a');
for(var b in a){
a[b].addEventListener('click', function(e){
var c = confirm('Do you want to follow this link?');
if(c){
// The user wants to leave, let them
return true;
}
else{
// Otherwise block the link, and do whatever
e.preventDefault();
location.href= 'foo.com';
}
});
}