在更改之前获取select(下拉列表)的值

Alp*_*esh 224 javascript jquery jquery-events

我想要实现的是每当<select>下拉列表被更改时我想要更改前的下拉列表的值.我正在使用1.3.2版本的jquery并在更改事件上使用但是我在那里得到的值是在更改之后.

<select name="test">
<option value="stack">Stack</option>
<option value="overflow">Overflow</option>
<option value="my">My</option>
<option value="question">Question</option>
</select>
Run Code Online (Sandbox Code Playgroud)

让我们说当前选择My当我在onchange事件中将其更改为堆栈时(即当我将其更改为堆栈时),我希望它是先前的值,即我在这种情况下的预期.

怎么能实现这一目标?

编辑:在我的情况下,我在同一页面中有多个选择框,并希望同样的事情应用于所有这些.此外,我的所有选择都是在通过ajax加载页面后插入的.

And*_*y E 419

焦点事件与更改事件相结合,以实现您的目标:

(function () {
    var previous;

    $("select").on('focus', function () {
        // Store the current value on focus and on change
        previous = this.value;
    }).change(function() {
        // Do something with the previous value after the change
        alert(previous);

        // Make sure the previous value is updated
        previous = this.value;
    });
})();
Run Code Online (Sandbox Code Playgroud)

工作示例:http://jsfiddle.net/x5PKf/766

  • 我不同意这个解决方案.如果你改变它一旦它会起作用,但如果你再次这样做,它就不会.您必须单击某处以放松焦点,然后再单击下拉列表.我建议:$("#dropdownId").on('change',function(){var ddl = $(this); var previous = ddl.data('previous'); ddl.data('previous',ddl .val());}); (45认同)
  • @free4ride,为了解决这个问题,我只是在更改函数的末尾调用了 `$(this).blur();` (9认同)
  • 请注意,您还应该在更改处理程序中关注select元素,否则在重复更改值后不会触发它 (4认同)

Avi*_*nto 132

请不要使用全局变量 - 存储此处数据的prev值是一个例子:http://jsbin.com/uqupu3/2/edit

ref的代码:

$(document).ready(function(){
  var sel = $("#sel");
  sel.data("prev",sel.val());

  sel.change(function(data){
     var jqThis = $(this);
     alert(jqThis.data("prev"));
     jqThis.data("prev",jqThis.val());
  });
});
Run Code Online (Sandbox Code Playgroud)

只是看到你在页面上有很多选择 - 这种方法也适用于你,因为对于每个选择你将把prev值存储在select的数据上

  • 那你对使用jQuery.data的反对意见是什么?据我所知,jQuery库也在内部使用它,并建议使用它 (8认同)
  • @ppumkin:全局变量肯定有一个问题:它只支持一个`select`!接受的答案将在匹配所有`select`时中断,但仅存储第一个的值.`data`*是*更好的方法.+1 :) (2认同)

小智 80

我选择使用的Avi Pinto解决方案 jquery.data()

使用焦点不是有效的解决方案.它在您第一次更改选项时有效,但如果您保持选择元素,则按"向上"或"向下"键.它不会再次通过焦点事件.

所以解决方案应该更像以下,

//set the pre data, usually needed after you initialize the select element
$('mySelect').data('pre', $(this).val());

$('mySelect').change(function(e){
    var before_change = $(this).data('pre');//get the pre data
    //Do your work here
    $(this).data('pre', $(this).val());//update the pre data
})
Run Code Online (Sandbox Code Playgroud)

  • 伟大的解决方案,比选择的答案好得多! (3认同)
  • 第二部分工作正常但第一部分没有设置数据属性.有任何想法吗? (2认同)
  • @Sinaesthetic这行代码为所有“ mySelect”元素设置了一个值`$('mySelect')。data('pre',$(this).val());`应该是:`$('mySelect' ).each(function(){$(this).data('pre',$(this).val());});`我没有足够的声誉来编辑答案:/ (2认同)

Aug*_*aas 8

手动追踪价值.

var selects = jQuery("select.track_me");

selects.each(function (i, element) {
  var select = jQuery(element);
  var previousValue = select.val();
  select.bind("change", function () {
    var currentValue = select.val();

    // Use currentValue and previousValue
    // ...

    previousValue = currentValue;
  });
});
Run Code Online (Sandbox Code Playgroud)


fre*_*ide 6

 $("#dropdownId").on('focus', function () {
    var ddl = $(this);
    ddl.data('previous', ddl.val());
}).on('change', function () {
    var ddl = $(this);
    var previous = ddl.data('previous');
    ddl.data('previous', ddl.val());
});
Run Code Online (Sandbox Code Playgroud)

  • Change 事件可以在没有用户交互的情况下发生,所以这不是一个脑洞 (2认同)