Telerik RadTextBox ValueChanged事件和window.onbeforeunload

时间:2011-12-14 13:38:44

标签: javascript telerik

我的页面上有以下javascript:

var isDirty = false;

function OnTextBoxValueChanged(sender, args)
{
 isDirty = true;
}

window.onbeforeunload = function ()
{
 if (isDirty)
 {
   return 'You have unsaved changes on the form.';
 }
}

OnTextBoxValueChanged是RadTextBox相应客户端事件的处理程序。

如果用户更改文本框中的文本,然后将焦点移动到任何其他元素,然后按下浏览器中的“关闭标签” - 将出现确认窗口。这是对的。但是当用户更改文本然后立即按下“关闭选项卡”时会出现问题。在这种情况下onbeforeunload事件在onvaluechanged之前触发,而isDirty变量在onbeforeunload处理程序中具有不正确的值(false)。

我做错了什么或者我的案例有解决办法吗?

1 个答案:

答案 0 :(得分:0)

在我的情况下,似乎唯一的解决方法是使用KeyPress事件和过滤系统密钥(选项卡,输入等)。

    function OnKeyPress(sender, args)
    {
        if (!IsSysKey(sender, args))
        {
            isDirty = true;
        }
    }

    function IsSysKey(sender, args)
    {
        var kc = args.get_keyCode();

        return ((kc == 9) || (kc == 13) || (kc == 19) || (kc == 27) ||
            (kc == 45) ||
            (kc >= 33 && kc <= 40) ||
            (kc >= 91 && kc <= 93) ||
            (kc >= 112 && kc <= 123) ||
            ((kc == 8) && (sender.get_caretPosition() == 0) &&
             (sender.get_caretPosition()[1] == undefined)) ||
            ((kc == 46) && (sender.get_caretPosition() == sender.get_value().length) &&
             (sender.get_caretPosition()[1] == undefined)));
    }