jQuery prevent change for select

JavascriptJqueryEventsSelect

Javascript Problem Overview


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?

Javascript Solutions


Solution 1 - Javascript

Try this:

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

Solution 2 - Javascript

In the event someone needs a generic version of mattsven's answer (as I did), here it is:

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

Solution 3 - Javascript

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:

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.

Solution 4 - Javascript

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

Solution 5 - Javascript

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.

Solution 6 - Javascript

You can do this without 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>

Solution 7 - Javascript

I was looking for "javascript prevent select change" on Google and this question comes at first result. 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 :)

Solution 8 - Javascript

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.

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

Solution 9 - Javascript

Implement custom readonly like 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/

Solution 10 - Javascript

This was the ONLY thing that worked for me (on Chrome Version 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>

Solution 11 - Javascript

This worked for me, no need to keep a lastSelected if you know the optionIndex to select.

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

Solution 12 - Javascript

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

Solution 13 - Javascript

if anybody still interested, this solved the problem, using 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());	
});

});

Solution 14 - Javascript

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. Then I had to use the val() method for the select box that JQuery provides. Also, I had to make sure I was using the value attribute in my options when I populated the select box.

<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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionovergrooveView Question on Stackoverflow
Solution 1 - JavascriptmattsvenView Answer on Stackoverflow
Solution 2 - JavascriptdwallaceView Answer on Stackoverflow
Solution 3 - JavascriptChris LongmoonView Answer on Stackoverflow
Solution 4 - JavascriptRion WilliamsView Answer on Stackoverflow
Solution 5 - Javascriptuser2125504View Answer on Stackoverflow
Solution 6 - JavascriptGiolvaniView Answer on Stackoverflow
Solution 7 - JavascriptLuis Cabrera BenitoView Answer on Stackoverflow
Solution 8 - JavascriptAcidRaZorView Answer on Stackoverflow
Solution 9 - JavascriptKarthik MoorthyView Answer on Stackoverflow
Solution 10 - Javascriptw.stoettingerView Answer on Stackoverflow
Solution 11 - JavascriptPatrick from NDepend teamView Answer on Stackoverflow
Solution 12 - JavascriptMorteza SoltanabadiyanView Answer on Stackoverflow
Solution 13 - Javascriptbogdan bogdanView Answer on Stackoverflow
Solution 14 - JavascriptStephenView Answer on Stackoverflow