Version 3.18.1

APIs

  • Begin typing in the search box above to see results.
Show:

File: event/js/key.js

 /**
 * Functionality to listen for one or more specific key combinations.
 * @module event
 * @submodule event-key
 */
 
 var ALT = "+alt",
 CTRL = "+ctrl",
 META = "+meta",
 SHIFT = "+shift",
 
 trim = Y.Lang.trim,
 
 eventDef = {
 KEY_MAP: {
 enter : 13,
 space : 32,
 esc : 27,
 backspace: 8,
 tab : 9,
 pageup : 33,
 pagedown : 34
 },
 
 _typeRE: /^(up|down|press):/,
 _keysRE: /^(?:up|down|press):|\+(alt|ctrl|meta|shift)/g,
 
 processArgs: function (args) {
 var spec = args.splice(3,1)[0],
 mods = Y.Array.hash(spec.match(/\+(?:alt|ctrl|meta|shift)\b/g) || []),
 config = {
 type: this._typeRE.test(spec) ? RegExp.1ドル : null,
 mods: mods,
 keys: null
 },
 // strip type and modifiers from spec, leaving only keyCodes
 bits = spec.replace(this._keysRE, ''),
 chr, uc, lc, i;
 
 if (bits) {
 bits = bits.split(',');
 
 config.keys = {};
 
 // FIXME: need to support '65,esc' => keypress, keydown
 for (i = bits.length - 1; i >= 0; --i) {
 chr = trim(bits[i]);
 
 // catch sloppy filters, trailing commas, etc 'a,,'
 if (!chr) {
 continue;
 }
 
 // non-numerics are single characters or key names
 if (+chr == chr) {
 config.keys[chr] = mods;
 } else {
 lc = chr.toLowerCase();
 
 if (this.KEY_MAP[lc]) {
 config.keys[this.KEY_MAP[lc]] = mods;
 // FIXME: '65,enter' defaults keydown for both
 if (!config.type) {
 config.type = "down"; // safest
 }
 } else {
 // FIXME: Character mapping only works for keypress
 // events. Otherwise, it uses String.fromCharCode()
 // from the keyCode, which is wrong.
 chr = chr.charAt(0);
 uc = chr.toUpperCase();
 
 if (mods["+shift"]) {
 chr = uc;
 }
 
 // FIXME: stupid assumption that
 // the keycode of the lower case == the
 // charCode of the upper case
 // a (key:65,char:97), A (key:65,char:65)
 config.keys[chr.charCodeAt(0)] =
 (chr === uc) ?
 // upper case chars get +shift free
 Y.merge(mods, { "+shift": true }) :
 mods;
 }
 }
 }
 }
 
 if (!config.type) {
 config.type = "press";
 }
 
 return config;
 },
 
 on: function (node, sub, notifier, filter) {
 var spec = sub._extra,
 type = "key" + spec.type,
 keys = spec.keys,
 method = (filter) ? "delegate" : "on";
 
 // Note: without specifying any keyCodes, this becomes a
 // horribly inefficient alias for 'keydown' (et al), but I
 // can't abort this subscription for a simple
 // Y.on('keypress', ...);
 // Please use keyCodes or just subscribe directly to keydown,
 // keyup, or keypress
 sub._detach = node[method](type, function (e) {
 var key = keys ? keys[e.which] : spec.mods;
 
 if (key &&
 (!key[ALT] || (key[ALT] && e.altKey)) &&
 (!key[CTRL] || (key[CTRL] && e.ctrlKey)) &&
 (!key[META] || (key[META] && e.metaKey)) &&
 (!key[SHIFT] || (key[SHIFT] && e.shiftKey)))
 {
 notifier.fire(e);
 }
 }, filter);
 },
 
 detach: function (node, sub, notifier) {
 sub._detach.detach();
 }
 };
 
 eventDef.delegate = eventDef.on;
 eventDef.detachDelegate = eventDef.detach;
 
 /**
 * <p>Add a key listener. The listener will only be notified if the
 * keystroke detected meets the supplied specification. The
 * specification is a string that is defined as:</p>
 *
 * <dl>
 * <dt>spec</dt>
 * <dd><code>[{type}:]{code}[,{code}]*</code></dd>
 * <dt>type</dt>
 * <dd><code>"down", "up", or "press"</code></dd>
 * <dt>code</dt>
 * <dd><code>{keyCode|character|keyName}[+{modifier}]*</code></dd>
 * <dt>modifier</dt>
 * <dd><code>"shift", "ctrl", "alt", or "meta"</code></dd>
 * <dt>keyName</dt>
 * <dd><code>"enter", "space", "backspace", "esc", "tab", "pageup", or "pagedown"</code></dd>
 * </dl>
 *
 * <p>Examples:</p>
 * <ul>
 * <li><code>Y.on("key", callback, "press:12,65+shift+ctrl", "#my-input");</code></li>
 * <li><code>Y.delegate("key", preventSubmit, "#forms", "enter", "input[type=text]");</code></li>
 * <li><code>Y.one("doc").on("key", viNav, "j,k,l,;");</code></li>
 * </ul>
 *
 * @event key
 * @for YUI
 * @param type {string} 'key'
 * @param fn {function} the function to execute
 * @param id {string|HTMLElement|collection} the element(s) to bind
 * @param spec {string} the keyCode and modifier specification
 * @param o optional context object
 * @param args 0..n additional arguments to provide to the listener.
 * @return {Event.Handle} the detach handle
 */
 Y.Event.define('key', eventDef, true);
 
 

AltStyle によって変換されたページ (->オリジナル) /