📄 signal.js
字号:
preventDefault: function () { if (this._event.preventDefault) { this._event.preventDefault(); } else { this._event.returnValue = false; } }});/* Safari sets keyCode to these special values onkeypress. */MochiKit.Signal._specialMacKeys = { 3: 'KEY_ENTER', 63289: 'KEY_NUM_PAD_CLEAR', 63276: 'KEY_PAGE_UP', 63277: 'KEY_PAGE_DOWN', 63275: 'KEY_END', 63273: 'KEY_HOME', 63234: 'KEY_ARROW_LEFT', 63232: 'KEY_ARROW_UP', 63235: 'KEY_ARROW_RIGHT', 63233: 'KEY_ARROW_DOWN', 63302: 'KEY_INSERT', 63272: 'KEY_DELETE'};/* for KEY_F1 - KEY_F12 */for (i = 63236; i <= 63242; i++) { MochiKit.Signal._specialMacKeys[i] = 'KEY_F' + (i - 63236 + 1); // no F0}/* Standard keyboard key codes. */MochiKit.Signal._specialKeys = { 8: 'KEY_BACKSPACE', 9: 'KEY_TAB', 12: 'KEY_NUM_PAD_CLEAR', // weird, for Safari and Mac FF only 13: 'KEY_ENTER', 16: 'KEY_SHIFT', 17: 'KEY_CTRL', 18: 'KEY_ALT', 19: 'KEY_PAUSE', 20: 'KEY_CAPS_LOCK', 27: 'KEY_ESCAPE', 32: 'KEY_SPACEBAR', 33: 'KEY_PAGE_UP', 34: 'KEY_PAGE_DOWN', 35: 'KEY_END', 36: 'KEY_HOME', 37: 'KEY_ARROW_LEFT', 38: 'KEY_ARROW_UP', 39: 'KEY_ARROW_RIGHT', 40: 'KEY_ARROW_DOWN', 44: 'KEY_PRINT_SCREEN', 45: 'KEY_INSERT', 46: 'KEY_DELETE', 59: 'KEY_SEMICOLON', // weird, for Safari and IE only 91: 'KEY_WINDOWS_LEFT', 92: 'KEY_WINDOWS_RIGHT', 93: 'KEY_SELECT', 106: 'KEY_NUM_PAD_ASTERISK', 107: 'KEY_NUM_PAD_PLUS_SIGN', 109: 'KEY_NUM_PAD_HYPHEN-MINUS', 110: 'KEY_NUM_PAD_FULL_STOP', 111: 'KEY_NUM_PAD_SOLIDUS', 144: 'KEY_NUM_LOCK', 145: 'KEY_SCROLL_LOCK', 186: 'KEY_SEMICOLON', 187: 'KEY_EQUALS_SIGN', 188: 'KEY_COMMA', 189: 'KEY_HYPHEN-MINUS', 190: 'KEY_FULL_STOP', 191: 'KEY_SOLIDUS', 192: 'KEY_GRAVE_ACCENT', 219: 'KEY_LEFT_SQUARE_BRACKET', 220: 'KEY_REVERSE_SOLIDUS', 221: 'KEY_RIGHT_SQUARE_BRACKET', 222: 'KEY_APOSTROPHE' // undefined: 'KEY_UNKNOWN'};/* for KEY_0 - KEY_9 */for (var i = 48; i <= 57; i++) { MochiKit.Signal._specialKeys[i] = 'KEY_' + (i - 48);}/* for KEY_A - KEY_Z */for (i = 65; i <= 90; i++) { MochiKit.Signal._specialKeys[i] = 'KEY_' + String.fromCharCode(i);}/* for KEY_NUM_PAD_0 - KEY_NUM_PAD_9 */for (i = 96; i <= 105; i++) { MochiKit.Signal._specialKeys[i] = 'KEY_NUM_PAD_' + (i - 96);}/* for KEY_F1 - KEY_F12 */for (i = 112; i <= 123; i++) { MochiKit.Signal._specialKeys[i] = 'KEY_F' + (i - 112 + 1); // no F0}MochiKit.Base.update(MochiKit.Signal, { __repr__: function () { return '[' + this.NAME + ' ' + this.VERSION + ']'; }, toString: function () { return this.__repr__(); }, _unloadCache: function () { var self = MochiKit.Signal; var observers = self._observers; for (var i = 0; i < observers.length; i++) { self._disconnect(observers[i]); } delete self._observers; try { window.onload = undefined; } catch(e) { // pass } try { window.onunload = undefined; } catch(e) { // pass } }, _listener: function (src, func, obj, isDOM) { var E = MochiKit.Signal.Event; if (!isDOM) { return MochiKit.Base.bind(func, obj); } obj = obj || src; if (typeof(func) == "string") { return function (nativeEvent) { obj[func].apply(obj, [new E(src, nativeEvent)]); }; } else { return function (nativeEvent) { func.apply(obj, [new E(src, nativeEvent)]); }; } }, connect: function (src, sig, objOrFunc/* optional */, funcOrStr) { src = MochiKit.DOM.getElement(src); var self = MochiKit.Signal; if (typeof(sig) != 'string') { throw new Error("'sig' must be a string"); } var obj = null; var func = null; if (typeof(funcOrStr) != 'undefined') { obj = objOrFunc; func = funcOrStr; if (typeof(funcOrStr) == 'string') { if (typeof(objOrFunc[funcOrStr]) != "function") { throw new Error("'funcOrStr' must be a function on 'objOrFunc'"); } } else if (typeof(funcOrStr) != 'function') { throw new Error("'funcOrStr' must be a function or string"); } } else if (typeof(objOrFunc) != "function") { throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given"); } else { func = objOrFunc; } if (typeof(obj) == 'undefined' || obj === null) { obj = src; } var isDOM = !!(src.addEventListener || src.attachEvent); var listener = self._listener(src, func, obj, isDOM); if (src.addEventListener) { src.addEventListener(sig.substr(2), listener, false); } else if (src.attachEvent) { src.attachEvent(sig, listener); // useCapture unsupported } var ident = [src, sig, listener, isDOM, objOrFunc, funcOrStr]; self._observers.push(ident); return ident; }, _disconnect: function (ident) { // check isDOM if (!ident[3]) { return; } var src = ident[0]; var sig = ident[1]; var listener = ident[2]; if (src.removeEventListener) { src.removeEventListener(sig.substr(2), listener, false); } else if (src.detachEvent) { src.detachEvent(sig, listener); // useCapture unsupported } else { throw new Error("'src' must be a DOM element"); } }, disconnect: function (ident) { var self = MochiKit.Signal; var observers = self._observers; var m = MochiKit.Base; if (arguments.length > 1) { // compatibility API var src = MochiKit.DOM.getElement(arguments[0]); var sig = arguments[1]; var obj = arguments[2]; var func = arguments[3]; for (var i = observers.length - 1; i >= 0; i--) { var o = observers[i]; if (o[0] === src && o[1] === sig && o[4] === obj && o[5] === func) { self._disconnect(o); observers.splice(i, 1); return true; } } } else { var idx = m.findIdentical(observers, ident); if (idx >= 0) { self._disconnect(ident); observers.splice(idx, 1); return true; } } return false; }, disconnectAll: function(src/* optional */, sig) { src = MochiKit.DOM.getElement(src); var m = MochiKit.Base; var signals = m.flattenArguments(m.extend(null, arguments, 1)); var self = MochiKit.Signal; var disconnect = self._disconnect; var observers = self._observers; if (signals.length === 0) { // disconnect all for (var i = observers.length - 1; i >= 0; i--) { var ident = observers[i]; if (ident[0] === src) { disconnect(ident); observers.splice(i, 1); } } } else { var sigs = {}; for (var i = 0; i < signals.length; i++) { sigs[signals[i]] = true; } for (var i = observers.length - 1; i >= 0; i--) { var ident = observers[i]; if (ident[0] === src && ident[1] in sigs) { disconnect(ident); observers.splice(i, 1); } } } }, signal: function (src, sig) { var observers = MochiKit.Signal._observers; src = MochiKit.DOM.getElement(src); var args = MochiKit.Base.extend(null, arguments, 2); var errors = []; for (var i = 0; i < observers.length; i++) { var ident = observers[i]; if (ident[0] === src && ident[1] === sig) { try { ident[2].apply(src, args); } catch (e) { errors.push(e); } } } if (errors.length == 1) { throw errors[0]; } else if (errors.length > 1) { var e = new Error("Multiple errors thrown in handling 'sig', see errors property"); e.errors = errors; throw e; } }});MochiKit.Signal.EXPORT_OK = [];MochiKit.Signal.EXPORT = [ 'connect', 'disconnect', 'signal', 'disconnectAll'];MochiKit.Signal.__new__ = function (win) { var m = MochiKit.Base; this._document = document; this._window = win; try { this.connect(window, 'onunload', this._unloadCache); } catch (e) { // pass: might not be a browser } this.EXPORT_TAGS = { ':common': this.EXPORT, ':all': m.concat(this.EXPORT, this.EXPORT_OK) }; m.nameFunctions(this);};MochiKit.Signal.__new__(this);//// XXX: Internet Explorer blows//if (!MochiKit.__compat__) { connect = MochiKit.Signal.connect; disconnect = MochiKit.Signal.disconnect; disconnectAll = MochiKit.Signal.disconnectAll; signal = MochiKit.Signal.signal;}MochiKit.Base._exportSymbols(this, MochiKit.Signal);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -