diff --git a/lib/client/config.js b/lib/client/config.js index 5b7fc241..ddce41c9 100644 --- a/lib/client/config.js +++ b/lib/client/config.js @@ -77,8 +77,8 @@ var CloudCmd, Util, DOM; focus = inputFirst.focus.bind(inputFirst); Util.forEach(inputs, function(input) { - Events.add('change', onChange, input); - Events.addKey(key, input); + Events.add('change', input, onChange) + .addKey(input, onKey); }); CloudCmd.View.show(div, { @@ -145,7 +145,7 @@ var CloudCmd, Util, DOM; Config.write(obj); } - function key(event) { + function onKey(event) { var keyCode = event.keyCode, ESC = Key.ESC; diff --git a/lib/client/dom.js b/lib/client/dom.js index 350d1a7e..90006226 100644 --- a/lib/client/dom.js +++ b/lib/client/dom.js @@ -307,42 +307,57 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; EventsProto = function() { var Events = this, - - parseArgs = function(eventName, listener, element, useCapture, callback) { - var type = Util.getType(eventName); + 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, - useCapture); + null); break; case 'array': eventName.forEach(function(eventName) { parseArgs( eventName, - listener, element, - useCapture, + listener, callback ); }); break; case 'object': - if (listener) - element = listener; - Object.keys(eventName).forEach(function(name) { var eventListener = eventName[name]; parseArgs( name, - eventListener, element, - useCapture, + eventListener, callback ); }); @@ -355,12 +370,13 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; * safe add event listener * * @param type - * @param listener - * @param useCapture * @param element {document by default} + * @param listener */ - this.add = function(type, listener, useCapture, element) { - parseArgs(type, listener, useCapture, element, function(element) { + 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); @@ -374,16 +390,15 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; * * @param type * @param listener - * @param useCapture * @param element {document by default} */ - this.addOnce = function(type, listener, element, useCapture) { + this.addOnce = function(type, element, listener) { var once = function (event) { - Events.remove(type, once, element, useCapture); + Events.remove(type, element, once); listener(event); }; - this.add(type, once, element, useCapture); + this.add(type, element, once); return Events; }; @@ -393,11 +408,12 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; * * @param type * @param listener - * @param useCapture * @param element {document by default} */ - this.remove = function(type, listener, useCapture, element) { - parseArgs(type, listener, useCapture, element, function(element) { + 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); @@ -410,79 +426,101 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; * safe add event keydown listener * * @param listener - * @param useCapture */ - this.addKey = function(listener, element, useCapture) { - return this.add('keydown', listener, element, useCapture); + 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 - * @param useCapture */ - this.rmKey = function(listener, element, useCapture) { - return this.remove('keydown', listener, element, useCapture); + 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 - * @param useCapture */ - this.addClick = function(listener, element, useCapture) { - return this.add('click', listener, element, useCapture); + 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 - * @param useCapture */ - this.rmClick = function(listener, element, useCapture) { - return this.remove('click', listener, element, useCapture); + this.rmClick = function() { + var name = 'click', + argsArr = Util.slice(arguments), + args = [name].concat(argsArr); + + return this.remove.apply(this, args); }; - this.addContextMenu = function(listener, element, useCapture) { - return this.add('contextmenu', listener, element, useCapture); + 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 - * @param useCapture */ - this.addError = function(listener, element, useCapture) { - return this.add('error', listener, element, useCapture); + 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 - * @param useCapture */ - this.addLoad = function(listener, element, useCapture) { - return this.add('load', listener, element, useCapture); + this.addLoad = function() { + var name = 'load', + argsArr = Util.slice(arguments), + args = [name].concat(argsArr); + + return this.add.apply(this, args); }; /** * crossbrowser create event * - * @param pEventName - * @param pKeyCode - not necessarily + * @param eventName + * @param keyCode - not necessarily */ - this.create = function(pEventName, pKeyCode) { + this.create = function(eventName, keyCode) { var event = document.createEvent('Event'); - event.initEvent(pEventName, true, true); + event.initEvent(eventName, true, true); - if (pKeyCode) - event.keyCode = pKeyCode; + if (keyCode) + event.keyCode = keyCode; event.isDefaultPrevented = function() { return this.defaultPrevented; @@ -494,10 +532,10 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; /** * create keydown event * - * @param pKeyCode + * @param keyCode */ - this.createKey = function(pKeyCode) { - return this.create('keydown', pKeyCode); + this.createKey = function(keyCode) { + return this.create('keydown', keyCode); }; /** @@ -523,13 +561,13 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; * * @param pEvent */ - this.dispatch = function(pEvent, element) { - var event; + this.dispatch = function(event, element) { + var isStr = Util.isString(event); - if (Util.isString(pEvent)) - event = Events.create(pEvent); + if (isStr) + event = Events.create(event); else - event = pEvent; + event = event; return (element || window).dispatchEvent(event); }; @@ -540,8 +578,8 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; * @param pKeyCode * @param element */ - this.dispatchKey = function(pKeyCode, element) { - var event = this.createKey(pKeyCode), + this.dispatchKey = function(keyCode, element) { + var event = this.createKey(keyCode), ret = this.dispatch(event, element); return ret; diff --git a/lib/client/edit.js b/lib/client/edit.js index 5d7d6da2..29b81b30 100644 --- a/lib/client/edit.js +++ b/lib/client/edit.js @@ -63,14 +63,13 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch, Zip, MenuI initAce(); - Events.add({ - drop : onDrop, - dragover : function(event) { - event.preventDefault(); - } - }, Element); - - Events.addOnce('contextmenu', onMenu, Element); + Events.addOnce('contextmenu', Element, onMenu) + .add(Element, { + drop : onDrop, + dragover : function(event) { + event.preventDefault(); + } + }); } modesByName = Modelist.modesByName; @@ -460,7 +459,7 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch, Zip, MenuI if (files) files.forEach(function(file) { reader = new FileReader(); - DOM.Events.addLoad(onLoad, reader); + DOM.Events.addLoad(reader, onLoad); reader.readAsBinaryString(file); }); } diff --git a/lib/client/listeners.js b/lib/client/listeners.js index 1de0bd47..7877ba86 100644 --- a/lib/client/listeners.js +++ b/lib/client/listeners.js @@ -51,7 +51,7 @@ var Util, DOM, CloudCmd; var keysElement = DOM.getById('js-keyspanel'); if (keysElement) - Events.addClick(function(event) { + Events.addClick(keysElement, function(event) { var element = event.target, id = element.id, @@ -75,7 +75,7 @@ var Util, DOM, CloudCmd; Util.exec(func); - }, keysElement); + }); }; this.setOnPanel = function(panelId) { @@ -84,8 +84,8 @@ var Util, DOM, CloudCmd; pathElement = DOM.getByDataName('js-path', panel); /* ставим загрузку гифа на клик*/ - Events.addClick(onPathElementClick, pathElement); - Events.add(EventsFiles, filesElement); + Events.addClick(pathElement, onPathElementClick); + Events.add(filesElement, EventsFiles); }; function onPathElementClick(event) { @@ -246,20 +246,20 @@ var Util, DOM, CloudCmd; appStorage = window.applicationStorage; if (isAppStorage && appStorage) - Events.add('updateready', function() { + Events.add('updateready', appStorage, function() { var ret = confirm('An update is available. Reload now?'); if (ret) location.reload(); - }, appStorage); + }); }); } function contextMenu() { - Events.addContextMenu(function(event) { + Events.addContextMenu(document, function(event) { CloudCmd.Menu.ENABLED || DOM.preventDefault(event); - }, document); + }); } function dragndrop() { @@ -304,23 +304,23 @@ var Util, DOM, CloudCmd; Events.add(['dragenter', 'dragleave'], toggle); Util.forEach(panels, function(panel) { - Events.add('dragover', preventDefault, panel); - Events.add('drop', onDrop, panel); + Events.add('dragover', panel, preventDefault) + .add('drop', panel, onDrop); }); } function unload() { - DOM.Events.add(['unload', 'beforeunload'], function (pEvent) { - var lRet, + DOM.Events.add(['unload', 'beforeunload'], function (event) { + var ret, Key = CloudCmd.Key, - lIsBind = Key && Key.isBind(); + isBind = Key && Key.isBind(); - if (!lIsBind) { - DOM.preventDefault(pEvent); - lRet = 'Please make sure that you saved all work.'; + if (!isBind) { + DOM.preventDefault(event); + ret = 'Please make sure that you saved all work.'; } - return lRet; + return ret; }); } diff --git a/lib/client/load.js b/lib/client/load.js index 122ecdf3..678d4761 100644 --- a/lib/client/load.js +++ b/lib/client/load.js @@ -44,8 +44,7 @@ var Util, DOM; * if object - then onload and onerror */ funcLoad = function(event) { - Events.remove('load', funcLoad, element) - .remove('error', funcError, element); + Events.remove('error', element, funcError); Util.exec(func, event); }, @@ -79,8 +78,8 @@ var Util, DOM; element = document.createElement(name); if (name === 'script' || name === 'link') - Events.addLoad(funcLoad, element) - .addError(funcError, element); + Events.addOnce('load', element, funcLoad) + .addError(element, funcError); if (p.id) element.id = p.id; @@ -167,7 +166,7 @@ var Util, DOM; if (p.responseType) xhr.responseType = p.responseType; - Events.add('progress', function(event) { + Events.add('progress', xhr.upload, function(event) { var percent, count; if (event.lengthComputable) { @@ -180,9 +179,9 @@ var Util, DOM; countProgress = true; } - }, xhr.upload); + }); - Events.add('readystatechange', function(event) { + Events.add('readystatechange', xhr, function(event) { var TYPE_JSON, type, data, isContain, xhr = event.target; @@ -213,7 +212,7 @@ var Util, DOM; Util.exec(p.error, xhr); } } - }, xhr); + }); xhr.send(p.data); }; diff --git a/lib/client/notify.js b/lib/client/notify.js index 6038bbaf..85fdf0cc 100644 --- a/lib/client/notify.js +++ b/lib/client/notify.js @@ -23,7 +23,7 @@ var Util, DOM, CloudCmd; 'focus': function() { Show = false; } - }, window); + }); this.send = function(msg) { CloudCmd.getConfig(function(config) {