/**** Author: Jerome Mouneyrac Bug Reference: http://tracker.moodle.org/browse/MDL-14439 IE and Opera fire the onchange when ever you move into a dropdwown list with the keyboard. These functions fix this problem. ****/ /* global variables Note: if I didn't use global variables, we would need to pass them as parameter: => in initSelect(): I would write "theSelect.onchange = selectChanged(...);" This code causes a javascript error on IE. (not firefox) so I had to write theSelect.onchange = selectChanged; It's why I use global variables . Because I use global variables, I didn't put this code in javascript-static.js. This file is loaded in javascript.php. */ var select_formid; var select_targetwindow; //we redefine all user actions on the dropdown list //onfocus, onchange, onkeydown, and onclick function initSelect(formId,targetWindow) { //initialise global variables select_formid=formId; select_targetwindow=targetWindow; var theSelect = document.getElementById(select_formid+"_jump"); theSelect.changed = false; selectFocussed(); theSelect.onchange = selectChanged; theSelect.onkeydown = selectKeyed; theSelect.onclick = selectClicked; return true; } function selectChanged(theElement) { var theSelect; if (theElement && theElement.value) { theSelect = theElement; } else { theSelect = this; } if (!theSelect.changed) { return false; } //here is the onchange redirection select_targetwindow.location=document.getElementById(select_formid).jump.options[document.getElementById(select_formid).jump.selectedIndex].value; return true; } function selectClicked() { this.changed = true; } function selectFocussed() { this.initValue = this.value; return true; } //we keep Firefox behaviors: onchange is fired when we press "Enter", "Esc", or "Tab"" keys. //note that is probably not working on Mac (keyCode could be different) function selectKeyed(e) { var theEvent; var keyCodeTab = "9"; var keyCodeEnter = "13"; var keyCodeEsc = "27"; if (e) { theEvent = e; } else { theEvent = event; } if ((theEvent.keyCode == keyCodeEnter || theEvent.keyCode == keyCodeTab) && this.value != this.initValue) { this.changed = true; selectChanged(this); } else if (theEvent.keyCode == keyCodeEsc) { this.value = this.initValue; } else { this.changed = false; } return true; }