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 不会。

此事件的目的是显示一个确认框,询问您是否要离开。就是这样。您不能调用alertconfirm,重定向用户,进行(异步)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,但它非常hacky。

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 回答