diff --git a/jquery.shortcuts.js b/jquery.shortcuts.js index 1c404d7..2ca1979 100644 --- a/jquery.shortcuts.js +++ b/jquery.shortcuts.js @@ -1,14 +1,21 @@ /** - * JavaScript Shortcuts Library (jQuery plugin) v0.7 + * JavaScript Shortcuts Library (jQuery plugin) v0.8 * http://www.stepanreznikov.com/js-shortcuts/ * Copyright (c) 2010 Stepan Reznikov (stepan.reznikov@gmail.com) - * Date: 2010-08-08 + * Date: 2015-08-21 */ /*global jQuery */ (function($) { + var browser = { + mozilla : /firefox/.test(navigator.userAgent.toLowerCase()), + webkit : /webkit/.test(navigator.userAgent.toLowerCase()), + opera : /opera/.test(navigator.userAgent.toLowerCase()), + msie : /msie/.test(navigator.userAgent.toLowerCase()), + } + /** Special keys */ var special = { 'backspace': 8, @@ -41,8 +48,8 @@ 'f11': 122, 'f12': 123, '?': 191, // Question mark - 'minus': $.browser.opera ? [109, 45] : $.browser.mozilla ? 109 : [189, 109], - 'plus': $.browser.opera ? [61, 43] : $.browser.mozilla ? [61, 107] : [187, 107] + 'minus': browser.opera ? [109, 45] : browser.mozilla ? 109 : [189, 109], + 'plus': browser.opera ? [61, 43] : browser.mozilla ? [61, 107] : [187, 107] }; /** Hash for shortcut lists */ @@ -142,7 +149,7 @@ if (isStarted) { return; } // We are going to attach event handlers only once, the first time this method is called. - $(document).bind(($.browser.opera ? 'keypress' : 'keydown') + '.shortcuts', function(e) { + $(document).bind((browser.opera ? 'keypress' : 'keydown') + '.shortcuts', function(e) { // For a-z keydown and keyup the range is 65-90 and for keypress it's 97-122. if (e.type === 'keypress' && e.which >= 97 && e.which <= 122) { e.which = e.which - 32; diff --git a/jquery.shortcuts.min.js b/jquery.shortcuts.min.js index c9dd818..c790ee1 100644 --- a/jquery.shortcuts.min.js +++ b/jquery.shortcuts.min.js @@ -1 +1 @@ -(function(c){var u={backspace:8,tab:9,enter:13,pause:19,capslock:20,esc:27,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40,insert:45,"delete":46,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,"?":191,minus:c.browser.opera?[109,45]:c.browser.mozilla?109:[189,109],plus:c.browser.opera?[61,43]:c.browser.mozilla?[61,107]:[187,107]},k={},l,m={},n=false,o=function(b,a){var d=b;if(a.ctrl)d+="_ctrl";if(a.alt)d+="_alt";if(a.shift)d+="_shift"; var f=function(h,e){if(e&&e!==16&&e!==17&&e!==18)h+="_"+e;return h};if(c.isArray(a.which)){var g=[];c.each(a.which,function(h,e){g.push(f(d,e))});return g}else return f(d,a.which)},r=function(b){var a={};b=b.split("+");c.each(b,function(d,f){if(f==="ctrl"||f==="alt"||f==="shift")a[f]=true;else a.which=u[f]||f.toUpperCase().charCodeAt()});return a},v=function(b){var a=b.tagName.toLowerCase();b=b.type;return a==="input"&&c.inArray(b,["text","password","file","search"])>-1||a==="textarea"},p=function(b, a){if(l){var d=o(b,{ctrl:a.ctrlKey,alt:a.altKey,shift:a.shiftKey,which:a.which});if(d=l[d]){var f=v(a.target),g=false;c.each(d,function(h,e){if(!f||e.enableInInput){if(!g){a.preventDefault();g=true}e.handler(a)}})}}};c.Shortcuts={};c.Shortcuts.start=function(b){b=b||"default";l=k[b];if(!n){c(document).bind((c.browser.opera?"keypress":"keydown")+".shortcuts",function(a){if(a.type==="keypress"&&a.which>=97&&a.which<=122)a.which-=32;m[a.which]||p("down",a);m[a.which]=true;p("hold",a)});c(document).bind("keyup.shortcuts", function(a){m[a.which]=false;p("up",a)});n=true;return this}};c.Shortcuts.stop=function(){c(document).unbind("keypress.shortcuts keydown.shortcuts keyup.shortcuts");n=false;return this};c.Shortcuts.add=function(b){if(!b.mask)throw Error("$.Shortcuts.add: required parameter 'params.mask' is undefined.");if(!b.handler)throw Error("$.Shortcuts.add: required parameter 'params.handler' is undefined.");var a=b.type||"down",d=b.list?b.list.replace(/\s+/g,"").split(","):["default"];c.each(d,function(f,g){k[g]|| (k[g]={});var h=k[g],e=b.mask.toLowerCase().replace(/\s+/g,"").split(",");c.each(e,function(s,i){var j=r(i);j=o(a,j);c.isArray(j)||(j=[j]);c.each(j,function(t,q){h[q]||(h[q]=[]);h[q].push(b)})})});return this};c.Shortcuts.remove=function(b){if(!b.mask)throw Error("$.Shortcuts.remove: required parameter 'params.mask' is undefined.");var a=b.type||"down",d=b.list?b.list.replace(/\s+/g,"").split(","):["default"];c.each(d,function(f,g){if(!k[g])return true;var h=b.mask.toLowerCase().replace(/\s+/g,"").split(","); c.each(h,function(e,s){var i=r(s);i=o(a,i);c.isArray(i)||(i=[i]);c.each(i,function(j,t){delete k[g][t]})})});return this}})(jQuery); \ No newline at end of file +(function(e){var r={mozilla:/firefox/.test(navigator.userAgent.toLowerCase()),webkit:/webkit/.test(navigator.userAgent.toLowerCase()),opera:/opera/.test(navigator.userAgent.toLowerCase()),msie:/msie/.test(navigator.userAgent.toLowerCase())};var t={backspace:8,tab:9,enter:13,pause:19,capslock:20,esc:27,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40,insert:45,"delete":46,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,"?":191,minus:r.opera?[109,45]:r.mozilla?109:[189,109],plus:r.opera?[61,43]:r.mozilla?[61,107]:[187,107]};var a={};var i;var s={};var n=false;var o=function(r,t){var a=r;if(t.ctrl){a+="_ctrl"}if(t.alt){a+="_alt"}if(t.shift){a+="_shift"}var i=function(e,r){if(r&&r!==16&&r!==17&&r!==18){e+="_"+r}return e};if(e.isArray(t.which)){var s=[];e.each(t.which,function(e,r){s.push(i(a,r))});return s}else{return i(a,t.which)}};var u=function(r){var a={};var i=r.split("+");e.each(i,function(e,r){if(r==="ctrl"||r==="alt"||r==="shift"){a[r]=true}else{a.which=t[r]||r.toUpperCase().charCodeAt()}});return a};var c=function(r){var t=r.tagName.toLowerCase();var a=r.type;return t==="input"&&e.inArray(a,["text","password","file","search"])>-1||t==="textarea"};var f=function(r,t){if(!i){return}var a={ctrl:t.ctrlKey,alt:t.altKey,shift:t.shiftKey,which:t.which};var s=o(r,a);var n=i[s];if(!n){return}var u=c(t.target);var f=false;e.each(n,function(e,r){if(!u||r.enableInInput){if(!f){t.preventDefault();f=true}r.handler(t)}})};e.Shortcuts={};e.Shortcuts.start=function(t){t=t||"default";i=a[t];if(n){return}e(document).bind((r.opera?"keypress":"keydown")+".shortcuts",function(e){if(e.type==="keypress"&&e.which>=97&&e.which<=122){e.which=e.which-32}if(!s[e.which]){f("down",e)}s[e.which]=true;f("hold",e)});e(document).bind("keyup.shortcuts",function(e){s[e.which]=false;f("up",e)});n=true;return this};e.Shortcuts.stop=function(){e(document).unbind("keypress.shortcuts keydown.shortcuts keyup.shortcuts");n=false;return this};e.Shortcuts.add=function(r){if(!r.mask){throw new Error("$.Shortcuts.add: required parameter 'params.mask' is undefined.")}if(!r.handler){throw new Error("$.Shortcuts.add: required parameter 'params.handler' is undefined.")}var t=r.type||"down";var i=r.list?r.list.replace(/\s+/g,"").split(","):["default"];e.each(i,function(i,s){if(!a[s]){a[s]={}}var n=a[s];var c=r.mask.toLowerCase().replace(/\s+/g,"").split(",");e.each(c,function(a,i){var s=u(i);var c=o(t,s);if(!e.isArray(c)){c=[c]}e.each(c,function(e,t){if(!n[t]){n[t]=[]}n[t].push(r)})})});return this};e.Shortcuts.remove=function(r){if(!r.mask){throw new Error("$.Shortcuts.remove: required parameter 'params.mask' is undefined.")}var t=r.type||"down";var i=r.list?r.list.replace(/\s+/g,"").split(","):["default"];e.each(i,function(i,s){if(!a[s]){return true}var n=r.mask.toLowerCase().replace(/\s+/g,"").split(",");e.each(n,function(r,i){var n=u(i);var c=o(t,n);if(!e.isArray(c)){c=[c]}e.each(c,function(e,r){delete a[s][r]})})});return this}})(jQuery); \ No newline at end of file diff --git a/test.html b/test.html index 841091b..61f4643 100644 --- a/test.html +++ b/test.html @@ -172,7 +172,7 @@

JavaScript Shortcuts Library - Test page (hold)

- +