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

IT技术 javascript jquery html events forms
2021-03-03 00:34:14

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

这是最简单形式的更改事件和输入元素。显然,我可以使用 $(elem).val() 获取新值,但是我缺少获取先前值的偷偷摸摸的方法吗?我在 jQuery API 中没有看到任何可以执行此操作的内容,但也许有人已经完成了此操作并提供了一些提示?

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

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

6个回答

更好的方法是使用 .data 存储旧值。这避免了创建全局变量,您应该远离它并将信息封装在元素中。一个真实的例子,为什么全局变量是不好的记录在这里

例如

<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">
我每天都在学习关于 jQuery 的新东西……这是我第一次看到 .data() 所以我今天肯定会阅读更多关于它的内容。
2021-04-17 00:34:14
@redsquare:这很好,但看起来有些逻辑不太正确。.data('oldVal')仅在页面加载时才设置,之后永远不会设置。可能在changefocus事件中它应该是这样的$(this).data('oldVal', $(this).val())
2021-04-19 00:34:14
不正确,即使是 MS 渲染全局变量在那里 ms ajax 脚本中,当人们碰巧将他们的控件命名为与全局变量相同时,这些脚本可以将人们发现。确定不是一个没有经验的唯一问题
2021-05-05 00:34:14
@redsquare - 完全忘记了 .data() - 很好!
2021-05-07 00:34:14
@redsquare:我不知道 .data。非常好 :)
2021-05-07 00:34:14

这可能会奏效:

$(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"));
    });
});

演示在这里

我喜欢这个解决方案,但它缺少一件事:如果该值被其他 javascript 代码更改(如我的情况),或者如果您第一次需要旧值,则此代码将不起作用。您需要<input data-new="initialValue" />在 HTML 中添加,并且必须在每次操作时覆盖此值。
2021-05-15 00:34:14
$('#element').on('change', function() {
    $(this).val($(this).prop("defaultValue"));
});
没错,这应该是公认的答案:w3schools.com/jsref/prop_text_defaultvalue.asp
2021-04-30 00:34:14
根据我对之前值的理解,这是不正确的defaultValue是在页面加载时设置的。先前值(根据我的理解)是更改前控件的值。如果默认值为 1,用户键入 2,则将其更改为 3,则先前的值为2。
2021-05-04 00:34:14
最简单的方法 - 应该有更多的选票。请参阅:stackoverflow.com/questions/5244466/...
2021-05-17 00:34:14

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

<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">

(未经测试,但它应该可以工作)。

这不是一个坏主意......我必须测试。我想知道绑定和模糊事件是否每次都以相同的顺序触发......如果是这样,那可能会奏效。或者,我可以使用 focus 事件,以便在元素获得焦点时存储该值。然后在更改时,我有旧的和新的值......我会做一些测试,看看我能想出什么。
2021-04-18 00:34:14
我做了一些测试,焦点方法非常有效。感谢你们俩的想法/样品!
2021-04-30 00:34:14

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