]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-14439 Added javascript file dropdwon.js - fix IE/Opera behavior. They do not...
authorjerome <jerome>
Fri, 2 May 2008 02:38:36 +0000 (02:38 +0000)
committerjerome <jerome>
Fri, 2 May 2008 02:38:36 +0000 (02:38 +0000)
lib/dropdown.js [new file with mode: 0644]

diff --git a/lib/dropdown.js b/lib/dropdown.js
new file mode 100644 (file)
index 0000000..c922db5
--- /dev/null
@@ -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