jQuery阻止select的更改

ove*_*ove 45 javascript jquery events select

如果某个条件适用,我想阻止更改选择框.这样做似乎不起作用:

$('#my_select').bind('change', function(ev) {
  if(my_condition)
  {
    ev.preventDefault();
    return false;
  }
});
Run Code Online (Sandbox Code Playgroud)

我猜这是因为到目前为止所选的选项已经改变了.

这样做的其他方法是什么?

mat*_*ven 48

试试这个:

http://jsfiddle.net/qk2Pc/

var my_condition = true;
var lastSel = $("#my_select option:selected");

$("#my_select").change(function(){
  if(my_condition)
  {
    lastSel.prop("selected", true);
  }
});

$("#my_select").click(function(){
    lastSel = $("#my_select option:selected");
});
Run Code Online (Sandbox Code Playgroud)

  • 这就是我想要的.我没有使用lastSel闭包,只是将"last_selected"类分配给最后选择的选项,然后查找该选项并重新分配.谢谢! (6认同)
  • 此解决方案在JQuery 3.1.1及更高版本中不起作用。还有其他方法吗? (2认同)

小智 30

如果有人需要mattsven的答案的通用版本(就像我做的那样),这里是:

$('select').each(function() {
    $(this).data('lastSelected', $(this).find('option:selected'));
});

$('select').change(function() {
    if(my_condition) {
        $(this).data('lastSelected').attr('selected', true);
    }
});

$('select').click(function() {
    $(this).data('lastSelected', $(this).find('option:selected'));
});
Run Code Online (Sandbox Code Playgroud)

  • 这很棒,但你不需要第一个.每次更改前,Click事件都相同. (4认同)
  • @ nickel715尝试使用`prop`而不是`attr` (3认同)
  • 干得好,但我必须通过以下方式取消选择新值:`$(this).find('option:selected').attr('selected',false);```$(this).data('lastSelected' ).attr('selected',true);` (2认同)

小智 9

如果您只是想在my_condition为true时完全阻止与select的交互,那么您可以随时捕获mousedown事件并使事件阻止:

var my_condition = true;

$("#my_select").mousedown(function(e){
  if(my_condition)
  {
     e.preventDefault();
     alert("Because my_condition is true, you cannot make this change.");
  }
});
Run Code Online (Sandbox Code Playgroud)

这将防止在my_condition为true时发生任何更改事件.

  • 即使在输入具有焦点的情况下用户按下向上或向下键来更改选择? (2认同)