JQuery предотвратить изменения для выбора - PullRequest
41 голосов
/ 25 марта 2011

Я хочу запретить изменение поля выбора, если применяется определенное условие. Это не похоже на работу:

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

Я предполагаю, что это потому, что к этому моменту выбранная опция уже изменилась.

Каковы другие способы сделать это?

Ответы [ 11 ]

46 голосов
/ 25 марта 2011

Попробуйте это:

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");
});
30 голосов
/ 09 июня 2011

В случае, если кому-то нужна общая версия ответа Матцвена (как я это сделал), вот он:

$('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'));
});
8 голосов
/ 11 октября 2013

Если вы просто хотите полностью запретить взаимодействие с select, когда my_condition имеет значение true, вы всегда можете просто захватить событие 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 имеет значение true.

2 голосов
/ 25 марта 2011

Другой вариант, который следует рассмотреть, - это отключить его, если вы не хотите, чтобы его можно было изменить, и включите его:

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

Демо

0 голосов
/ 10 сентября 2018

$('#my_select').bind('mousedown', function (event) {
         event.preventDefault();
         event.stopImmediatePropagation();
     });
0 голосов
/ 04 декабря 2017

Это сработало для меня, нет необходимости сохранять lastSelected, если вы знаете, optionIndex для выбора.

var optionIndex = ...
$(this)[0].options[optionIndex].selected = true;
0 голосов
/ 21 сентября 2016

Это была ЕДИНСТВЕННАЯ вещь, которая работала для меня (в 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>
0 голосов
/ 28 октября 2015

Реализация пользовательских только для чтения, как 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>

Демо: https://jsfiddle.net/0mvajuay/8/

0 голосов
/ 26 марта 2015

Вы можете сделать это без JQuery ...

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

или вы можете сделать функцию для проверки вашего состояния

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

<script>
function check(e){
    if (my_condition){
        event.target.selectedIndex = 0;
    }
}
</script>
0 голосов
/ 16 декабря 2014

Ни один из ответов не помог мне.Простое решение в моем случае было:

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

Это позволяет выполнить щелчок или вкладку в раскрывающемся списке выбора и просто перемещает фокус в другое поле (соседний ввод текста, который был установлен только для чтения) при попыткесосредоточиться на избранных.Может звучать глупо, но очень эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...