Why does the jquery change event not trigger when I set the value of a select using val()?

JqueryHtmlSelectInput

Jquery Problem Overview


The logic in the change() event handler is not being run when the value is set by val(), but it does run when user selects a value with their mouse. Why is this?

<select id="single">
    <option>Single</option>
    <option>Single2</option>
</select>

<script>
    $(function() {
        $(":input#single").change(function() {
           /* Logic here does not execute when val() is used */
        });
    });

    $("#single").val("Single2");
</script>

Jquery Solutions


Solution 1 - Jquery

Because the change event requires an actual browser event initiated by the user instead of via javascript code.

Do this instead:

$("#single").val("Single2").trigger('change');

or

$("#single").val("Single2").change();

Solution 2 - Jquery

I believe you can manually trigger the change event with trigger():

$("#single").val("Single2").trigger('change');

Though why it doesn't fire automatically, I have no idea.

Solution 3 - Jquery

Adding this piece of code after the val() seems to work:

$(":input#single").trigger('change');

Solution 4 - Jquery

As far as I can read in API's. The event is only fired when the user clicks on an option.

http://api.jquery.com/change/

> For select boxes, checkboxes, and > radio buttons, the event is fired > immediately when the user makes a > selection with the mouse, but for the > other element types the event is > deferred until the element loses > focus.

Solution 5 - Jquery

To make it easier, add a custom function and call it whenever you want to change the value and also trigger a change:

$.fn.valAndTrigger = function (element) {
    return $(this).val(element).trigger('change');
}

and

$("#sample").valAndTrigger("NewValue");

Or you can override the val() function to always call the change when val() is called:

(function ($) {
    var originalVal = $.fn.val;
    $.fn.val = function (value) {
        this.trigger("change");
        return originalVal.call(this, value);
    };
})(jQuery);

Sample at http://jsfiddle.net/r60bfkub/

Solution 6 - Jquery

In case you don't want to mix up with default change event you can provide your custom event

$('input.test').on('value_changed', function(e){
    console.log('value changed to '+$(this).val());
});

to trigger the event on value set, you can do

$('input.test').val('I am a new value').trigger('value_changed');

Solution 7 - Jquery

If you've just added the select option to a form and you wish to trigger the change event, I've found a setTimeout is required otherwise jQuery doesn't pick up the newly added select box:

window.setTimeout(function() { jQuery('.languagedisplay').change();}, 1);

Solution 8 - Jquery

I ran into the same issue while using CMB2 with Wordpress and wanted to hook into the change event of a file upload metabox.

So in case you're not able to modify the code that invokes the change (in this case the CMB2 script), use the code below. The trigger is being invoked AFTER the value is set, otherwise your change eventHandler will work, but the value will be the previous one, not the one being set.

Here's the code i use:

(function ($) {
	var originalVal = $.fn.val;
	$.fn.val = function (value) {
		if (arguments.length >= 1) {
			// setter invoked, do processing
			return originalVal.call(this, value).trigger('change');
		}
		//getter invoked do processing
		return originalVal.call(this);
	};
})(jQuery);

Solution 9 - Jquery

$(":input#single").trigger('change');

This worked for my script. I have 3 combos & bind with chainSelect event, I need to pass 3 values by url & default select all drop down. I used this

$('#machineMake').val('<?php echo $_GET['headMake']; ?>').trigger('change');

And the first event worked.

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
QuestionEric BelairView Question on Stackoverflow
Solution 1 - Jqueryuser113716View Answer on Stackoverflow
Solution 2 - JqueryDavid ThomasView Answer on Stackoverflow
Solution 3 - JqueryEric BelairView Answer on Stackoverflow
Solution 4 - JqueryMarnixView Answer on Stackoverflow
Solution 5 - JqueryAlireza FattahiView Answer on Stackoverflow
Solution 6 - JquerycodingrhythmView Answer on Stackoverflow
Solution 7 - JqueryDave HilditchView Answer on Stackoverflow
Solution 8 - Jqueryuser2075039View Answer on Stackoverflow
Solution 9 - JqueryPrashant PatilView Answer on Stackoverflow