

Keymaster.js: painless keyboard shortcuts for javascript - bmaeser
https://github.com/madrobby/keymaster

======
TrevorBurnham
Hmm. Binds all events to `document`, which means that if you type something in
a text field, it'll still trigger the event. (One of the TODOs is "Make
behavior with INPUT / SELECT / TEXTAREA configurable.)

Thing is, jQuery Hotkeys (<https://github.com/jeresig/jquery.hotkeys>) is more
versatile (since you can bind events to any element), works under a wider
range of browsers, and is nearly as lightweight (if you already depend on
jQuery).

Though, I do like the hipness of using "⌥" and "⌘" instead of "alt" and
"meta". I might make a fork of jQuery Hotkeys just for that.

~~~
madrobby
It doesn't trigger events if you're in a INPUT/TEXTAREA/SELECT.

The todo refers to making this configurable in a per-shortcut fashion.

~~~
TrevorBurnham
Ah, my bad. I didn't catch the line "if (tagName == 'INPUT' || tagName ==
'SELECT' || tagName == 'TEXTAREA') return;", which is indeed a sensible
default.

------
jstepien
Why would you store a minified version in the VCS, especially not having it in
sync with the original source code? Shouldn't it be an artefact kept out of
the VCS and built automatically by, for example, make and UglifyJS?

~~~
thomasfl
It's more convenient with a minified source layoung around somewhere. Also
it's quite small:

(function(a){function j(a){d=a||"all"}function i(a,c,d){var
g,h;d===undefined&&(d=c,c="all"),a=a.replace(/\s/g,""),g=a.split(","),g.forEach(function(a){h=[],a=a.split("+"),a.length>1&&(h=a.slice(0,a.length-1).map(function(a){return
e[a]}),a=[a[a.length-1]]),a=a[0],a=a.length>1?f[a]:a.toUpperCase().charCodeAt(0),a
in b||(b[a]=[]),b[a].push({scope:c,method:d,mods:h})})}function h(a){var
b=""+a.keyCode;b in c&&(c[b]=!1)}function g(a){var
e,f;f=a.target.tagName,e=""+a.keyCode;if(e in c)return
c[e]=!0;if(f!="INPUT"&&f!="SELECT"&&f!="TEXTAREA"){if(!(e in
b))return;b[e].forEach(function(b){(b.scope==d||b.scope=="all")&&(b.mods.length==0&&!c[16]&&!c[18]&&!c[17]&&!c[91]||b.mods.length>0&&b.mods.every(function(a){return
c[a]}))&&b.method(a,b.key,b.scope)===!1&&(a.stopPropagation(),a.preventDefault())})}}var
b={},c={16:!1,18:!1,17:!1,91:!1},d="all",e={shift:16,option:18,"⌥":18,alt:18,ctrl:17,control:17,command:91,"⌘":91},f={backspace:8,tab:9,enter:13,"return":13,escape:27,space:32,left:37,up:38,right:39,down:40};document.addEventListener("keydown",g,!1),document.addEventListener("keyup",h,!1),a.key=i,a.keyScope=j})(this)

~~~
joelhaasnoot
By putting the source on github you're inviting people to use your code in
their projects, and pick it apart. It's next to impossible to pick apart like
this. In addition, a minified version is a build product, which you don't put
in a VCS. Offer the minified version as a download, that's what that feature
is there for.

~~~
exogen
Putting build artifacts in source control does seem a bit strange.
Nevertheless, it's very common practice with JavaScript libraries.

------
studiofellow
To a javascript mortal (i.e. someone who lacks sufficient proficiency to write
or contribute to a library) this is refreshing. Looking forward to ignoring
event.keyCode in my next project. Thanks for this.

------
program
I like the fact that this library has no dependencies. I suggest that the
__MAP_ variable in keymaster.js should be equal to the _specialKeys_ variable
defined in jquery.hotkeys.js.

[https://github.com/jeresig/jquery.hotkeys/blob/master/jquery...](https://github.com/jeresig/jquery.hotkeys/blob/master/jquery.hotkeys.js)

in order to cover all special keys.

------
anon_koder
Did I miss the demo gh-page ?

------
mrbogle
Cool. I have a nit:

91 for Mac meta/command is the left-hand button in webkit only. It's 224 in
Firefox, and the right-hand one in webkit is 93.

Also, how to I bind to page up/down?

------
timdown
Why is IE < 9 support a low priority? Adding support would be pretty simple
and wouldn't add much code, and IE < 9 is still used by a significant
proportion of users.

------
Myrth
Please add todo for unbinding key maps (specific/all). For example if page
contains ajax loaded partials.

------
ruffdev
Why do we have a semicolon at the start?

;(function(global)

------
tomlin
Look, github is great and all, but will linking to your github repo really
entice me to use your library? If its brownie points you're looking for in
using github, you lost them by not providing a demo of the library and only a
tiny bit of code that explains what it does.

~~~
joeshaw
One of things I like about github is that it's done a great job of enticing
developers to write good README files. I've seen many projects that do a fine
job of introducing the project, listing things like license, dependencies,
etc., and showing example code of how it works. Often times it also links to a
demo or screencasts. For most projects, this seems good enough -- most project
web sites don't add any more value.

