From 3bafd77eeae55a6738bb708b240788f51ded1ac1 Mon Sep 17 00:00:00 2001 From: Alexis Deveria Date: Thu, 1 Apr 2010 17:38:23 +0000 Subject: [PATCH] Fixed issue 519 by updating hotkeys script to jeresig's version git-svn-id: http://svg-edit.googlecode.com/svn/trunk@1495 eee81c28-f429-11dd-99c0-75d572ba1ddd --- editor/js-hotkeys/README.md | 82 +++++-------------------- editor/js-hotkeys/jquery.hotkeys.min.js | 34 +++++----- editor/svg-editor.js | 10 +-- 3 files changed, 37 insertions(+), 89 deletions(-) diff --git a/editor/js-hotkeys/README.md b/editor/js-hotkeys/README.md index 4abcd7ab..696e9894 100644 --- a/editor/js-hotkeys/README.md +++ b/editor/js-hotkeys/README.md @@ -1,47 +1,32 @@ #About -**jQuery.hotkeys** is a plug-in that lets you easily add and remove handlers for keyboard events anywhere in your code supporting almost any key combination. +**jQuery Hotkeys** is a plug-in that lets you easily add and remove handlers for keyboard events anywhere in your code supporting almost any key combination. -It is based on a library [Shortcut.js](http://www.openjs.com/scripts/events/keyboard_shortcuts/shortcut.js) written by [Binny V A](http://www.openjs.com/). +This plugin is based off of the plugin by Tzury Bar Yochay: [jQuery.hotkeys](http://github.com/tzuryby/hotkeys) The syntax is as follows: -
-$(expression).bind(,, );
-$(expression).unbind(,, );
 
