diff --git a/lib/javascript-static.js b/lib/javascript-static.js index 2d6476ae49f..536c14147ea 100644 --- a/lib/javascript-static.js +++ b/lib/javascript-static.js @@ -361,21 +361,29 @@ M.util.init_select_autosubmit = function(Y, formid, selectid, nothing) { // Make sure we have the form if (form) { // Create a function to handle our change event - var processchange = function(e, lastindex) { - if ((nothing===false || select.get('value') != nothing) && lastindex != select.get('selectedIndex')) { + var processchange = function(e, paramobject) { + if ((nothing===false || select.get('value') != nothing) && paramobject.lastindex != select.get('selectedIndex')) { + //prevent event bubbling and detach handlers to prevent multiple submissions caused by double clicking + e.halt(); + paramobject.eventkeypress.detach(); + paramobject.eventblur.detach(); + paramobject.eventchangeorblur.detach(); + this.submit(); } }; // Attach the change event to the keypress, blur, and click actions. // We don't use the change event because IE fires it on every arrow up/down // event.... usability - Y.on('key', processchange, select, 'press:13', form, select.get('selectedIndex')); - select.on('blur', processchange, form, select.get('selectedIndex')); + var paramobject = new Object(); + paramobject.lastindex = select.get('selectedIndex'); + paramobject.eventkeypress = Y.on('key', processchange, select, 'press:13', form, paramobject); + paramobject.eventblur = select.on('blur', processchange, form, paramobject); //little hack for chrome that need onChange event instead of onClick - see MDL-23224 if (Y.UA.webkit) { - select.on('change', processchange, form, select.get('selectedIndex')); + paramobject.eventchangeorblur = select.on('change', processchange, form, paramobject); } else { - select.on('click', processchange, form, select.get('selectedIndex')); + paramobject.eventchangeorblur = select.on('click', processchange, form, paramobject); } } }