jQuery 防止更改选择

IT技术 javascript jquery events select
2021-03-07 17:45:21

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

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

我猜这是因为此时所选的选项已经更改。

还有什么其他方法可以做到这一点?

6个回答

试试这个:

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");
});
这就是我一直在寻找的。我没有使用 lastSel 闭包,而是简单地将“last_selected”类分配给最后一个选择的选项,然后查找该选项并重新分配它。谢谢!
2021-04-16 17:45:21
此解决方案不适用于 JQuery 3.1.1 及更高版本。还有什么办法吗?
2021-05-16 17:45:21

如果有人需要 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'));
});
我编辑它以更改点击焦点以使其对键盘友好(参见:jsfiddle.net/VTUnK),但幸运的是编辑被拒绝,因为我刚刚发现了一个错误......即使我们打开一个对话框并关闭焦点也会触发所以如果我们想在那之后恢复选择,它就行不通了。所以如果我们想让它对键盘友好,我们需要使用上面的代码,并将其映射到 keydown。
2021-04-17 17:45:21
@nickel715 尝试使用prop而不是attr
2021-04-24 17:45:21
这很棒,但您不需要每个都第一个。每次更改前单击事件都相同。
2021-04-27 17:45:21
很棒的通用答案!一点 - 如果用户标签并使用键盘选择怎么办?所以最好使用焦点而不是在第三个块中单击。我同意大卫的观点。
2021-04-27 17:45:21
干得好,但我必须取消选择新值:$(this).find('option:selected').attr('selected', false);before$(this).data('lastSelected').attr('selected', true);
2021-05-14 17:45:21

如果您只是想在 my_condition 为真时完全阻止与选择的交互,您可以随时捕获 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.");
  }
});

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

您也许可以使用 tabindex=-1 或者您可以添加检测焦点并在下一个元素上触发它的jQuery
2021-05-09 17:45:21
即使用户在输入有焦点时按向上或向下键更改选择?
2021-05-15 17:45:21

另一个要考虑的选项是在您不希望它被更改时禁用它并启用它:

//When select should be disabled:
{
    $('#my_select').attr('disabled', 'disabled');
}

//When select should not be disabled
{
    $('#my_select').removeAttr('disabled');
}

自您发表评论后更新(如果我了解您想要的功能):

$("#dropdown").change(function()
{
    var answer = confirm("Are you sure you want to change your selection?")
    {
        if(answer)
        {
            //Update dropdown (Perform update logic)
        }
        else
        {
            //Allow Change (Do nothing - allow change)
        } 
    }            
}); 

演示

我需要他们能够随时更改选择。当他们更改选择时,他们选择的项目的动态可排序列表不再有效。在我清除该列表之前,我需要警告他们情况就是如此。如果他们决定不清除该列表,那么我需要确保不会发生选择更改。
2021-05-05 17:45:21
因此,您希望用户能够随时更改它 - 但是当他们更改它时 - 提示他们是否希望发生更改 - 否则什么都不做?类似的东西?jsfiddle.net/CHTfp/2
2021-05-09 17:45:21

没有一个答案对我有用。在我的情况下,简单的解决方案是:

$("#selectToNotAllow").focus(function(e) {
    $("#someOtherTextfield").focus();
});

这完成了单击或切换到选择下拉菜单,并在尝试聚焦选择时将焦点移动到不同的字段(附近设置为只读的文本输入)。可能听起来像愚蠢的诡计,但非常有效。