在 < input > 元素上的 jQuery Change 事件-有什么方法可以保留以前的值吗?

我今天早上一直在寻找,没有找到任何简单的解决方案... ... 基本上,我想捕获一个输入元素的变化,但也知道先前的值。

下面是最简单形式的更改事件和输入元素。显然,我可以使用 $(elem)获取新值。Val () ,但是我是否缺少一个获取前一个值的方法呢?我在 jQueryAPI 中没有看到任何可以做到这一点的东西,但是也许有人已经做到了,并且有一些技巧?

<script>
$(document).ready(function(){
$('#myInputElement').bind('change', function(){
//var oldvalue = ???
var newvalue = $(this).val();
});
});
</script>
<input id="myInputElement" type="text">

我不是反对自己写解决方案,我只是想确定我没有在这里重建轮子。

122539 次浏览

当焦点离开输入字段时,您可以将输入字段的值复制到一个隐藏字段(该字段应该按照您的要求进行)。见下面的代码:

<script>
$(document).ready(function(){
$('#myInputElement').bind('change', function(){
var newvalue = $(this).val();
});
$('#myInputElement').blur(function(){
$('#myHiddenInput').val($(this).val());
});
});
</script>
<input id="myInputElement" type="text">

(未经测试,但应该可行)。

在拉斯的回答中,他绑定了焦点事件。我认为这没有必要。

可以在更改事件中存储旧值。

<script>
$(document).ready(function(){


var newValue = $('#myInputElement').val();
var oldValue;


$('#myInputElement').change(function(){
oldValue = newValue;
newValue = $(this).val();
});
});
</script>
<input id="myInputElement" type="text">

更好的方法是使用。资料。这样可以避免创建全局变量(您应该远离它) ,并将信息封装在元素中。给你记录了一个真实世界的例子,说明为什么全球变量是坏的

例如:

<script>
//look no global needed:)


$(document).ready(function(){
// Get the initial value
var $el = $('#myInputElement');
$el.data('oldVal',  $el.val() );




$el.change(function(){
//store new value
var $this = $(this);
var newValue = $this.data('newVal', $this.val());
})
.focus(function(){
// Get the value when input gains focus
var oldValue = $(this).data('oldVal');
});
});
</script>
<input id="myInputElement" type="text">

每个 DOM 元素都有一个名为 defaultValue 的属性。如果您只是想比较数据的第一次更改,那么可以使用它来获取默认值。

有几点。

使用 $. data 而不是 $. fn.data

// regular
$(elem).data(key,value);
// 10x faster
$.data(elem,key,value);

然后,您可以通过事件对象获得先前的值,而不会使您的生活复杂化:

    $('#myInputElement').change(function(event){
var defaultValue = event.target.defaultValue;
var newValue = event.target.value;
});

请注意,defaultValue 不是最后一个设置值。它是字段初始化时使用的值。但是你可以使用 $。数据来跟踪“ oldValue”

我建议您总是在事件处理函数中声明“ event”对象,并使用 firebug (console.log (event))或其他方法检查它们。您将在那里找到许多有用的东西,它们将帮助您避免创建/访问 jquery 对象(这很棒,但是如果您能够更快... ...)

这可能会奏效:

$(document).ready(function() {
$("input[type=text]").change(function() {
$(this).data("old", $(this).data("new") || "");
$(this).data("new", $(this).val());
console.log($(this).data("old"));
console.log($(this).data("new"));
});
});

演示完毕

我发现了一个肮脏的伎俩,但它的工作,你可以使用悬停函数得到的值之前改变!

我根据 Joey Guerra 的建议创建了这些函数,谢谢。我在详细说明,也许有人能用得上。第一个函数 checkDefault ()在输入更改时调用,第二个函数在使用 jQuery.post 提交表单时调用。Updatesubmit 是我的提交按钮,而类“ need update”是一个指示器,表示已经进行了更新但尚未提交。

function checkDefaults() {
var changed = false;
jQuery('input').each(function(){
if(this.defaultValue != this.value) {
changed = true;
}
});
if(changed === true) {
jQuery('div.updatesubmit').addClass("needsupdate");
} else {
jQuery('div.updatesubmit').removeClass("needsupdate");
}
}


function renewDefaults() {
jQuery('input').each(function(){
this.defaultValue = this.value;
});
jQuery('div.updatesubmit').removeClass("needsupdate");
}
$('#element').on('change', function() {
$(this).val($(this).prop("defaultValue"));
});