/**
* @file jQuery collection plugin that triggers events for common accessibility
* keys e.g. ENTER, SPACE, ESCAPE, ARROW KEYS on keydown
* @version 0.2.0
* @author Ian McBurnie <ianmcburnie@hotmail.com>
* @requires jquery
*/
(function($, window, document, undefined) {
var pluginName = 'jquery-common-keydown';
var normalizeEvent = function(type, e) {
return $.Event(type, {originalEvent: e});
};
/**
* jQuery collection plugin that triggers events for common accessibility
* keys e.g. ENTER, SPACE, ESCAPE, ARROW KEYS on keydown
*
* @method "jQuery.fn.commonKeyDown"
* @param {string} selector - when a selector is provided, the event handler
* is referred to as delegated. The handler is not called when the event
* occurs directly on the bound element, but only for descendants
* (inner elements) that match the selector.
* @fires {object} enterKeyDown
* @fires {object} escapeKeyDown
* @fires {object} spaceKeyDown
* @fires {object} pageUpKeyDown
* @fires {object} pageDownKeyDown
* @fires {object} endKeyDown
* @fires {object} homeKeyDown
* @fires {object} leftArrowKeyDown
* @fires {object} upArrowKeyDown
* @fires {object} downArrowKeyDown
* @fires {object} rightArrowKeyDown
* @return {jQuery} chainable jQuery class
*/
$.fn.commonKeyDown = function commonKeyDown(selector) {
return this.each(function onEach(selector) {
// check element does not already have this plugin
if (!$.data(this, pluginName)) {
jQuery.data(this, pluginName, 'true');
var $this = $(this);
var keyCodes = $.fn.commonKeyDown.keyCodes;
var onKeyDown = function(e) {
switch (e.keyCode) {
case keyCodes.ENTER:
$this.trigger(normalizeEvent('enterKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.ESCAPE:
$this.trigger(normalizeEvent('escapeKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.SPACE:
$this.trigger(normalizeEvent('spaceKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.PAGEUP:
$this.trigger(normalizeEvent('pageUpKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.PAGEDOWN:
$this.trigger(normalizeEvent('pageDownKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.END:
$this.trigger(normalizeEvent('endKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.HOME:
$this.trigger(normalizeEvent('homeKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.LEFTARROW:
$this.trigger(normalizeEvent('leftArrowKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.UPARROW:
$this.trigger(normalizeEvent('upArrowKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.RIGHTARROW:
$this.trigger(normalizeEvent('rightArrowKeyDown', e));
/* istanbul ignore next */
break;
case keyCodes.DOWNARROW:
$this.trigger(normalizeEvent('downArrowKeyDown', e));
/* istanbul ignore next */
break;
/* istanbul ignore next */
default:
break;
}
};
$this.on('keydown', selector, onKeyDown);
}
});
};
$.fn.commonKeyDown.keyCodes = {
ENTER: 13,
ESCAPE: 27,
SPACE: 32,
PAGEUP: 33,
PAGEDOWN: 34,
END: 35,
HOME: 36,
LEFTARROW: 37,
UPARROW: 38,
RIGHTARROW: 39,
DOWNARROW: 40
};
}(jQuery, window, document));