How to add robust keyboard shortcuts to your site
blog.bugsnag.com
blog.bugsnag.com
The real root of the problem here is systematically tying UI actions to events on specific elements in the DOM. Instead of working around it, why not write slightly cleaner code in the first place?
It's also not strictly necessary to use a third-party library for this unless you're butting heads with one of the edge cases the library is designed to solve.
// Make a global page actions object
PageActions = {
selectAll: function (event, context) {...},
nextPage: function (event, context) {...},
prevPage: function (event, context) {...},
};
// Hook up clicks to global actions
// Eg: <a href="#" data-action="selectAll">All</a>
$("[data-action]").click(function () {
var action = $(this).data("action");
PageActions.selectAll("click", this);
});
// Hook up keypresses to global actions
Mousetrap.bind("a", function () {
PageActions.selectAll("keypress", this);
});
This would help with code structure and organization, at the cost of flexibility.The whole thing ends up being about ten lines of code to implement and handles event binding for practically the entire application. Literally ends up cutting out thousands of lines of boilerplate in larger applications.
I've also found that the actual event object is only useful in a very small amount of cases (drag events and such), to the point where if I ever really need to pass it along, I'll just write a custom event controller for it (using data-handler to specify the custom controller).
When I have too much free time on my hands, I cut out the data attributes entirely and instead route using good old normal hrefs, which as a bonus can render on their own if something goes wrong with the JS.