[PATCH] Reimplementation of Accesskeys in javascript (FS#1809), toolbar accesskyes fix.

  • From: Marek Sacha <sachamar@xxxxxxxxxxx>
  • Date: Fri, 30 Apr 2010 17:18:40 +0200

---
 lib/exe/js.php         |    2 +
 lib/scripts/hotkeys.js |   58 ++++++++++++++++++++++++++++++++++-------------
 2 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/lib/exe/js.php b/lib/exe/js.php
index f1ac86c..f2f9dfe 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -113,6 +113,8 @@ function js_out(){
     }
     js_runonstart('scrollToMarker()');
     js_runonstart('focusMarker()');
+    // init hotkeys - must have been done after init of toolbar
+    js_runonstart('initializeHotkeys()');
 
     // end output buffering and get contents
     $js = ob_get_contents();
diff --git a/lib/scripts/hotkeys.js b/lib/scripts/hotkeys.js
index d062118..9e2b9cb 100644
--- a/lib/scripts/hotkeys.js
+++ b/lib/scripts/hotkeys.js
@@ -27,6 +27,9 @@ function Hotkeys() {
      * (at anchor elements and input elements [type="submit"]) and registers
      * appropriate shortcuts.
      *
+     * Secondly, initialization registers listeners on document to catch all
+     * keyboard events.
+     *
      * @author Marek Sacha <sachamar@xxxxxxxxxxx>
      */
     this.initialize = function() {
@@ -39,7 +42,7 @@ function Hotkeys() {
         t.each(anchors, function(a) {
             if (a.accessKey != "") {
                 t.addShortcut(t.modifier + '+' + a.accessKey, function() {
-                    window.location.href = a.href;
+                    a.click();
                 });
             }
         });
@@ -50,12 +53,41 @@ function Hotkeys() {
          */
         var inputs = document.getElementsByTagName("input");
         t.each(inputs, function(i) {
-            if (i.type == "submit") {
+            if (i.type == "submit" && i.accessKey != "") {
                 t.addShortcut(t.modifier + '+' + i.accessKey, function() {
                     i.click();
                 });
             }
         });
+
+        /**
+         * Lookup all buttons with accesskey and register event -
+         * perform "click" on a button.
+         */
+        var buttons = document.getElementsByTagName("button");
+        t.each(buttons, function(b) {
+            if (b.accessKey != "") {
+                t.addShortcut(t.modifier + '+' + b.accessKey, function() {
+                    b.click();
+                });
+            }
+        });
+
+        /**
+         * Register listeners on document to catch keyboard events.
+         */
+
+        addEvent(document,'keyup',function (e) {
+            return t.onkeyup.call(t,e);
+        });
+
+        addEvent(document,'keypress',function (e) {
+            return t.onkeypress.call(t,e);
+        });
+
+        addEvent(document,'keydown',function (e) {
+            return t.onkeydown.call(t,e);
+        });
     };
 
     /**
@@ -247,19 +279,13 @@ function Hotkeys() {
     };
 }
 
-addInitEvent(function(){
+/**
+ * Init function for hotkeys. Called from js.php, to ensure hotkyes are 
initialized after toolbar.
+ * Call of addInitEvent(initializeHotkeys) is unnecessary now.
+ *
+ * @author Marek Sacha <sachamar@xxxxxxxxxxx>
+ */
+function initializeHotkeys() {
     var hotkeys = new Hotkeys();
     hotkeys.initialize();
-
-    addEvent(document,'keyup',function (e) {
-        return hotkeys.onkeyup.call(hotkeys,e);
-    });
-
-    addEvent(document,'keypress',function (e) {
-        return hotkeys.onkeypress.call(hotkeys,e);
-    });
-
-    addEvent(document,'keydown',function (e) {
-        return hotkeys.onkeydown.call(hotkeys,e);
-    });
-});
\ No newline at end of file
+}
\ No newline at end of file
-- 
1.6.0.2


--------------020507080601080706080507--
-- 
DokuWiki mailing list - more info at
http://www.dokuwiki.org/mailinglist

Other related posts:

  • » [PATCH] Reimplementation of Accesskeys in javascript (FS#1809), toolbar accesskyes fix. - Marek Sacha