/* we could check e.button, but which is more consistent */ if (e.which) {
m.button.left = (e.which == 1);
m.button.middle = (e.which == 2);
m.button.right = (e.which == 3);
_browserAlreadyHasMouseEnterAndLeave: function () { return /MSIE/.test(navigator.userAgent);
},
_mouseEnterListener: function (src, sig, func, obj) { var E = MochiKit.Signal.Event; returnfunction (nativeEvent) { var e = new E(src, nativeEvent); try {
e.relatedTarget().nodeName;
} catch (err) { /* probably hit a permission denied error; possibly one of *firefox'sscrewyanonymousDIVsinsideaninputelement. *Allowthiseventtopropogateup.
*/ return;
}
e.stop(); if (MochiKit.DOM.isChildNode(e.relatedTarget(), src)) { /* We've moved between our node and a child. Ignore. */ return;
}
e.type = function () { return sig; }; if (typeof(func) == "string") { return obj[func].apply(obj, [e]);
} else { return func.apply(obj, [e]);
}
};
},
_getDestPair: function (objOrFunc, funcOrStr) { var obj = null; var func = null; if (typeof(funcOrStr) != 'undefined') {
obj = objOrFunc;
func = funcOrStr; if (typeof(funcOrStr) == 'string') { if (typeof(objOrFunc[funcOrStr]) != "function") { thrownew Error("'funcOrStr' must be a function on 'objOrFunc'");
}
} elseif (typeof(funcOrStr) != 'function') { thrownew Error("'funcOrStr' must be a function or string");
}
} elseif (typeof(objOrFunc) != "function") { thrownew Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
} else {
func = objOrFunc;
} return [obj, func];
},
/** @id MochiKit.Signal.connect */
connect: function (src, sig, objOrFunc/* optional */, funcOrStr) {
src = MochiKit.DOM.getElement(src); var self = MochiKit.Signal;
if (typeof(sig) != 'string') { thrownew Error("'sig' must be a string");
}
var destPair = self._getDestPair(objOrFunc, funcOrStr); var obj = destPair[0]; var func = destPair[1]; if (typeof(obj) == 'undefined' || obj === null) {
obj = src;
}
var isDOM = !!(src.addEventListener || src.attachEvent); if (isDOM && (sig === "onmouseenter" || sig === "onmouseleave")
&& !self._browserAlreadyHasMouseEnterAndLeave()) { var listener = self._mouseEnterListener(src, sig.substr(2), func, obj); if (sig === "onmouseenter") {
sig = "onmouseover";
} else {
sig = "onmouseout";
}
} else { var listener = self._listener(src, sig, func, obj, isDOM);
}
if (!isDOM && typeof(src.__connect__) == 'function') { var args = MochiKit.Base.extend([ident], arguments, 1);
src.__connect__.apply(src, args);
}
return ident;
},
_disconnect: function (ident) { // already disconnected if (!ident.connected) { return;
}
ident.connected = false; // check isDOM if (!ident.isDOM) { return;
} var src = ident.source; var sig = ident.signal; var listener = ident.listener;
if (src.removeEventListener) {
src.removeEventListener(sig.substr(2), listener, false);
} elseif (src.detachEvent) {
src.detachEvent(sig, listener); // useCapture unsupported
} else { thrownew Error("'src' must be a DOM element");
}
},
/** @id MochiKit.Signal.disconnect */
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.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) {
self._disconnect(o); if (!self._lock) {
observers.splice(i, 1);
} else {
self._dirty = true;
} returntrue;
}
}
} else { var idx = m.findIdentical(observers, ident); if (idx >= 0) {
self._disconnect(ident); if (!self._lock) {
observers.splice(idx, 1);
} else {
self._dirty = true;
} returntrue;
}
} returnfalse;
},
/** @id MochiKit.Signal.disconnectAllTo */
disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) { var self = MochiKit.Signal; var observers = self._observers; var disconnect = self._disconnect; var locked = self._lock; var dirty = self._dirty; if (typeof(funcOrStr) === 'undefined') {
funcOrStr = null;
} for (var i = observers.length - 1; i >= 0; i--) { var ident = observers[i]; if (ident.objOrFunc === objOrFunc &&
(funcOrStr === null || ident.funcOrStr === funcOrStr)) {
disconnect(ident); if (locked) {
dirty = true;
} else {
observers.splice(i, 1);
}
}
}
self._dirty = dirty;
},
/** @id MochiKit.Signal.disconnectAll */
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; var i, ident; var locked = self._lock; var dirty = self._dirty; if (signals.length === 0) { // disconnect all for (i = observers.length - 1; i >= 0; i--) {
ident = observers[i]; if (ident.source === src) {
disconnect(ident); if (!locked) {
observers.splice(i, 1);
} else {
dirty = true;
}
}
}
} else { var sigs = {}; for (i = 0; i < signals.length; i++) {
sigs[signals[i]] = true;
} for (i = observers.length - 1; i >= 0; i--) {
ident = observers[i]; if (ident.source === src && ident.signal in sigs) {
disconnect(ident); if (!locked) {
observers.splice(i, 1);
} else {
dirty = true;
}
}
}
}
self._dirty = dirty;
},
/** @id MochiKit.Signal.signal */
signal: function (src, sig) { var self = MochiKit.Signal; var observers = self._observers;
src = MochiKit.DOM.getElement(src); var args = MochiKit.Base.extend(null, arguments, 2); var errors = [];
self._lock = true; for (var i = 0; i < observers.length; i++) { var ident = observers[i]; if (ident.source === src && ident.signal === sig &&
ident.connected) { try {
ident.listener.apply(src, args);
} catch (e) {
errors.push(e);
}
}
}
self._lock = false; if (self._dirty) {
self._dirty = false; for (var i = observers.length - 1; i >= 0; i--) { if (!observers[i].connected) {
observers.splice(i, 1);
}
}
} if (errors.length == 1) { throw errors[0];
} elseif (errors.length > 1) { var e = new Error("Multiple errors thrown in handling 'sig', see errors property");
e.errors = errors; throw e;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.