在更改之前获取选择(下拉)的值

IT技术 javascript jquery jquery-events
2021-01-30 04:13:02

我想要实现的事情是每当<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>

假设当前选项 My 现在被选中,当我在 onchange 事件中将其更改为堆栈时(即,当我将其更改为堆栈时)我希望它是以前的值,即我在这种情况下的预期值。

如何做到这一点?

编辑:就我而言,我在同一页面中有多个选择框,并希望将相同的内容应用于所有选择框。此外,我的所有选择都是在通过 ajax 加载页面后插入的。

6个回答

焦点事件与更改事件结合起来以实现您想要的:

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

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

@Alpesh:不幸的是,由于您没有使用 jQuery 1.4.1 或更高版本,因此您无法将live()焦点更改事件一起使用。您唯一能做的就是在元素插入页面后调整脚本以进行绑定。
2021-03-14 04:13:02
谢谢,我已经绑定了 live 并且成功运行。:)
2021-03-23 04:13:02
@free4ride,为了解决我只是$(this).blur();在更改函数结束时调用的问题
2021-03-23 04:13:02
我不同意这个解决方案。如果您更改一次值,它将起作用,但如果您再更改一次,则不会。您必须单击某处以松开焦点,然后再单击下拉列表。我建议: $("#dropdownId").on('change', function () { var ddl = $(this); var previous = ddl.data('previous'); ddl.data('previous', ddl .val()); });
2021-03-31 04:13:02
请注意,您还应该关注更改处理程序中的 select 元素,否则在重复值更改后不会触发它
2021-04-03 04:13:02

请不要为此使用全局变量 - 将上一个值存储在数据中,这是一个示例:http : //jsbin.com/uqupu3/2/edit

参考代码:

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

刚刚看到您在页面上有很多选择 - 这种方法也适用于您,因为对于每个选择,您都会将 prev 值存储在选择的数据上

@ppumkin:全局变量肯定有问题:它只支持一个select接受的答案将中断,因为它匹配所有select但只存储第一个的值。data 更好的方法。+1 :)
2021-03-15 04:13:02
绝对同意使用 jQuery Data——感谢你提醒我我将要使用全局变量。全局变量没有错,但使用数据更简洁。但是链接焦点然后改变也很好:)
2021-03-31 04:13:02
jQuery.data 是一个很好的解决方案。在您的解决方案中,您正在为每个选择创建一个闭包,如果有很多选择元素,这会对性能产生影响
2021-04-05 04:13:02
我关心的不是性能,我不相信创建函数比任何时候都慢jQuery.data
2021-04-05 04:13:02
那么您对使用 jQuery.data 的反对意见是什么?据我所知,jQuery 库也在内部使用它,并建议使用它
2021-04-07 04:13:02

我选择使用 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
})
@Sinaesthetic,我遇到了同样的问题(并且已经对这个答案投了赞成票)。我认为 $(this) 不会在 .data() 方法中幸存下来。Avi Pinto 的回答回到了 select 元素的value,这对我有用(所以我也赞成 Avi 的)。
2021-03-13 04:13:02
很好的解决方案,比选定的答案好得多!
2021-03-14 04:13:02
这将不起作用,因为这个 !== $('mySelect')。这是一个固定版本。 var $selectStatus = $('.my-select'); $selectStatus.on('change', function () { var newStatus = $(this).val(); var oldStatus = $(this).data('pre'); }).data('pre', $selectStatus.val());
2021-03-27 04:13:02
第二部分工作正常,但第一部分没有设置数据属性。有任何想法吗?
2021-04-03 04:13:02
@Sinaesthetic 这一行为所有“mySelect”元素设置了一个值$('mySelect').data('pre', $(this).val());它应该是:$('mySelect').each(function() { $(this).data('pre', $(this).val()); });我没有足够的声誉来编辑答案:/
2021-04-06 04:13:02

手动跟踪值。

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;
  });
});
从“关闭”用法的角度来看,我不确定这是否比“焦点”解决方案更好。
2021-03-18 04:13:02
@coorasse:正确的执行流程永远不会有任何不同。在元素获得焦点之前用户永远不能更改选择框的值话虽如此,这种方法也没有错:-)
2021-03-26 04:13:02
最佳答案。我认为这个解决方案比使用 focus() 和 change() 更好,因为它依赖于 jquery 的浏览器兼容性,而不是两种方法的正确执行流程
2021-03-27 04:13:02
我不能使用上述方法,因为我在同一页面中有多个选择框,我必须处理这些选择框。
2021-04-02 04:13:02
您在问题中没有提及多个选择按钮。更新了我的答案以支持多个盒子。
2021-04-02 04:13:02
 $("#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());
});
Change 事件可以在没有用户交互的情况下发生,所以这不是一个脑洞
2021-03-26 04:13:02
这对我有用,只是在 dropdownId 选择器上进行了轻微的修正,而不是一个,谢谢
2021-03-28 04:13:02