jQuery更改事件(监视表单更新)

jQuery更改事件(监视表单更新),jquery,forms,events,Jquery,Forms,Events,我正在监视表单输入元素的更改(在页面退出时提醒用户未保存的表单更改) 我的理解是,只有在某些输入元素失去焦点(例如,文本框)时才会触发jQuery更改事件 但这是有问题的,因为用户可以编辑单个文本框,然后尝试退出,文本框更改事件不会触发 以下是我取得的成绩: var formChanges = { override: false, changed: false, checkChanges: function() { if(!formChanges.over

我正在监视表单输入元素的更改(在页面退出时提醒用户未保存的表单更改)

我的理解是,只有在某些输入元素失去焦点(例如,文本框)时才会触发jQuery更改事件

但这是有问题的,因为用户可以编辑单个文本框,然后尝试退出,文本框更改事件不会触发

以下是我取得的成绩:

var formChanges = {
    override: false,
    changed: false,
    checkChanges: function() {
        if(!formChanges.override) {
           if(formChanges.changed) {
               return "There are currently unsaved changes.";
           }
        }
    },
    init: $(document).ready(function() {
        $('#checkThis').submit(function() { //'checkThis' is the form ID
           formChanges.override = true;
       });
       $(':input').change(function() {
           formChanges.changed = true;
       });
    })
}
window.onbeforeunload = formChanges.checkChanges;

关于如何克服这个问题,你有什么想法吗?

实际上,对于你正在做的事情,我认为你最好使用按键或键控输入,并像这样更改select和radio

   $('input:text, textarea').keypress(function() {
       formChanges.changed = true;
   });

   $('select, input:radio, input:checkbox').change(function(){
       formChanges.changed = true;
   });

实际上,对于您正在做的事情,我认为您最好使用按键或键控输入,并更改select和radio,就像这样

   $('input:text, textarea').keypress(function() {
       formChanges.changed = true;
   });

   $('select, input:radio, input:checkbox').change(function(){
       formChanges.changed = true;
   });
当在checkChanges之前卸载时,“hack”将重点放在一个不相关的元素上。按键并不意味着改变

编辑:正如Nicola所说,为了绝对确定它是否被更改,您可能需要将其与原始值进行比较。

在checkChanges之前卸载时,“hack”将集中在一个不相关的元素上。按键并不意味着改变


编辑:正如Nicola所说,为了绝对确定它是否被更改,您可能需要与原始值进行比较。

这似乎很有效:

var oldForm = null;
function monitorChanges(form) {
    if(oldForm == null) {
        oldForm = ($(form).serialize());
    } else {
        alert(oldForm == $(form).serialize());
    }
}

这似乎很有效:

var oldForm = null;
function monitorChanges(form) {
    if(oldForm == null) {
        oldForm = ($(form).serialize());
    } else {
        alert(oldForm == $(form).serialize());
    }
}

我不认为每按一次键都意味着文本(箭头键)的改变。当然,知道是否发生了变化比我做的要复杂得多(你应该对照原始值检查实际值,添加一个字母并删除它不会改变输入)。我的回答只是关于选择正确的事件,我认为你应该使用按键,而不是更改文本输入。我不认为每个按键都意味着文本(箭头键)的更改。当然,知道是否发生了更改比我做的要复杂得多(实际上,你应该对照原始值检查实际值,添加字母和删除字母不会改变输入)。我的答案只是选择正确的事件,我认为你应该使用按键,而不是更改文本输入。这非常聪明。谢谢你的想法!这非常聪明。谢谢你的想法!