-$(document).bind('keydown', 'Ctrl+a', fn);
-
-// e.g. replace '$' sign with 'EUR'
-$('input.foo').bind('keyup', '$', function(){
-    this.value = this.value.replace('$', 'EUR');
-});
-
-$('div.foo').unbind('keydown', 'Ctrl+a', fn);
-
-## [Live Demo](http://jshotkeys.googlepages.com/test-static-01.html) + $(expression).bind(types, keys, handler); + $(expression).unbind(types, handler); + + $(document).bind('keydown', 'ctrl+a', fn); + + // e.g. replace '$' sign with 'EUR' + $('input.foo').bind('keyup', '$', function(){ + this.value = this.value.replace('$', 'EUR'); + }); ## Types Supported types are `'keydown'`, `'keyup'` and `'keypress'` -## Options -The options are `'combi'` i.e. the key combination, and `'disableInInput'` which allow your code not to be executed when the cursor is located inside an input ( `$(elem).is('input') || $(elem).is('textarea')` ). - -As you can see, the key combination can be passed as string or as an object. You may pass an object in case you wish to override the default option for `disableInInput` which is set to `false`: -
-$(document).bind('keydown', {combi:'a', disableinInput: true}, fn);
-
-I.e. when cursor is within an input field, `'a'` will be inserted into the input field without interfering. +## Notes If you want to use more than one modifiers (e.g. alt+ctrl+z) you should define them by an alphabetical order e.g. alt+ctrl+shift -Modifiers are case insensitive, i.e. 'Ctrl+a' 'ctrl+a'. - -## Handler -In previous versions there was an option propagate which is removed now and implemented at the user code level. - -When using jQuery, if an event handler returns false, jQuery will call `stopPropagation()` and `preventDefault()` +Hotkeys aren't tracked if you're inside of an input element (unless you explicitly bind the hotkey directly to the input). This helps to avoid conflict with normal user typing. ## jQuery Compatibility -Tested with *jQuery 1.2.6* + +Works with jQuery 1.4.2 and newer. It known to be working with all the major browsers on all available platforms (Win/Mac/Linux) @@ -51,43 +36,10 @@ It known to be working with all the major browsers on all available platforms (W * Safari-3 * Chrome-0.2 -## Features added in this version (0.7.x) - * Implemented as $.fn - let you use `this`. - * jQuery selectors are supported. - * Extending `$.fn.bind` and `$.fn.unbind` so you get a single interface for binding events to handlers - -## Overriding jQuery -The plugin wraps the following jQuery methods: - * $.fn.bind - * $.fn.unbind - * $.find - -Even though the plugin overrides these methods, the original methods will *always* be called. - -The plugin will add functionality only for the `keydown`, `keyup` and `keypress` event types. Any other types are passed untouched to the original `'bind()'` and `'unbind()'` methods. - -Moreover, if you call `bind()` without passing the shortcut key combination e.g. `$(document).bind('keydown', fn)` only the original `'bind()'` method will be executed. - -I also modified the `$.fn.find` method by adding a single line at the top of the function body. here is the code: - -
-    jQuery.fn.find = function( selector ) {
-        // the line I added
-        this.query=selector;
-        // call jQuery original find
-        return jQuery.fn.__find__.apply(this, arguments);
-    };
-
- -You can read about this at [jQuery's User Group](http://groups.google.com/group/jquery-en/browse_thread/thread/18f9825e8d22f18d) - -###Notes +### Addendum Firefox is the most liberal one in the manner of letting you capture all short-cuts even those that are built-in in the browser such as `Ctrl-t` for new tab, or `Ctrl-a` for selecting all text. You can always bubble them up to the browser by returning `true` in your handler. Others, (IE) either let you handle built-in short-cuts, but will add their functionality after your code has executed. Or (Opera/Safari) will *not* pass those events to the DOM at all. -*So, if you bind `Ctrl-Q` or `Alt-F4` and your Safari/Opera window is closed don't be surprised.* - - -###Current Version is: beta 0.7 \ No newline at end of file +*So, if you bind `Ctrl-Q` or `Alt-F4` and your Safari/Opera window is closed don't be surprised.* \ No newline at end of file diff --git a/editor/js-hotkeys/jquery.hotkeys.min.js b/editor/js-hotkeys/jquery.hotkeys.min.js index 2060e5ba..52d95517 100644 --- a/editor/js-hotkeys/jquery.hotkeys.min.js +++ b/editor/js-hotkeys/jquery.hotkeys.min.js @@ -1,19 +1,15 @@ -(function(jQuery){jQuery.fn.__bind__=jQuery.fn.bind;jQuery.fn.__unbind__=jQuery.fn.unbind;jQuery.fn.__find__=jQuery.fn.find;var hotkeys={version:'0.7.9',override:/keypress|keydown|keyup/g,triggersMap:{},specialKeys:{27:'esc',9:'tab',32:'space',13:'return',8:'backspace',145:'scroll',20:'capslock',144:'numlock',19:'pause',45:'insert',36:'home',46:'del',35:'end',33:'pageup',34:'pagedown',37:'left',38:'up',39:'right',40:'down',109:'-',112:'f1',113:'f2',114:'f3',115:'f4',116:'f5',117:'f6',118:'f7',119:'f8',120:'f9',121:'f10',122:'f11',123:'f12',191:'/'},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":":","'":"\"",",":"<",".":">","/":"?","\\":"|"},newTrigger:function(type,combi,callback){var result={};result[type]={};result[type][combi]={cb:callback,disableInInput:false};return result;}};hotkeys.specialKeys=jQuery.extend(hotkeys.specialKeys,{96:'0',97:'1',98:'2',99:'3',100:'4',101:'5',102:'6',103:'7',104:'8',105:'9',106:'*',107:'+',109:'-',110:'.',111:'/'});jQuery.fn.find=function(selector){this.query=selector;return jQuery.fn.__find__.apply(this,arguments);};jQuery.fn.unbind=function(type,combi,fn){if(jQuery.isFunction(combi)){fn=combi;combi=null;} -if(combi&&typeof combi==='string'){var selectorId=((this.prevObject&&this.prevObject.query)||(this[0].id&&this[0].id)||this[0]).toString();var hkTypes=type.split(' ');for(var x=0;x","/":"?","\\":"|"}};function a(d){if(typeof d.data!=="string"){return}var c=d.handler,e=d.data.toLowerCase().split(" ");d.handler=function(n){if(this!==n.target&&(/textarea|select/i.test(n.target.nodeName)||n.target.type==="text")){return}var h=n.type!=="keypress"&&b.hotkeys.specialKeys[n.which],o=String.fromCharCode(n.which).toLowerCase(),k,m="",g={};if(n.altKey&&h!=="alt"){m+="alt+"}if(n.ctrlKey&&h!=="ctrl"){m+="ctrl+"}if(n.metaKey&&!n.ctrlKey&&h!=="meta"){m+="meta+"}if(n.shiftKey&&h!=="shift"){m+="shift+"}if(h){g[m+h]=true}else{g[m+o]=true;g[m+b.hotkeys.shiftNums[o]]=true;if(m==="shift+"){g[b.hotkeys.shiftNums[o]]=true}}for(var j=0,f=e.length;j').prependTo(btn_holder); input.val(defText || ''); - input.bind('keydown', {combi:'return'}, function() {ok.click();}); + input.bind('keydown', 'return', function() {ok.click();}); } box.show(); @@ -623,7 +623,7 @@ $(this).mouseup(func); if(opts.key) { - $(document).bind('keydown', {combi: opts.key+'', disableInInput:true}, func); + $(document).bind('keydown', opts.key+'', func); } }); @@ -894,7 +894,7 @@ }); } if(btn.key) { - $(document).bind('keydown', {combi: btn.key, disableInInput: true}, func); + $(document).bind('keydown', btn.key, func); if(btn.title) button.attr("title", btn.title + ' ['+btn.key+']'); } } else { @@ -2944,7 +2944,7 @@ keyval += ''; $.each(keyval.split('/'), function(i, key) { - $(document).bind('keydown', {combi: key, disableInInput: disInInp}, function(e) { + $(document).bind('keydown', key, function(e) { fn(); if(pd) { e.preventDefault(); @@ -2973,7 +2973,7 @@ // Misc additional actions // Make "return" keypress trigger the change event - $('.attr_changer, #image_url').bind('keydown', {combi:'return'}, + $('.attr_changer, #image_url').bind('keydown', 'return', function(evt) {$(this).change();evt.preventDefault();} );