简体   繁体   English

jQuery 防止更改选择

[英]jQuery prevent change for select

I want to prevent a select box from being changed if a certain condition applies.如果某个条件适用,我想防止选择框被更改。 Doing this doesn't seem to work:这样做似乎不起作用:

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

I'm guessing this is because by this point the selected option has already changed.我猜这是因为此时所选的选项已经更改。

What are other ways of doing this?还有什么其他方法可以做到这一点?

Try this:尝试这个:

http://jsfiddle.net/qk2Pc/ 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");
});

In the event someone needs a generic version of mattsven's answer (as I did), here it is:如果有人需要 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'));
});

If you simply want to prevent interaction with the select altogether when my_condition is true, you could always just capture the mousedown event and do your event prevent there:如果您只是想在 my_condition 为真时完全阻止与 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.");
  }
});

This will prevent any change event from ever occurring while my_condition is true.这将防止在 my_condition 为真时发生任何更改事件。

Another option to consider is disabling it when you do not want it to be able to be changed and enabling it:另一个要考虑的选项是当您不希望它能够被更改并启用它时禁用它:

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

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

Update since your comment (if I understand the functionality you want):自您的评论以来更新(如果我了解您想要的功能):

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

Demo演示

None of the answers worked well for me.没有一个答案对我有用。 The easy solution in my case was:在我的情况下,简单的解决方案是:

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

This accomplishes clicking or tabbing to the select drop down and simply moves the focus to a different field (a nearby text input that was set to readonly) when attempting to focus on the select.这完成了单击或切换到选择下拉菜单,并在尝试聚焦选择时简单地将焦点移动到不同的字段(设置为只读的附近文本输入)。 May sound like silly trickery, but very effective.可能听起来像愚蠢的诡计,但非常有效。

You can do this without jquery...你可以在没有 jquery 的情况下做到这一点......

<select onchange="event.target.selectedIndex = 0">
...
</select>

or you can do a function to check your condition或者你可以做一个功能来检查你的状况

<select onchange="check(event)">
...
</select>

<script>
function check(e){
    if (my_condition){
        event.target.selectedIndex = 0;
    }
}
</script>

I was looking for "javascript prevent select change" on Google and this question comes at first result.我在谷歌上寻找“javascript阻止选择更改”,这个问题出现在第一个结果中。 At the end my solution was:最后我的解决方案是:

const $select = document.querySelector("#your_select_id");
let lastSelectedIndex = $select.selectedIndex;
// We save the last selected index on click
$select.addEventListener("click", function () {
    lastSelectedIndex = $select.selectedIndex;
});

// And then, in the change, we select it if the user does not confirm
$select.addEventListener("change", function (e) {
    if (!confirm("Some question or action")) {
        $select.selectedIndex = lastSelectedIndex;
        return;
    }
    // Here do whatever you want; the user has clicked "Yes" on the confirm
    // ...
});

I hope it helps to someone who is looking for this and does not have jQuery :)我希望它对正在寻找这个并且没有 jQuery 的人有所帮助:)

Implement custom readonly like eventHandler像 eventHandler 一样实现自定义只读

<select id='country' data-changeable=false>
  <option selected value="INDIA">India</option>
  <option value="USA">United States</option>
  <option value="UK">United Kingdom</option>
</select>

<script>
    var lastSelected = $("#country option:selected");

    $("#country").on("change", function() {
       if(!$(this).data(changeable)) {
            lastSelected.attr("selected", true);              
       }        
    });

    $("#country").on("click", function() {
       lastSelected = $("#country option:selected");
    });
</script>

Demo : https://jsfiddle.net/0mvajuay/8/演示: https : //jsfiddle.net/0mvajuay/8/

This was the ONLY thing that worked for me (on Chrome Version 54.0.2840.27):这是唯一对我有用的东西(在 Chrome 版本 54.0.2840.27 上):

 $('select').each(function() { $(this).data('lastSelectedIndex', this.selectedIndex); }); $('select').click(function() { $(this).data('lastSelectedIndex', this.selectedIndex); }); $('select[class*="select-with-confirm"]').change(function() { if (!confirm("Do you really want to change?")) { this.selectedIndex = $(this).data('lastSelectedIndex'); } });
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <select id='fruits' class="select-with-confirm"> <option selected value="apples">Apples</option> <option value="bananas">Bananas</option> <option value="melons">Melons</option> </select> <select id='people'> <option selected value="john">John</option> <option value="jack">Jack</option> <option value="jane">Jane</option> </select>

This worked for me, no need to keep a lastSelected if you know the optionIndex to select.这个工作对我来说,没有必要保持lastSelected如果你知道optionIndex选择。

var optionIndex = ...
$(this)[0].options[optionIndex].selected = true;

 $('#my_select').bind('mousedown', function (event) { event.preventDefault(); event.stopImmediatePropagation(); });

You might need to use the ".live" option in jQuery since the behavior will be evaluated in real-time based on the condition you've set.您可能需要在 jQuery 中使用“.live”选项,因为将根据您设置的条件实时评估行为。

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

if anybody still interested, this solved the problem, using jQuery 3.3.1如果有人仍然感兴趣,这解决了问题,使用 jQuery 3.3.1

jQuery('.class').each(function(i,v){

    jQuery(v).data('lastSelected', jQuery(v).find('option:selected').val());
    jQuery(v).on('change', function(){

    if(!confirm('Are you sure?'))
    {
        var self = jQuery(this);
        jQuery(this).find('option').each(function(key, value){
           if(parseInt(jQuery(value).val()) === parseInt(self.data('lastSelected')))
           {
               jQuery(this).prop('selected', 'selected');
           }
        });
    }
    jQuery(v).data('lastSelected', jQuery(v).find('option:selected').val());    
});

}); });

None of the other answers worked for me, here is what eventually did.其他答案都不适合我,这就是最终所做的。

I had to track the previous selected value of the select element and store it in the data-* attribute.我必须跟踪 select 元素的先前选定值并将其存储在 data-* 属性中。 Then I had to use the val() method for the select box that JQuery provides.然后我不得不对 JQuery 提供的选择框使用 val() 方法。 Also, I had to make sure I was using the value attribute in my options when I populated the select box.此外,当我填充选择框时,我必须确保我在我的选项中使用了 value 属性。

<body>
    <select id="sel">
        <option value="Apple">Apple</option>        <!-- Must use the value attribute on the options in order for this to work. -->
        <option value="Bannana">Bannana</option>
        <option value="Cherry">Cherry</option>
    </select>
</body>

<script src="https://code.jquery.com/jquery-3.5.1.js" type="text/javascript" language="javascript"></script>

<script>
    $(document).ready()
    {
        //
        // Register the necessary events.
        $("#sel").on("click", sel_TrackLastChange);
        $("#sel").on("keydown", sel_TrackLastChange);
        $("#sel").on("change", sel_Change);
        
        $("#sel").data("lastSelected", $("#sel").val());
    }
    
    //
    // Track the previously selected value when the user either clicks on or uses the keyboard to change
    // the option in the select box.  Store it in the select box's data-* attribute.
    function sel_TrackLastChange()
    {
        $("#sel").data("lastSelected", $("#sel").val());
    }
    
    //
    // When the option changes on the select box, ask the user if they want to change it.
    function sel_Change()
    {
        if(!confirm("Are you sure?"))
        {
            //
            // If the user does not want to change the selection then use JQuery's .val() method to change
            // the selection back to what it was  previously.
            $("#sel").val($("#sel").data("lastSelected"));
        }
    }
</script>

I hope this can help someone else who has the same problem as I did.我希望这可以帮助和我有同样问题的其他人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM