feature(events) add

This commit is contained in:
coderaiser 2014-05-28 08:28:35 -04:00
parent bac14f6694
commit 8241d59da0
3 changed files with 315 additions and 307 deletions

View file

@ -42,6 +42,7 @@
lib + 'util.js',
lib + 'cloudfunc.js',
client + 'dom.js',
client + 'events.js',
client + 'rest.js',
client + 'load.js',
client + 'notify.js',

View file

@ -305,311 +305,6 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog;
};
},
EventsProto = function() {
var Events = this,
parseArgs = function(eventName, element, listener, callback) {
var tmp, isFunc,
type = Util.getType(eventName);
switch(type) {
default:
tmp = eventName;
eventName = element;
element = tmp;
parseArgs(
eventName,
element,
listener,
callback
);
break;
case 'string':
isFunc = Util.isFunction(element);
if (isFunc) {
listener = element;
element = window;
}
callback(element || window,
eventName,
listener,
null);
break;
case 'array':
eventName.forEach(function(eventName) {
parseArgs(
eventName,
element,
listener,
callback
);
});
break;
case 'object':
Object.keys(eventName).forEach(function(name) {
var eventListener = eventName[name];
parseArgs(
name,
element,
eventListener,
callback
);
});
break;
}
};
/**
* safe add event listener
*
* @param type
* @param element {document by default}
* @param listener
*/
this.add = function(type, element, listener) {
Util.checkArgs(arguments, ['type']);
parseArgs(type, element, listener, function(element) {
var args = Util.slice(arguments, 1);
window.addEventListener.apply(element, args);
});
return Events;
};
/**
* safe add event listener
*
* @param type
* @param listener
* @param element {document by default}
*/
this.addOnce = function(type, element, listener) {
var once = function (event) {
Events.remove(type, element, once);
listener(event);
};
this.add(type, element, once);
return Events;
};
/**
* safe remove event listener
*
* @param type
* @param listener
* @param element {document by default}
*/
this.remove = function(type, element, listener) {
Util.checkArgs(arguments, ['type']);
parseArgs(type, listener, element, function(element) {
var args = Util.slice(arguments, 1);
window.removeEventListener.apply(element, args);
});
return Events;
};
/**
* safe add event keydown listener
*
* @param listener
*/
this.addKey = function() {
var name = 'keydown',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* safe remove event click listener
*
* @param listener
*/
this.rmKey = function() {
var name = 'keydown',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.remove.apply(this, args);
};
/**
* safe add event click listener
*
* @param listener
*/
this.addClick = function() {
var name = 'click',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* safe remove event click listener
*
* @param listener
*/
this.rmClick = function() {
var name = 'click',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.remove.apply(this, args);
};
this.addContextMenu = function() {
var name = 'contextmenu',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* safe add event click listener
*
* @param listener
*/
this.addError = function() {
var name = 'error',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* safe add load click listener
*
* @param listener
*/
this.addLoad = function() {
var name = 'load',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* crossbrowser create event
*
* @param eventName
* @param keyCode - not necessarily
*/
this.create = function(eventName, keyCode) {
var event = document.createEvent('Event');
event.initEvent(eventName, true, true);
if (keyCode)
event.keyCode = keyCode;
event.isDefaultPrevented = function() {
return this.defaultPrevented;
};
return event;
};
/**
* create keydown event
*
* @param keyCode
*/
this.createKey = function(keyCode) {
return this.create('keydown', keyCode);
};
/**
* create click event
*
* @param pKeyCode
*/
this.createClick = function() {
return this.create('click');
};
/**
* create click event
*
* @param pKeyCode
*/
this.createDblClick = function() {
return this.create('dblclick');
};
/**
* dispatch event
*
* @param pEvent
*/
this.dispatch = function(event, element) {
var isStr = Util.isString(event);
if (isStr)
event = Events.create(event);
else
event = event;
return (element || window).dispatchEvent(event);
};
/**
* dispatch keydown event
*
* @param pKeyCode
* @param element
*/
this.dispatchKey = function(keyCode, element) {
var event = this.createKey(keyCode),
ret = this.dispatch(event, element);
return ret;
};
/**
* dispatch click event
*
* @param element
*/
this.dispatchClick = function(element) {
var event = this.createClick(),
ret = this.dispatch(event, element);
return ret;
};
/**
* dispatch dblclick event
*
* @param element
*/
this.dispatchDblClick = function(element) {
var event = this.createDblClick(),
ret = this.dispatch(event, element);
return ret;
};
},
CmdProto = function() {
var Cmd = this,
CurrentInfo = {},
@ -1925,7 +1620,6 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog;
},
DOMTree = Util.extendProto(DOMTreeProto),
Events = Util.extendProto(EventsProto),
Images = Util.extendProto(ImagesProto);
DOMProto = DOMFunc.prototype = new CmdProto();
@ -1934,7 +1628,6 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog;
Util.extend(DOMProto, [
DOMTree, {
Events : Events,
Images : Images,
Dialog : Dialog
}

314
lib/client/events.js Normal file
View file

@ -0,0 +1,314 @@
var Util, DOM;
(function(Util, DOM) {
'use strict';
var DOMProto = Object.getPrototypeOf(DOM);
DOMProto.Events = new EventsProto();
function EventsProto() {
var Events = this,
parseArgs = function(eventName, element, listener, callback) {
var tmp, isFunc,
type = Util.getType(eventName);
switch(type) {
default:
tmp = eventName;
eventName = element;
element = tmp;
parseArgs(
eventName,
element,
listener,
callback
);
break;
case 'string':
isFunc = Util.isFunction(element);
if (isFunc) {
listener = element;
element = window;
}
callback(element || window,
eventName,
listener,
null);
break;
case 'array':
eventName.forEach(function(eventName) {
parseArgs(
eventName,
element,
listener,
callback
);
});
break;
case 'object':
Object.keys(eventName).forEach(function(name) {
var eventListener = eventName[name];
parseArgs(
name,
element,
eventListener,
callback
);
});
break;
}
};
/**
* safe add event listener
*
* @param type
* @param element {document by default}
* @param listener
*/
this.add = function(type, element, listener) {
Util.checkArgs(arguments, ['type']);
parseArgs(type, element, listener, function(element) {
var args = Util.slice(arguments, 1);
window.addEventListener.apply(element, args);
});
return Events;
};
/**
* safe add event listener
*
* @param type
* @param listener
* @param element {document by default}
*/
this.addOnce = function(type, element, listener) {
var once = function (event) {
Events.remove(type, element, once);
listener(event);
};
this.add(type, element, once);
return Events;
};
/**
* safe remove event listener
*
* @param type
* @param listener
* @param element {document by default}
*/
this.remove = function(type, element, listener) {
Util.checkArgs(arguments, ['type']);
parseArgs(type, listener, element, function(element) {
var args = Util.slice(arguments, 1);
window.removeEventListener.apply(element, args);
});
return Events;
};
/**
* safe add event keydown listener
*
* @param listener
*/
this.addKey = function() {
var name = 'keydown',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* safe remove event click listener
*
* @param listener
*/
this.rmKey = function() {
var name = 'keydown',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.remove.apply(this, args);
};
/**
* safe add event click listener
*
* @param listener
*/
this.addClick = function() {
var name = 'click',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* safe remove event click listener
*
* @param listener
*/
this.rmClick = function() {
var name = 'click',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.remove.apply(this, args);
};
this.addContextMenu = function() {
var name = 'contextmenu',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* safe add event click listener
*
* @param listener
*/
this.addError = function() {
var name = 'error',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* safe add load click listener
*
* @param listener
*/
this.addLoad = function() {
var name = 'load',
argsArr = Util.slice(arguments),
args = [name].concat(argsArr);
return this.add.apply(this, args);
};
/**
* crossbrowser create event
*
* @param eventName
* @param keyCode - not necessarily
*/
this.create = function(eventName, keyCode) {
var event = document.createEvent('Event');
event.initEvent(eventName, true, true);
if (keyCode)
event.keyCode = keyCode;
event.isDefaultPrevented = function() {
return this.defaultPrevented;
};
return event;
};
/**
* create keydown event
*
* @param keyCode
*/
this.createKey = function(keyCode) {
return this.create('keydown', keyCode);
};
/**
* create click event
*
* @param pKeyCode
*/
this.createClick = function() {
return this.create('click');
};
/**
* create click event
*
* @param pKeyCode
*/
this.createDblClick = function() {
return this.create('dblclick');
};
/**
* dispatch event
*
* @param pEvent
*/
this.dispatch = function(event, element) {
var isStr = Util.isString(event);
if (isStr)
event = Events.create(event);
else
event = event;
return (element || window).dispatchEvent(event);
};
/**
* dispatch keydown event
*
* @param pKeyCode
* @param element
*/
this.dispatchKey = function(keyCode, element) {
var event = this.createKey(keyCode),
ret = this.dispatch(event, element);
return ret;
};
/**
* dispatch click event
*
* @param element
*/
this.dispatchClick = function(element) {
var event = this.createClick(),
ret = this.dispatch(event, element);
return ret;
};
/**
* dispatch dblclick event
*
* @param element
*/
this.dispatchDblClick = function(element) {
var event = this.createDblClick(),
ret = this.dispatch(event, element);
return ret;
};
}
})(Util, DOM);