0

次のコードがあります。閉じる (X) ボタンをクリックすると、変数 s に保存されているエラーが表示されます。スクリプトが正常に機能する前は、閉じるボタンをクリックしてもアラートが表示されません。コーディングを間違えたのでしょうか、それとも .js ファイルを追加して動作させる必要がありますか。

var internalLink = false;

function pageUnload() {
    if (!internalLink && location.protocol != 'http:') {
        internalLink = true;
        var s = 'Alert Message';
        if (navigator.userAgent.indexOf("Firefox") > -1) {
            alert(s);
        }
        setTimeout("location.href= 'foo.com'", 100);
        return s;
    }
}
window.onbeforeunload = pageUnload;

または、ユーザーが閉じるボタンをクリックしたときに他のコードを提供できますか。変数 s に格納されたアラートがブラウザに表示されます。注: [閉じる] をクリックしたときにのみアラートを表示し、他のリンクにリダイレクトするときやフォームを送信するときは表示しません。内部リンクをクリックしてもアラートは表示されません。

4

2 に答える 2

-1

コードにいくつかの問題があります

1) 文字列を setTimeout に渡すのではなく、関数に渡す

違う:

setTimeout("location.href= 'foo.com'", 100);

正しい:

setTimeout(function(){location.href= 'foo.com'}, 100);

2) HTML5 仕様に従って、 onbeforeunload イベントでアラート呼び出しを無視することが許可されています (これはどうやら FF が行っているようです)。

3) unload イベントでもリダイレクトは許可されません。

ユーザーにプロンプ​​トを表示する文字列のみを返すことが許可されています (本当にページを離れたいかどうかを尋ねます)。イベントはキャンセル可能ですが、イベント自体の内部でリダイレクトすることはできません。

https://developer.mozilla.org/en-US/docs/Web/API/window.onbeforeunload

于 2013-06-11T15:04:11.113 に答える
-1

ブラウザーが許可することはほとんどあり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';
        }
    });
}
于 2013-06-11T15:05:27.527 に答える