v1.0
只读模式 group, 分享 评论更多问题 博客标签总是存在一个
This commit is contained in:
204
public/tinymce/classes/util/Observable.js
Normal file → Executable file
204
public/tinymce/classes/util/Observable.js
Normal file → Executable file
@ -14,20 +14,21 @@
|
||||
* @mixin tinymce.util.Observable
|
||||
*/
|
||||
define("tinymce/util/Observable", [
|
||||
"tinymce/util/Tools"
|
||||
], function(Tools) {
|
||||
var bindingsName = "__bindings";
|
||||
var nativeEvents = Tools.makeMap(
|
||||
"focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange" +
|
||||
" mouseout mouseenter mouseleave keydown keypress keyup contextmenu dragend dragover draggesture dragdrop drop drag", ' '
|
||||
);
|
||||
"tinymce/util/EventDispatcher"
|
||||
], function(EventDispatcher) {
|
||||
function getEventDispatcher(obj) {
|
||||
if (!obj._eventDispatcher) {
|
||||
obj._eventDispatcher = new EventDispatcher({
|
||||
scope: obj,
|
||||
toggleEvent: function(name, state) {
|
||||
if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {
|
||||
obj.toggleNativeEvent(name, state);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function returnFalse() {
|
||||
return false;
|
||||
}
|
||||
|
||||
function returnTrue() {
|
||||
return true;
|
||||
return obj._eventDispatcher;
|
||||
}
|
||||
|
||||
return {
|
||||
@ -36,73 +37,25 @@ define("tinymce/util/Observable", [
|
||||
*
|
||||
* @method fire
|
||||
* @param {String} name Name of the event to fire.
|
||||
* @param {tinymce.Event/Object?} args Event arguments.
|
||||
* @param {Object?} args Event arguments.
|
||||
* @param {Boolean?} bubble True/false if the event is to be bubbled.
|
||||
* @return {tinymce.Event} Event instance passed in converted into tinymce.Event instance.
|
||||
* @return {Object} Event args instance passed in.
|
||||
* @example
|
||||
* instance.fire('event', {...});
|
||||
*/
|
||||
fire: function(name, args, bubble) {
|
||||
var self = this, handlers, i, l, callback, parent;
|
||||
var self = this;
|
||||
|
||||
name = name.toLowerCase();
|
||||
args = args || {};
|
||||
args.type = name;
|
||||
|
||||
// Setup target is there isn't one
|
||||
if (!args.target) {
|
||||
args.target = self;
|
||||
// Prevent all events except the remove event after the instance has been removed
|
||||
if (self.removed && name !== "remove") {
|
||||
return args;
|
||||
}
|
||||
|
||||
// Add event delegation methods if they are missing
|
||||
if (!args.preventDefault) {
|
||||
// Add preventDefault method
|
||||
args.preventDefault = function() {
|
||||
args.isDefaultPrevented = returnTrue;
|
||||
};
|
||||
|
||||
// Add stopPropagation
|
||||
args.stopPropagation = function() {
|
||||
args.isPropagationStopped = returnTrue;
|
||||
};
|
||||
|
||||
// Add stopImmediatePropagation
|
||||
args.stopImmediatePropagation = function() {
|
||||
args.isImmediatePropagationStopped = returnTrue;
|
||||
};
|
||||
|
||||
// Add event delegation states
|
||||
args.isDefaultPrevented = returnFalse;
|
||||
args.isPropagationStopped = returnFalse;
|
||||
args.isImmediatePropagationStopped = returnFalse;
|
||||
}
|
||||
|
||||
//console.log(name, args);
|
||||
|
||||
if (self[bindingsName]) {
|
||||
handlers = self[bindingsName][name];
|
||||
|
||||
if (handlers) {
|
||||
for (i = 0, l = handlers.length; i < l; i++) {
|
||||
handlers[i] = callback = handlers[i];
|
||||
|
||||
// Stop immediate propagation if needed
|
||||
if (args.isImmediatePropagationStopped()) {
|
||||
break;
|
||||
}
|
||||
|
||||
// If callback returns false then prevent default and stop all propagation
|
||||
if (callback.call(self, args) === false) {
|
||||
args.preventDefault();
|
||||
return args;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
args = getEventDispatcher(self).fire(name, args, bubble);
|
||||
|
||||
// Bubble event up to parents
|
||||
if (bubble !== false && self.parent) {
|
||||
parent = self.parent();
|
||||
var parent = self.parent();
|
||||
while (parent && !args.isPropagationStopped()) {
|
||||
parent.fire(name, args, false);
|
||||
parent = parent.parent();
|
||||
@ -118,45 +71,15 @@ define("tinymce/util/Observable", [
|
||||
* @method on
|
||||
* @param {String} name Event name or space separated list of events to bind.
|
||||
* @param {callback} callback Callback to be executed when the event occurs.
|
||||
* @param {Boolean} first Optional flag if the event should be prepended. Use this with care.
|
||||
* @return {Object} Current class instance.
|
||||
* @example
|
||||
* instance.on('event', function(e) {
|
||||
* // Callback logic
|
||||
* });
|
||||
*/
|
||||
on: function(name, callback) {
|
||||
var self = this, bindings, handlers, names, i;
|
||||
|
||||
if (callback === false) {
|
||||
callback = function() {
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
if (callback) {
|
||||
names = name.toLowerCase().split(' ');
|
||||
i = names.length;
|
||||
while (i--) {
|
||||
name = names[i];
|
||||
|
||||
bindings = self[bindingsName];
|
||||
if (!bindings) {
|
||||
bindings = self[bindingsName] = {};
|
||||
}
|
||||
|
||||
handlers = bindings[name];
|
||||
if (!handlers) {
|
||||
handlers = bindings[name] = [];
|
||||
if (self.bindNative && nativeEvents[name]) {
|
||||
self.bindNative(name);
|
||||
}
|
||||
}
|
||||
|
||||
handlers.push(callback);
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
on: function(name, callback, prepend) {
|
||||
return getEventDispatcher(this).on(name, callback, prepend);
|
||||
},
|
||||
|
||||
/**
|
||||
@ -177,65 +100,30 @@ define("tinymce/util/Observable", [
|
||||
* instance.off();
|
||||
*/
|
||||
off: function(name, callback) {
|
||||
var self = this, i, bindings = self[bindingsName], handlers, bindingName, names, hi;
|
||||
|
||||
if (bindings) {
|
||||
if (name) {
|
||||
names = name.toLowerCase().split(' ');
|
||||
i = names.length;
|
||||
while (i--) {
|
||||
name = names[i];
|
||||
handlers = bindings[name];
|
||||
|
||||
// Unbind all handlers
|
||||
if (!name) {
|
||||
for (bindingName in bindings) {
|
||||
bindings[name].length = 0;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
if (handlers) {
|
||||
// Unbind all by name
|
||||
if (!callback) {
|
||||
handlers.length = 0;
|
||||
} else {
|
||||
// Unbind specific ones
|
||||
hi = handlers.length;
|
||||
while (hi--) {
|
||||
if (handlers[hi] === callback) {
|
||||
handlers.splice(hi, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!handlers.length && self.unbindNative && nativeEvents[name]) {
|
||||
self.unbindNative(name);
|
||||
delete bindings[name];
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (self.unbindNative) {
|
||||
for (name in bindings) {
|
||||
self.unbindNative(name);
|
||||
}
|
||||
}
|
||||
|
||||
self[bindingsName] = [];
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
return getEventDispatcher(this).off(name, callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Bind the event callback and once it fires the callback is removed.
|
||||
*
|
||||
* @method once
|
||||
* @param {String} name Name of the event to bind.
|
||||
* @param {callback} callback Callback to bind only once.
|
||||
* @return {Object} Current class instance.
|
||||
*/
|
||||
once: function(name, callback) {
|
||||
return getEventDispatcher(this).once(name, callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns true/false if the object has a event of the specified name.
|
||||
*
|
||||
* @method hasEventListeners
|
||||
* @param {String} name Name of the event to check for.
|
||||
* @return {Boolean} true/false if the event exists or not.
|
||||
*/
|
||||
hasEventListeners: function(name) {
|
||||
var bindings = this[bindingsName];
|
||||
|
||||
name = name.toLowerCase();
|
||||
|
||||
return !(!bindings || !bindings[name] || bindings[name].length === 0);
|
||||
return getEventDispatcher(this).has(name);
|
||||
}
|
||||
};
|
||||
});
|
Reference in New Issue
Block a user