0

jsfiddle 位于http://jsfiddle.net/whDm6/18/

如果我取消注释以下代码中的警报,更改表单值并刷新页面,它会显示警报。所以我知道代码正在执行到那时。但是,如果我将警报注释掉,它不会像我期望的那样显示 beforeunload 框。

我尝试使用 bind 并使用基本的 window.onbeforeunload = function() {} 而不将其与 Jquery 绑定,但这些都不起作用。

使用 Jquery 1.8.2

var currentUlValues = {};
currentUlValues['input1'] = "red";
currentUlValues['input2'] = "blue";
needToConfirm = true;

$(window).on('beforeunload', function(){
    if (needToConfirm) {
        $.each(currentUlValues, function(key, value) {
            var elem = $("#"+key).val();
            if (typeof elem !== 'undefined') {
                if (elem != currentUlValues[key]) {
                    //alert(elem + " - " + currentUlValues[key]);
                    return 'Are you sure you want to leave?';
                }
            }
        });
    }
});

HTML 表单

<form>
    <input id="input1" name="input1" type="text" value="red" />
    <input id="input2" name="input2" type="text" value="blue" />
</form>
4

4 回答 4

2

您是从 的回调函数中返回的.each,它在错误的范围内,您应该返回它之外的字符串。

工作演示:

$(window).on('beforeunload', function(){
    var is_return = false;
    if (needToConfirm) {
        $.each(currentUlValues, function(key, value) {
            var elem = $("#"+key).val();
            if (typeof elem !== 'undefined') {
                if (elem != currentUlValues[key]) {
                    is_return = true;
                    // here return false is to stop the iterate
                    return false;
                }
            }
        });
        if (is_return) {
            return 'Are you sure you want to leave?';
        }
    }
});

​</p>

于 2012-10-25T07:35:11.853 回答
0

return是返回$.each匿名函数而不是beforeunload函数

于 2012-10-25T07:30:45.267 回答
0

在此处查看答案对话框运行 1 秒然后消失? 简短的说法:

beforeunload 使用浏览器内置的方法,您需要返回一个字符串给它,浏览器会显示该字符串并询问用户是否要离开页面。

您不能使用自己的对话框(或 jQueryUI 模式对话框)来覆盖 beforeunload。

于 2012-10-25T07:30:46.120 回答
-1

也许你应该使用

return confirm('Are you sure you want to leave?');
于 2012-10-25T07:27:05.153 回答