From 5ddb20aaeb71eea6c9ec4fa0f24a66ee9b2ae53a Mon Sep 17 00:00:00 2001 From: jerome Date: Fri, 2 May 2008 02:38:36 +0000 Subject: [PATCH] MDL-14439 Added javascript file dropdwon.js - fix IE/Opera behavior. They do not fire dropdwon menu onChange automatically anymore. Merged from 19 --- lib/dropdown.js | 113 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 lib/dropdown.js diff --git a/lib/dropdown.js b/lib/dropdown.js new file mode 100644 index 0000000000..c922db52b4 --- /dev/null +++ b/lib/dropdown.js @@ -0,0 +1,113 @@ +/**** +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; +} \ No newline at end of file -- 2.39.5