HTML select element onchange trigger for already selected option

I have the following HTML containing a drop down list (single selection)

        <script type="text/javascript">
            $(document).ready(function () {
                $("#garden").bind('change', function() {
                    alert("Changed");
                    });
            });
        </script>
    <body>
        <div id="content">  
           <select id="garden">
             <option value="flowers">Flowers</option>
             <option value="shrubs">Shrubs</option>
             <option value="trees">Trees</option>
             <option value="bushes">Bushes</option>                 
           </select>
        </div>
    </body>
</html>

When the HTML page is rendered, Flowers is the already selected element in the drop-down by default (being the first one). If I select any other value (other than "Flowers"), the Javascript function is fired and a alert box containing "Changed" is shown.

Q1: But, in case I re-select Flowers again, the onchange event is not triggered. I understand it is because nothing was ‘changed’ in the drop-down list. Is there a way a function is triggered even when no change to the already selected value in drop-down is done?

Q2: How to extract the value of the element which has just been selected (even if nothing new was selected – that is, user clicked on the drop down, and simply clicked somewhere else).

I have already tried the onblur but that requires that the user clicks somewhere else on the document so that the drop-down loses focus. Any help would be really appreciated.

[I have edited out the HTML headers and other script inclusions in the code snippet provided for brevity.]

6 thoughts on “HTML select element onchange trigger for already selected option”

  1. Well I think I don’t get you 100%, but some things I can suggest here are:

    • bind a click event handler to the select

      $("#garden").bind('click', function() {
           alert($(this).find('option:selected').text());
      });
      
    • bind a focusout event handler

      $("#garden").bind('focusout', function() {
           alert($(this).find('option:selected').text());
      });
      

    and of course bind the change event handler which you already got. The click event handler might be a little bit tricky since it would fire every time you click on the element. But if you don’t alert() it every time it should not be a problem at all, you got the current selection and can do with it whatever you want.

    Reply
  2. Are you sure that whatever you are doing is the most sensible way to do things? It seems like very strange UI to have different behaviour if you select an item by leaving it as the default compared to selecting it by opening up the select and selecting the currently selected item.

    If you are wanting to make them explicitly choose flowers then maybe you want a dummy entry at the top that says “Please choose one” that will then mean they are forced to actually change to flowers if that is what they want. It would probably be simpler than complicating your code with more event handlers and such like.

    If you do really need to go down the path you are following then you may want to consider what the behaviour is if somebody just tabs to the control and then past it. ie should that fire your script off as well?

    Edit to respond to comment at length:

    What you will want to do in this case is hook into the onSubmit handler of the form. This is called, as you can imagine, when the form submits. If your handler returns false that form will not be submitted.

    This handler is traditionally where you would do client side validation by examining the state of whatever form elements you care about and checking their values are valid. In this case you’d check if the value of garden was “N/A” or whatever you set it to and if so pop up an alert (in the simplest case) and possibly mark whichever fields need attention. Then the user will choose a valid entry (hopefully) and next time he submits your validation will succeed, you return true in the handler and the user can be happy he submitted valid input.

    As always though the standard disclaimer that any data can be sent to your server by a determined user so you should not assume that just becasue you had this validation that you are getting valid data on the server. 🙂

    Reply
  3. Question 1: I think the event for that would be “onSelect”.

    Question 2: I think the “onSelect” event would work for that as well, not 100% sure. Something to try at least and mess with.

    Reply
  4. You can manually trigger the event when you load the page:

    $(document).ready(function() {
        $("#garden").bind("change", function() {
            // ...
        }).change();
    });
    

    This will pick up the initial value – so I think it makes your second question irrelevant. This won’t work in all situations (I’m hoping that your actual handler isn’t an alert but actually something useful!), but could come in handy…

    Reply
  5. To my opinion, the easiest solution is to duplicate the first option into a disabled and hidden element having the same label. Your dropdown list will display the label of the hidden option, but thus won’t be displayed in the list.

    <select id="garden" name="blabla" onchange="this.form.submit();" >
      <option value="" disabled selected style="display:none;">Flowers</option>
      <option value="flowers" >Flowers</option>
      <option value="shrubs" >Schrubs</option>
      <option value="trees" >Trees</option>
      <option value="bushes" >Bushes</option>
    </select>
    

    Your question seems same as HTML SELECT – Trigger JavaScript ONCHANGE event even when the option is not changed
    and the solution mentionned above was provided by Simon Aronsson.

    Nota bene : the solution works perfectly with Firefox, but not with Internet Explorer.

    Reply

Leave a Comment