While Irfan's solution seems like a viable one, it did not work for me in Chrome. However, I ended up using a sort of workaround to solve this problem where I set a placeholder type option when the click event fires on the select box.
<select id="dropdown">
<option value="choose" disabled selected>Choose</option>
<option value="1">1</option>
<option value="2">2</option>
</select>
<script>
// When the dropdown is opened, the "choose" option is selected
$('#dropdown').on('click', function(){
$("#dropdown option").filter(function() {
return $(this).val() == "choose";
}).prop('selected', true);
// On change will always fire
$('#dropdown').on('change', doStuff);
});
function doStuff(){
// Grab the selected value before click changes it
let currentValue = $('#dropdown').val();
alert(currentValue);
/* Do other stuff with currentValue
Wait until second click that selects sets value to "choose"
when the user makes their selection, then set the selector
back to what the user chose
*/
setTimeout(function(){
$("#dropdown option").filter(function() {
return $(this).val() == order;
}).prop('selected', true);
}, 100);
}
</script>
The result is a slight delay before the selector shows what the user chose, but the change event always fires, since the active value was changed. This doesn't work as well in IE or FireFox, but if you can detect the browser being used, and combine this with Ifran's solution, you should be able to have this working on all browsers.