From 1befd3d1b0de9d959894be614ce619a2f868a3dd Mon Sep 17 00:00:00 2001 From: Dariel Noel Date: Wed, 10 Sep 2014 01:00:30 -0400 Subject: [PATCH] functions support multiples params --- Gruntfile.js | 4 + dist/anijs-min.js | 2 +- dist/anijs.js | 156 +++++++----- dist/helpers/dom/anijs-helper-dom-min.js | 2 +- dist/helpers/dom/anijs-helper-dom.js | 26 +- src/anijs.js | 166 ++++++++----- src/helpers/dom/anijs-helper-dom.js | 34 +-- .../scrollreveal/anijs-helper-scrollreveal.js | 16 +- test/jasmine-standalone/SpecRunner.html | 3 +- test/jasmine-standalone/spec/AniJSSpec.js | 29 +++ .../spec/AniJSSpecParametros.js | 233 ++++++++++++++++++ 11 files changed, 513 insertions(+), 158 deletions(-) create mode 100644 test/jasmine-standalone/spec/AniJSSpecParametros.js diff --git a/Gruntfile.js b/Gruntfile.js index 0d0e6e9..2e1a0ae 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -78,6 +78,10 @@ module.exports = function(grunt) { { from: '_helperDefaultIndex', to: '_u' }, { from: '_animationEndEvent', to: '_v' }, { from: '_classNamesWhenAnim', to: '_w' }, + { from: 'beArray', to: '_x' }, + { from: '_actionHelper', to: '_y' }, + { from: '_paramsHelper', to: '_z' }, + { from: "Event object missing 'type' property.", to: 'error' }, ] } } diff --git a/dist/anijs-min.js b/dist/anijs-min.js index 589f9bf..89fc413 100644 --- a/dist/anijs-min.js +++ b/dist/anijs-min.js @@ -1 +1 @@ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("AniJS requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=function(b){var c="data-anijs",d="default",e="$",f="if",g="on",h="do",i="to",j="(\\s+|^)",k="(\\s+|$)",l="animationend",m="transitionend",n="target";b={rootDOMTravelScope:{},eventProviderCollection:{},init:function(){o._t={};var a=o._a();b.registerHelper(d,a),o._u=d,b.rootDOMTravelScope=document,b.Parser=o.Parser,o._v=o._p(),o._w=""},setDOMRootTravelScope:function(a){var c;try{"document"===a?c=document:(c=document.querySelector(a),c||(c=document))}catch(d){c=document}b.rootDOMTravelScope=c},run:function(){var a=[],d={};b.purgeAll(),b.eventProviderCollection={},a=o._o(b.rootDOMTravelScope);var e,f=a.length,g=0;for(g;f>g;g++)e=a[g],d=o._n(e.getAttribute(c)),o._c(e,d);var h=b.getEventProvider("AniJSEventProvider");h&&h.dispatchEvent("onRunFinished")},createAnimation:function(a,b){var c=b||"";o._c(c,a)},getHelper:function(a){var b=o._t;return b[a]||b[d]},registerHelper:function(a,b){o._t[a]=b},purge:function(a){if(a&&""!==a&&" "!==a){var c=document.querySelectorAll(a),d=c.length,e=0;for(e;d>e;e++)b.EventSystem.purgeEventTarget(c[e])}},purgeAll:function(){b.EventSystem.purgeAll()},purgeEventTarget:function(a){b.EventSystem.purgeEventTarget(a)},setClassNamesWhenAnim:function(a){o._w=" "+a},createEventProvider:function(){return b.EventSystem.createEventTarget()},registerEventProvider:function(a){var c=b.eventProviderCollection;return a.id&&a.value&&b.EventSystem.isEventTarget(a.value)?(c[a.id]=a.value,1):""},getEventProvider:function(a){return b.eventProviderCollection[a]}};var o={};return o._a=function(){var a={removeAnim:function(a,b){a.target&&b.nodeHelper.removeClass(a.target,b.behavior)},holdAnimClass:function(){}};return a},o._b=function(){return new Parser},o._c=function(a,b){var c,d=b.length,e=0;for(e;d>e;e++)c=b[e],o._d(a,c)},o._d=function(a,c){var d=o._e(c),e=o._f(a,c);if(""!==d){var f,g=e.length,h=0;for(h;g>h;h++)if(f=e[h],b.EventSystem.isEventTarget(f)){var i=function(d){var e=o._g(a,c,d),f=o._h(c),g=o._j(a,c),h=o._i(a,c);""!==o._w&&(Array.isArray(f)||(f+=o._w));var i={behaviorTargetList:e,nodeHelper:o.NodeHelper,animationEndEvent:o._v,behavior:f,after:h,eventSystem:b.EventSystem},j=new b.AnimationContext(i);g&&o.Util.isFunction(g)?g(d,j):j.run()};b.EventSystem.addEventListenerHelper(f,d,i,!1),b.EventSystem.registerEventHandle(f,d,i)}}},o._e=function(a){var b="",c=a.event||b;return c===l?c=o._p():c===m&&(c=o._q()),c},o._f=function(c,d){var e,f=c,g=[f],h=b.rootDOMTravelScope;if(d.eventTarget)if(e=o._m(d.eventTarget),e.length>0)g=e;else if("document"===d.eventTarget)g=[document];else if("window"===d.eventTarget)g=[a];else if(d.eventTarget.split)try{g=h.querySelectorAll(d.eventTarget)}catch(i){g=[]}return g},o._g=function(a,c,d){var f=a,g=[f],h=b.rootDOMTravelScope,i=c.behaviorTarget;if(i)if(i===n&&d.target)g=[d.target];else{i=i.split(e).join(",");try{g=h.querySelectorAll(i)}catch(j){g=[]}}return g},o._h=function(a){var b,c=a.behavior||"";return Array.isArray(c)&&(b=o._k({},a,c[0]),b?c[0]=b:c=c.join(" ")),c},o._i=function(a,b){var c=o._k(a,b,b.after);return c},o._j=function(a,b){var c=o._k(a,b,b.before);return c},o._k=function(a,b,c){var d=c||"",e=o._l(b);if(d&&!o.Util.isFunction(d)){var f=o._t,g=f[e];d=g&&g[d]?g[d]:!1}return d},o._l=function(a){var b=a.helper||o._u;return b},o._m=function(a){{var c=[];b.eventProviderCollection}if(a)if(a.id&&b.EventSystem.isEventTarget(a.value))c.push(a.value),b.registerEventProvider(a);else if(a.split){eventProviderIDList=a.split("$");var d,e=eventProviderIDList.length,f=1;for(f;e>f;f++)if(d=eventProviderIDList[f],d&&" "!==d){d=d.trim();var g=b.getEventProvider(d);g||(g=b.EventSystem.createEventTarget(),b.registerEventProvider({id:d,value:g})),c.push(g)}}return c},o._n=function(a){return o.Parser.parse(a)},o._o=function(a){var b="["+c+"]";return a.querySelectorAll(b)},o._p=function(){var a=o._r(),b=[l,"oAnimationEnd",l,"webkitAnimationEnd"];return b[a]},o._q=function(){var a=o._r(),b=[m,"oTransitionEnd",m,"webkitTransitionEnd"];return b[a]},o._r=function(){for(var a=document.createElement("fakeelement"),b=["animation","OAnimation","MozAnimation","webkitAnimation"],c=0;cf;f++)Array.isArray(e)?b.doFunctionAction(c[f],e):b.doDefaultAction(c[f],e)},b.init(a)},o.Parser={parse:function(a){return this.parseDeclaration(a)},parseDeclaration:function(a){var b,c,d=[];b=a.split(";");var e=b.length,f=0;for(f;e>f;f++)c=this.parseSentence(b[f]),d.push(c);return d},parseSentence:function(a){var b,c,d={};b=a.split(",");var e=b.length,f=0;for(f;e>f;f++)c=this.parseDefinition(b[f]),d[c.key]=c.value;return d},parseDefinition:function(a){var b,c,d,e={},j="event",k="eventTarget",l="behavior",m="behaviorTarget";return b=a.split(":"),b.length>1&&(c=b[0].trim(),b.length>2?(d=b.slice(1),d=d.join(":"),d=d.trim()):d=b[1].trim(),e.value=d,c===f?c=j:c===g?c=k:c===h?(c=l,d=this.parseDoDefinition(d)):c===i&&(c=m),e.key=c,e.value=d),e},parseDoDefinition:function(a){var b=a.split("$");return b.length>1&&(b=b[1].split(" "),a=[],a[0]=b[0],a[1]=b.slice(1).join(" ")),a}},o.NodeHelper={addClass:function(a,b){b instanceof Array||(b=b.split(" "));for(var c=0,d=b.length;d>c;++c)b[c]&&!new RegExp(j+b[c]+k).test(a.className)&&(a.className=a.className.trim()+" "+b[c])},removeClass:function(a,b){b instanceof Array||(b=b.split(" "));for(var c=0,d=b.length;d>c;++c)a.className=a.className.replace(new RegExp(j+b[c]+k)," ").trim()},hasClass:function(a,b){return b&&new RegExp(j+b+k).test(a.className)}},o.Util={isFunction:function(a){return!!(a&&a.constructor&&a.call&&a.apply)}},b.EventSystem={eventCollection:{},eventIdCounter:0,isEventTarget:function(a){return a.addEventListener?1:0},createEventTarget:function(){return new b.EventTarget},addEventListenerHelper:function(a,b,c){a.addEventListener(b,c,!1)},removeEventListenerHelper:function(a,b,c){a.removeEventListener(b,c)},purgeAll:function(){var a,b,c=this,d=c.eventCollection,e=Object.keys(d),f=e.length,g=0;for(g;f>g;g++)a=e[g],b=d[a],b&&b.handleCollection&&b.handleCollection.length>0&&c.purgeEventTarget(b.handleCollection[0].element),delete d[a]},purgeEventTarget:function(a){var b,c=this,d=a._aniJSEventID;if(d){b=c.eventCollection[d].handleCollection;var e,f=b.length,g=0;for(g;f>g;g++)e=b[g],c.removeEventListenerHelper(a,e.eventType,e.listener);c.eventCollection[d]=a._aniJSEventID=null,delete c.eventCollection[d],delete a._aniJSEventID}},registerEventHandle:function(a,b,c){var d=this,e=a._aniJSEventID,f=d.eventCollection,g={eventType:b,listener:c,element:a};if(e)f[e].handleCollection.push(g);else{var h={handleCollection:[g]};f[++d.eventIdCounter]=h,a._aniJSEventID=d.eventIdCounter}}},b.EventTarget=function(){this._listeners={}},b.EventTarget.prototype={constructor:b.EventTarget,addEventListener:function(a,b){var c=this;"undefined"==typeof c._listeners[a]&&(c._listeners[a]=[]),c._listeners[a].push(b)},dispatchEvent:function(a){var b=this;if("string"==typeof a&&(a={type:a}),a.target||(a.target=b),!a.type)throw new Error("Event object missing 'type' property.");if(this._listeners[a.type]instanceof Array)for(var c=b._listeners[a.type],d=0,e=c.length;e>d;d++)c[d].call(b,a)},removeEventListener:function(a,b){var c=this;if(c._listeners[a]instanceof Array)for(var d=c._listeners[a],e=0,f=d.length;f>e;e++)if(d[e]===b){d.splice(e,1);break}}},b}(c||{});return c.init(),c.run(),"function"==typeof define&&define.amd&&define("anijs",[],function(){return c}),"undefined"==typeof b&&(a.AniJS=c),c}); \ No newline at end of file +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("AniJS-RWWD");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=function(b){var c="data-anijs",d="default",e="&",f="$",g="if",h="on",i=["do","after","before"],j="to",k="(\\s+|^)",l="(\\s+|$)",m="animationend",n="transitionend",o="target";b={rootDOMTravelScope:{},eventProviderCollection:{},init:function(){p._t={};var a=p._a();b.registerHelper(d,a),p._u=d,b.rootDOMTravelScope=document,b.Parser=p.Parser,p._v=p._p(),p._w=""},setDOMRootTravelScope:function(a){var c;try{"document"===a?c=document:(c=document.querySelector(a),c||(c=document))}catch(d){c=document}b.rootDOMTravelScope=c},run:function(){var a=[],d={};b.purgeAll(),b.eventProviderCollection={},a=p._o(b.rootDOMTravelScope);var e,f=a.length,g=0;for(g;f>g;g++)e=a[g],d=p._n(e.getAttribute(c)),p._c(e,d);var h=b.getEventProvider("AniJSEventProvider");h&&h.dispatchEvent("onRunFinished")},createAnimation:function(a,b){var c=b||"";p._c(c,a)},getHelper:function(a){var b=p._t;return b[a]||b[d]},registerHelper:function(a,b){p._t[a]=b},purge:function(a){if(a&&""!==a&&" "!==a){var c=document.querySelectorAll(a),d=c.length,e=0;for(e;d>e;e++)b.EventSystem.purgeEventTarget(c[e])}},purgeAll:function(){b.EventSystem.purgeAll()},purgeEventTarget:function(a){b.EventSystem.purgeEventTarget(a)},setClassNamesWhenAnim:function(a){p._w=" "+a},createEventProvider:function(){return b.EventSystem.createEventTarget()},registerEventProvider:function(a){var c=b.eventProviderCollection;return a.id&&a.value&&b.EventSystem.isEventTarget(a.value)?(c[a.id]=a.value,1):""},getEventProvider:function(a){return b.eventProviderCollection[a]}};var p={};return p._a=function(){var a={removeAnim:function(a,b){a.target&&a.type&&b.nodeHelper.removeClass(a.target,b.behavior)},holdAnimClass:function(){}};return a},p._b=function(){return new Parser},p._c=function(a,b){var c,d=b.length,e=0;for(e;d>e;e++)c=b[e],p._d(a,c)},p._d=function(a,c){var d=p._e(c),e=p._f(a,c);if(""!==d){var f,g=e.length,h=0;for(h;g>h;h++)if(f=e[h],b.EventSystem.isEventTarget(f)){var i=function(d){var e=p._g(a,c,d),f=p._h(c),g=p._j(a,c),h=p._i(a,c);""!==p._w&&(p.Util._x(f)||(f+=p._w));var i={behaviorTargetList:e,nodeHelper:p.NodeHelper,animationEndEvent:p._v,behavior:f,after:h,eventSystem:b.EventSystem},j=new b.AnimationContext(i);g?p.Util.isFunction(g)?g(d,j):p.Util._x(g)&&g[0](d,j,p._z(g)):j.run()};b.EventSystem.addEventListenerHelper(f,d,i,!1),b.EventSystem.registerEventHandle(f,d,i)}}},p._e=function(a){var b="",c=a.event||b;return c===m?c=p._p():c===n&&(c=p._q()),c},p._f=function(c,d){var e,f=c,g=[f],h=b.rootDOMTravelScope;if(d.eventTarget)if(e=p._m(d.eventTarget),e.length>0)g=e;else if("document"===d.eventTarget)g=[document];else if("window"===d.eventTarget)g=[a];else if(d.eventTarget.split)try{g=h.querySelectorAll(d.eventTarget)}catch(i){g=[]}return g},p._g=function(a,c,d){var e=a,g=[e],h=b.rootDOMTravelScope,i=c.behaviorTarget;if(i)if(i===o&&d.target)g=[d.target];else{i=i.split(f).join(",");try{g=h.querySelectorAll(i)}catch(j){g=[]}}return g},p._h=function(a){return this._y({},a,a.behavior)},p._i=function(a,b){var c=b.after;return p.Util._x(c)?this._y(a,b,c):p._k(a,b,c)},p._j=function(a,b){var c=b.before;return p.Util._x(c)?this._y(a,b,c):p._k(a,b,c)},p._y=function(a,b,c){var d,e=c||"";return p.Util._x(e)&&(d=p._k(a,b,e[0]),d?e[0]=d:e=e.join(" ")),e},p._k=function(a,b,c){var d=c||"",e=p._l(b);if(d&&!p.Util.isFunction(d)){var f=p._t,g=f[e];d=g&&g[d]?g[d]:!1}return d},p._l=function(a){var b=a.helper||p._u;return b},p._m=function(a){{var c=[];b.eventProviderCollection}if(a)if(a.id&&b.EventSystem.isEventTarget(a.value))c.push(a.value),b.registerEventProvider(a);else if(a.split){eventProviderIDList=a.split("$");var d,e=eventProviderIDList.length,f=1;for(f;e>f;f++)if(d=eventProviderIDList[f],d&&" "!==d){d=d.trim();var g=b.getEventProvider(d);g||(g=b.EventSystem.createEventTarget(),b.registerEventProvider({id:d,value:g})),c.push(g)}}return c},p._z=function(a){for(var b=[],c=a.length;c-->1;)b[c-1]=a[c];return b},p._n=function(a){return p.Parser.parse(a)},p._o=function(a){var b="["+c+"]";return a.querySelectorAll(b)},p._p=function(){var a=p._r(),b=[m,"oAnimationEnd",m,"webkitAnimationEnd"];return b[a]},p._q=function(){var a=p._r(),b=[n,"oTransitionEnd",n,"webkitTransitionEnd"];return b[a]},p._r=function(){for(var a=document.createElement("fe"),b="Animation",c=["animation","O"+b,"Moz"+b,"webkit"+b],d=0;df;f++)p.Util._x(e)?b.doFunctionAction(c[f],e):b.doDefaultAction(c[f],e)},b.init(a)},p.Parser={parse:function(a){return this.parseDeclaration(a)},parseDeclaration:function(a){var b,c,d=[];b=a.split(";");var e=b.length,f=0;for(f;e>f;f++)c=this.parseSentence(b[f]),d.push(c);return d},parseSentence:function(a){var b,c,d={};b=a.split(",");var e=b.length,f=0;for(f;e>f;f++)c=this.parseDefinition(b[f]),d[c.key]=c.value;return d},parseDefinition:function(a){var b,c,d,e={},f="event",k="eventTarget",l=["behavior","after","before"],m="behaviorTarget";if(b=a.split(":"),b.length>1){if(c=b[0].trim(),b.length>2?(d=b.slice(1),d=d.join(":"),d=d.trim()):d=b[1].trim(),e.value=d,c===g)c=f;else if(c===h)c=k;else if(c===j)c=m;else for(var n=i.length-1;n>=0;n--)c===i[n]&&(c=l[n],d=this.parseDoDefinition(d));e.key=c,e.value=d}return e},parseDoDefinition:function(a){var b=/^\$(\w+)\s*/g,c=b.exec(a),d="",f=1;if(null!==c){d=c[1],doDefinitionArray=a.split(c[0])[1],doDefinitionArray=null!==doDefinitionArray?doDefinitionArray.split(e):[],a=[],a[0]=d;for(var g=0;gc;++c)b[c]&&!new RegExp(k+b[c]+l).test(a.className)&&(a.className=a.className.trim()+" "+b[c])},removeClass:function(a,b){b instanceof Array||(b=b.split(" "));for(var c=0,d=b.length;d>c;++c)a.className=a.className.replace(new RegExp(k+b[c]+l)," ").trim()},hasClass:function(a,b){return b&&new RegExp(k+b+l).test(a.className)}},p.Util={isFunction:function(a){return!!(a&&a.constructor&&a.call&&a.apply)},_x:function(a){return Array.isArray(a)}},b.EventSystem={eventCollection:{},eventIdCounter:0,isEventTarget:function(a){return a.addEventListener?1:0},createEventTarget:function(){return new b.EventTarget},addEventListenerHelper:function(a,b,c){a.addEventListener(b,c,!1)},removeEventListenerHelper:function(a,b,c){a.removeEventListener(b,c)},purgeAll:function(){var a,b,c=this,d=c.eventCollection,e=Object.keys(d),f=e.length,g=0;for(g;f>g;g++)a=e[g],b=d[a],b&&b.handleCollection&&b.handleCollection.length>0&&c.purgeEventTarget(b.handleCollection[0].element),delete d[a]},purgeEventTarget:function(a){var b,c=this,d=a._aniJSEventID;if(d){b=c.eventCollection[d].handleCollection;var e,f=b.length,g=0;for(g;f>g;g++)e=b[g],c.removeEventListenerHelper(a,e.eventType,e.listener);c.eventCollection[d]=a._aniJSEventID=null,delete c.eventCollection[d],delete a._aniJSEventID}},registerEventHandle:function(a,b,c){var d=this,e=a._aniJSEventID,f=d.eventCollection,g={eventType:b,listener:c,element:a};if(e)f[e].handleCollection.push(g);else{var h={handleCollection:[g]};f[++d.eventIdCounter]=h,a._aniJSEventID=d.eventIdCounter}}},b.EventTarget=function(){this._listeners={}},b.EventTarget.prototype={constructor:b.EventTarget,addEventListener:function(a,b){var c=this;"undefined"==typeof c._listeners[a]&&(c._listeners[a]=[]),c._listeners[a].push(b)},dispatchEvent:function(a){var b=this;if("string"==typeof a&&(a={type:a}),a.target||(a.target=b),!a.type)throw new Error("error");if(this._listeners[a.type]instanceof Array)for(var c=b._listeners[a.type],d=0,e=c.length;e>d;d++)c[d].call(b,a)},removeEventListener:function(a,b){var c=this;if(c._listeners[a]instanceof Array)for(var d=c._listeners[a],e=0,f=d.length;f>e;e++)if(d[e]===b){d.splice(e,1);break}}},b}(c||{});return c.init(),c.run(),"function"==typeof define&&define.amd&&define("anijs",[],function(){return c}),"undefined"==typeof b&&(a.AniJS=c),c}); \ No newline at end of file diff --git a/dist/anijs.js b/dist/anijs.js index 9838c72..0048878 100644 --- a/dist/anijs.js +++ b/dist/anijs.js @@ -18,7 +18,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI factory(root, true) : function(w) { if (!w.document) { - throw new Error("AniJS requires a window with a document"); + throw new Error("AniJS-RWWD"); } return factory(w); }; @@ -41,10 +41,11 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI var ANIJS_DATATAG_NAME = 'data-anijs', DEFAULT = 'default', BODY = 'body', + PARAMS_SEPARATOR = '&', MULTIPLE_CLASS_SEPARATOR = '$', EVENT_RESERVED_WORD = 'if', EVENT_TARGET_RESERVED_WORD = 'on', - BEHAVIOR_RESERVED_WORD = 'do', + BEHAVIOR_RESERVED_WORD = ['do', 'after', 'before'], BEHAVIOR_TARGET_RESERVED_WORD = 'to', REGEX_BEGIN = '(\\s+|^)', REGEX_END = '(\\s+|$)', @@ -276,7 +277,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI return AniJS.eventProviderCollection[eventProviderID]; } - } + }; ///////////////////////////////////////////////////////// // Private Methods an Vars @@ -284,7 +285,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI var selfish = { - } + }; /** * Description @@ -302,7 +303,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return */ removeAnim: function(e, animationContext) { - if(e.target){ + if(e.target && e.type){ animationContext.nodeHelper.removeClass(e.target, animationContext.behavior); } }, @@ -362,14 +363,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI //Es obligatorio definir de eventTarget ATTR if (event !== '') { - var size = eventTargetList.length, i = 0, eventTargetItem; for (i; i < size; i++) { eventTargetItem = eventTargetList[i]; - if (AniJS.EventSystem.isEventTarget(eventTargetItem)) { var listener = function(event) { @@ -380,7 +379,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI after = selfish._afterHelper(element, aniJSParsedSentence); if (selfish._classNamesWhenAnim !== '') { - if(!Array.isArray(behavior)) + if(!selfish.Util.beArray(behavior)) behavior += selfish._classNamesWhenAnim; } @@ -395,12 +394,16 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI //TODO: eventSystem should be called directly }, - animationContextInstance = new AniJS.AnimationContext(animationContextConfig); + animationContextInstance = new AniJS.AnimationContext(animationContextConfig); //Si before, le paso el animation context //TODO: Util is a submodule - if (before && selfish.Util.isFunction(before)) { - before(event, animationContextInstance); + if (before) { + if(selfish.Util.isFunction(before)) { + before(event, animationContextInstance); + } else if(selfish.Util.beArray(before)) { + before[0](event, animationContextInstance, selfish._paramsHelper(before)); + } } else { animationContextInstance.run(); } @@ -416,8 +419,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI } - } else { - console.log('You must define some event'); } }; @@ -507,7 +508,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI behaviorTargetNodeList = rootDOMTravelScope.querySelectorAll(behaviorTarget); } catch (e) { behaviorTargetNodeList = []; - console.log('ugly selector here'); } } @@ -524,17 +524,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return defaultValue */ selfish._behaviorHelper = function(aniJSParsedSentence) { - var defaultValue = aniJSParsedSentence.behavior || '', - executeFunction; - if(Array.isArray(defaultValue)){ - executeFunction = selfish._callbackHelper({}, aniJSParsedSentence, defaultValue[0]); - if(executeFunction){ - defaultValue[0] = executeFunction; - } else { - defaultValue = defaultValue.join(' '); - } - } - return defaultValue; + return this._actionHelper({}, aniJSParsedSentence, aniJSParsedSentence.behavior); }; /** @@ -545,8 +535,11 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return defaultValue */ selfish._afterHelper = function(element, aniJSParsedSentence) { - var defaultValue = selfish._callbackHelper(element, aniJSParsedSentence, aniJSParsedSentence.after); - return defaultValue; + var defaultValue = aniJSParsedSentence.after; + // return defaultValue; + if(!selfish.Util.beArray(defaultValue)) + return selfish._callbackHelper(element, aniJSParsedSentence, defaultValue); + return this._actionHelper(element, aniJSParsedSentence, defaultValue); }; /** @@ -557,7 +550,24 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return defaultValue */ selfish._beforeHelper = function(element, aniJSParsedSentence) { - var defaultValue = selfish._callbackHelper(element, aniJSParsedSentence, aniJSParsedSentence.before); + var defaultValue = aniJSParsedSentence.before; + if(!selfish.Util.beArray(defaultValue)) + return selfish._callbackHelper(element, aniJSParsedSentence, defaultValue); + return this._actionHelper(element, aniJSParsedSentence, defaultValue); + }; + + selfish._actionHelper = function(element, aniJSParsedSentence, action) { + var defaultValue = action || '', + executeFunction; + if(selfish.Util.beArray(defaultValue)) { + executeFunction = selfish._callbackHelper(element, aniJSParsedSentence, defaultValue[0]); + if(executeFunction) { + defaultValue[0] = executeFunction; + } else { + defaultValue = defaultValue.join(' '); + } + + } return defaultValue; }; @@ -651,6 +661,13 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI return defaultValue; }; + selfish._paramsHelper = function(paramsArray){ + var arr = [], + i = paramsArray.length; + while(i-- > 1) arr[i - 1] = paramsArray[i]; + return arr; + }; + /** * Parse an String Declaration * @method _getParsedAniJSSentenceCollection @@ -704,8 +721,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI */ selfish._endPrefixBrowserDetectionIndex = function() { //TODO: Delete de element after create this - var el = document.createElement('fakeelement'), - animationBrowserDetection = ['animation', 'OAnimation', 'MozAnimation', 'webkitAnimation']; + var el = document.createElement('fe'), + ANIM = 'Animation', + animationBrowserDetection = ['animation', 'O'+ANIM, 'Moz'+ANIM, 'webkit'+ANIM]; for (var i = 0; i < animationBrowserDetection.length; i++) { if (el.style[animationBrowserDetection[i]] !== undefined) { @@ -770,17 +788,20 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI //create event instance.eventSystem.addEventListenerHelper(target, animationEndEvent, function(e) { - e.stopPropagation(); //remove event instance.eventSystem.removeEventListenerHelper(e.target, e.type, arguments.callee); - // callback handler if (!after) { //removing the animation by default if there are not an after function nodeHelper.removeClass(e.target, behavior); - } else if(selfish.Util.isFunction(after)){ - after(e, animationContextInstance); + } else { + if(selfish.Util.isFunction(after)){ + after(e, animationContextInstance); + } else if(selfish.Util.beArray(after)) { + console.log(after); + after[0](e, animationContextInstance, selfish._paramsHelper(after)); + } } }); }, @@ -796,10 +817,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI animationContextInstance.doFunctionAction = function(target, behavior){ var instance = animationContextInstance, after = instance.after, - e = {}; - behavior[0](e, animationContextInstance, target, behavior); + e = {target:target}; + behavior[0](e, animationContextInstance, selfish._paramsHelper(behavior)); if(selfish.Util.isFunction(after)){ after(e, animationContextInstance); + } else { + if(selfish.Util.beArray(after)) { + after[0](e, animationContextInstance, selfish._paramsHelper(after)); + } } }, @@ -818,17 +843,15 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI animationContextInstance.hasRunned = 1; for (j; j < behaviorTargetListSize; j++) { - if(Array.isArray(behavior)){ + if(selfish.Util.beArray(behavior)){ animationContextInstance .doFunctionAction(behaviorTargetList[j], behavior); } else{ animationContextInstance .doDefaultAction(behaviorTargetList[j], behavior); } - } }; - animationContextInstance.init(config); }); @@ -898,7 +921,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI parsedDefinition = this.parseDefinition(definitionCollection[i]); parsedSentence[parsedDefinition.key] = parsedDefinition.value; } - return parsedSentence; }, @@ -917,39 +939,37 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI definitionValue, EVENT_KEY = 'event', EVENT_TARGET_KEY = 'eventTarget', - BEHAVIOR_KEY = 'behavior', + BEHAVIOR_KEY = ['behavior', 'after', 'before'], BEHAVIOR_TARGET_KEY = 'behaviorTarget'; //Performance reasons - definitionBody = definition.split(':'); - if (definitionBody.length > 1) { definitionKey = definitionBody[0].trim(); - //CSS3 selectors support if(definitionBody.length > 2){ definitionValue = definitionBody.slice(1); definitionValue = definitionValue.join(':'); definitionValue = definitionValue.trim(); - } else { definitionValue = definitionBody[1].trim(); } parsedDefinition.value = definitionValue; - //Change by reserved words if (definitionKey === EVENT_RESERVED_WORD) { definitionKey = EVENT_KEY; } else if (definitionKey === EVENT_TARGET_RESERVED_WORD) { definitionKey = EVENT_TARGET_KEY; - } else if (definitionKey === BEHAVIOR_RESERVED_WORD) { - definitionKey = BEHAVIOR_KEY; - definitionValue = this.parseDoDefinition(definitionValue); } else if (definitionKey === BEHAVIOR_TARGET_RESERVED_WORD) { definitionKey = BEHAVIOR_TARGET_KEY; + } else { + for (var i = BEHAVIOR_RESERVED_WORD.length - 1; i >= 0; i--) { + if(definitionKey === BEHAVIOR_RESERVED_WORD[i]) { + definitionKey = BEHAVIOR_KEY[i]; + definitionValue = this.parseDoDefinition(definitionValue); + } + }; } - parsedDefinition.key = definitionKey; parsedDefinition.value = definitionValue; } @@ -963,13 +983,22 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @since 2014-09-03 * @param {[type]} doDefinition [description] */ - parseDoDefinition: function(doDefinition){ - var doDefinitionArray = doDefinition.split('$'); - if(doDefinitionArray.length > 1){ - doDefinitionArray = doDefinitionArray[1].split(' '); + parseDoDefinition: function(doDefinition) { + var reg = /^\$(\w+)\s*/g, + regMatch = reg.exec(doDefinition), + functionName = "", + parametersArray = [], it = 1; + + if(regMatch !== null) { + functionName = regMatch[1]; + doDefinitionArray = doDefinition.split(regMatch[0])[1]; + doDefinitionArray = doDefinitionArray !== null ? doDefinitionArray.split(PARAMS_SEPARATOR) : []; doDefinition = []; - doDefinition[0] = doDefinitionArray[0]; - doDefinition[1] = doDefinitionArray.slice(1).join(' '); + doDefinition[0] = functionName; + for (var i = 0; i < doDefinitionArray.length; i++) { + doDefinition[it++] = doDefinitionArray[i].trim(); + } + return doDefinition; } return doDefinition; } @@ -1043,8 +1072,17 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI */ isFunction: function(obj) { return !!(obj && obj.constructor && obj.call && obj.apply); + }, + /** + * Test if some object is an array + * @author Dariel Noel + * @since 2014-09-09 + * @return {Boolean} [description] + */ + beArray:function(object){ + return Array.isArray(object); } - } + }; ///////////////////////////////////////////////////////// // Public SubModules @@ -1194,7 +1232,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI } } - } + }; /** @@ -1206,7 +1244,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI */ AniJS.EventTarget = function EventTarget() { this._listeners = {}; - } + }; AniJS.EventTarget.prototype = { diff --git a/dist/helpers/dom/anijs-helper-dom-min.js b/dist/helpers/dom/anijs-helper-dom-min.js index 073a218..9436f22 100644 --- a/dist/helpers/dom/anijs-helper-dom-min.js +++ b/dist/helpers/dom/anijs-helper-dom-min.js @@ -1 +1 @@ -!function(){var a=AniJS.getHelper();a.addClass=function(b,c,d,e){a.makeAction(b,c,d,e,0)},a.removeClass=function(b,c,d,e){a.makeAction(b,c,d,e,1)},a.toggleClass=function(b,c,d,e){a.makeAction(b,c,d,e,2)},a.makeAction=function(a,b,c,d,e){animationContextBehaviorTargetList=b.behaviorTargetList,0===e?b.nodeHelper.addClass(c,d[1]):1===e?b.nodeHelper.removeClass(c,d[1]):b.nodeHelper.hasClass(c,d[1])?b.nodeHelper.removeClass(c,d[1]):b.nodeHelper.addClass(c,d[1]),b.hasRunned||b.run()}}(window); \ No newline at end of file +!function(){var a=AniJS.getHelper();a.addClass=function(b,c,d){a.makeAction(b,c,d,0,b.target)},a.removeClass=function(b,c,d){a.makeAction(b,c,d,1,b.target)},a.toggleClass=function(b,c,d){a.makeAction(b,c,d,2,b.target)},a.makeAction=function(a,b,c,d,e){0===d?b.nodeHelper.addClass(e,c[0]):1===d?b.nodeHelper.removeClass(e,c[0]):b.nodeHelper.hasClass(e,c[0])?b.nodeHelper.removeClass(e,c[0]):b.nodeHelper.addClass(e,c[0]),b.hasRunned||b.run()}}(window); \ No newline at end of file diff --git a/dist/helpers/dom/anijs-helper-dom.js b/dist/helpers/dom/anijs-helper-dom.js index 1cb35c0..01ce772 100644 --- a/dist/helpers/dom/anijs-helper-dom.js +++ b/dist/helpers/dom/anijs-helper-dom.js @@ -27,8 +27,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @param {object} animationContext AniJS Animation Context Object * @param {[string]} params [description] */ - AniJSDefaultHelper.addClass = function(e, animationContext, target, params) { - AniJSDefaultHelper.makeAction(e, animationContext, target, params, 0); + AniJSDefaultHelper.addClass = function(e, animationContext, params) { + AniJSDefaultHelper.makeAction(e, animationContext, params, 0, e.target); }; /** @@ -39,8 +39,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @param {object} animationContext AniJS Animation Context Object * @param {[string]} params [description] [description] */ - AniJSDefaultHelper.removeClass = function(e, animationContext, target, params) { - AniJSDefaultHelper.makeAction(e, animationContext, target, params, 1); + AniJSDefaultHelper.removeClass = function(e, animationContext, params) { + AniJSDefaultHelper.makeAction(e, animationContext, params, 1, e.target); }; /** @@ -51,8 +51,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @param {object} animationContext AniJS Animation Context Object * @param {[string]} params [description] */ - AniJSDefaultHelper.toggleClass = function(e, animationContext, target, params) { - AniJSDefaultHelper.makeAction(e, animationContext, target, params, 2); + AniJSDefaultHelper.toggleClass = function(e, animationContext, params) { + AniJSDefaultHelper.makeAction(e, animationContext, params, 2, e.target); }; /** @@ -63,18 +63,16 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @param {object} animationContext AniJS Animation Context Object * @param {[string]} params [description] */ - AniJSDefaultHelper.makeAction = function(e, animationContext, target, params, actionID){ - //Current elements that will be animated - animationContextBehaviorTargetList = animationContext.behaviorTargetList; + AniJSDefaultHelper.makeAction = function(e, animationContext, params, actionID, target){ if(actionID === 0){ - animationContext.nodeHelper.addClass(target, params[1]); + animationContext.nodeHelper.addClass(target, params[0]); } else if(actionID === 1){ - animationContext.nodeHelper.removeClass(target, params[1]); + animationContext.nodeHelper.removeClass(target, params[0]); } else{ - if(animationContext.nodeHelper.hasClass(target, params[1])){ - animationContext.nodeHelper.removeClass(target, params[1]); + if(animationContext.nodeHelper.hasClass(target, params[0])){ + animationContext.nodeHelper.removeClass(target, params[0]); }else { - animationContext.nodeHelper.addClass(target, params[1]); + animationContext.nodeHelper.addClass(target, params[0]); } } //Run the animation diff --git a/src/anijs.js b/src/anijs.js index 9838c72..ec47033 100644 --- a/src/anijs.js +++ b/src/anijs.js @@ -18,7 +18,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI factory(root, true) : function(w) { if (!w.document) { - throw new Error("AniJS requires a window with a document"); + throw new Error("AniJS-RWWD"); } return factory(w); }; @@ -41,10 +41,11 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI var ANIJS_DATATAG_NAME = 'data-anijs', DEFAULT = 'default', BODY = 'body', + PARAMS_SEPARATOR = '&', MULTIPLE_CLASS_SEPARATOR = '$', EVENT_RESERVED_WORD = 'if', EVENT_TARGET_RESERVED_WORD = 'on', - BEHAVIOR_RESERVED_WORD = 'do', + BEHAVIOR_RESERVED_WORD = ['do', 'after', 'before'], BEHAVIOR_TARGET_RESERVED_WORD = 'to', REGEX_BEGIN = '(\\s+|^)', REGEX_END = '(\\s+|$)', @@ -276,7 +277,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI return AniJS.eventProviderCollection[eventProviderID]; } - } + }; ///////////////////////////////////////////////////////// // Private Methods an Vars @@ -284,7 +285,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI var selfish = { - } + }; /** * Description @@ -302,7 +303,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return */ removeAnim: function(e, animationContext) { - if(e.target){ + if(e.target && e.type){ animationContext.nodeHelper.removeClass(e.target, animationContext.behavior); } }, @@ -362,14 +363,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI //Es obligatorio definir de eventTarget ATTR if (event !== '') { - var size = eventTargetList.length, i = 0, eventTargetItem; for (i; i < size; i++) { eventTargetItem = eventTargetList[i]; - if (AniJS.EventSystem.isEventTarget(eventTargetItem)) { var listener = function(event) { @@ -380,7 +379,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI after = selfish._afterHelper(element, aniJSParsedSentence); if (selfish._classNamesWhenAnim !== '') { - if(!Array.isArray(behavior)) + if(!selfish.Util.beArray(behavior)) behavior += selfish._classNamesWhenAnim; } @@ -395,12 +394,16 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI //TODO: eventSystem should be called directly }, - animationContextInstance = new AniJS.AnimationContext(animationContextConfig); + animationContextInstance = new AniJS.AnimationContext(animationContextConfig); //Si before, le paso el animation context //TODO: Util is a submodule - if (before && selfish.Util.isFunction(before)) { - before(event, animationContextInstance); + if (before) { + if(selfish.Util.isFunction(before)) { + before(event, animationContextInstance); + } else if(selfish.Util.beArray(before)) { + before[0](event, animationContextInstance, selfish._paramsHelper(before)); + } } else { animationContextInstance.run(); } @@ -416,8 +419,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI } - } else { - console.log('You must define some event'); } }; @@ -507,7 +508,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI behaviorTargetNodeList = rootDOMTravelScope.querySelectorAll(behaviorTarget); } catch (e) { behaviorTargetNodeList = []; - console.log('ugly selector here'); } } @@ -524,17 +524,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return defaultValue */ selfish._behaviorHelper = function(aniJSParsedSentence) { - var defaultValue = aniJSParsedSentence.behavior || '', - executeFunction; - if(Array.isArray(defaultValue)){ - executeFunction = selfish._callbackHelper({}, aniJSParsedSentence, defaultValue[0]); - if(executeFunction){ - defaultValue[0] = executeFunction; - } else { - defaultValue = defaultValue.join(' '); - } - } - return defaultValue; + return this._actionHelper({}, aniJSParsedSentence, aniJSParsedSentence.behavior); }; /** @@ -545,8 +535,11 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return defaultValue */ selfish._afterHelper = function(element, aniJSParsedSentence) { - var defaultValue = selfish._callbackHelper(element, aniJSParsedSentence, aniJSParsedSentence.after); - return defaultValue; + var defaultValue = aniJSParsedSentence.after; + // return defaultValue; + if(!selfish.Util.beArray(defaultValue)) + return selfish._callbackHelper(element, aniJSParsedSentence, defaultValue); + return this._actionHelper(element, aniJSParsedSentence, defaultValue); }; /** @@ -557,7 +550,32 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return defaultValue */ selfish._beforeHelper = function(element, aniJSParsedSentence) { - var defaultValue = selfish._callbackHelper(element, aniJSParsedSentence, aniJSParsedSentence.before); + var defaultValue = aniJSParsedSentence.before; + if(!selfish.Util.beArray(defaultValue)) + return selfish._callbackHelper(element, aniJSParsedSentence, defaultValue); + return this._actionHelper(element, aniJSParsedSentence, defaultValue); + }; + /** + * The executed actions helper + * @author Dariel Noel + * @since 2014-09-10 + * @param {[type]} element [description] + * @param {[type]} aniJSParsedSentence [description] + * @param {[type]} action [description] + * @return {[type]} [description] + */ + selfish._actionHelper = function(element, aniJSParsedSentence, action) { + var defaultValue = action || '', + executeFunction; + if(selfish.Util.beArray(defaultValue)) { + executeFunction = selfish._callbackHelper(element, aniJSParsedSentence, defaultValue[0]); + if(executeFunction) { + defaultValue[0] = executeFunction; + } else { + defaultValue = defaultValue.join(' '); + } + + } return defaultValue; }; @@ -578,7 +596,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI var helperCollection = selfish._helperCollection, helperInstance = helperCollection[helper]; - if (helperInstance && helperInstance[defaultValue]) { + if (helperInstance && selfish.Util.isFunction(helperInstance[defaultValue])) { defaultValue = helperInstance[defaultValue]; } else { defaultValue = false; @@ -651,6 +669,13 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI return defaultValue; }; + selfish._paramsHelper = function(paramsArray){ + var arr = [], + i = paramsArray.length; + while(i-- > 1) arr[i - 1] = paramsArray[i]; + return arr; + }; + /** * Parse an String Declaration * @method _getParsedAniJSSentenceCollection @@ -704,8 +729,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI */ selfish._endPrefixBrowserDetectionIndex = function() { //TODO: Delete de element after create this - var el = document.createElement('fakeelement'), - animationBrowserDetection = ['animation', 'OAnimation', 'MozAnimation', 'webkitAnimation']; + var el = document.createElement('fe'), + ANIM = 'Animation', + animationBrowserDetection = ['animation', 'O'+ANIM, 'Moz'+ANIM, 'webkit'+ANIM]; for (var i = 0; i < animationBrowserDetection.length; i++) { if (el.style[animationBrowserDetection[i]] !== undefined) { @@ -770,17 +796,20 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI //create event instance.eventSystem.addEventListenerHelper(target, animationEndEvent, function(e) { - e.stopPropagation(); //remove event instance.eventSystem.removeEventListenerHelper(e.target, e.type, arguments.callee); - // callback handler if (!after) { //removing the animation by default if there are not an after function nodeHelper.removeClass(e.target, behavior); - } else if(selfish.Util.isFunction(after)){ - after(e, animationContextInstance); + } else { + if(selfish.Util.isFunction(after)){ + after(e, animationContextInstance); + } else if(selfish.Util.beArray(after)) { + console.log(after); + after[0](e, animationContextInstance, selfish._paramsHelper(after)); + } } }); }, @@ -796,10 +825,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI animationContextInstance.doFunctionAction = function(target, behavior){ var instance = animationContextInstance, after = instance.after, - e = {}; - behavior[0](e, animationContextInstance, target, behavior); + e = {target:target}; + behavior[0](e, animationContextInstance, selfish._paramsHelper(behavior)); if(selfish.Util.isFunction(after)){ after(e, animationContextInstance); + } else { + if(selfish.Util.beArray(after)) { + after[0](e, animationContextInstance, selfish._paramsHelper(after)); + } } }, @@ -818,17 +851,15 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI animationContextInstance.hasRunned = 1; for (j; j < behaviorTargetListSize; j++) { - if(Array.isArray(behavior)){ + if(selfish.Util.beArray(behavior)){ animationContextInstance .doFunctionAction(behaviorTargetList[j], behavior); } else{ animationContextInstance .doDefaultAction(behaviorTargetList[j], behavior); } - } }; - animationContextInstance.init(config); }); @@ -898,7 +929,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI parsedDefinition = this.parseDefinition(definitionCollection[i]); parsedSentence[parsedDefinition.key] = parsedDefinition.value; } - return parsedSentence; }, @@ -917,39 +947,37 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI definitionValue, EVENT_KEY = 'event', EVENT_TARGET_KEY = 'eventTarget', - BEHAVIOR_KEY = 'behavior', + BEHAVIOR_KEY = ['behavior', 'after', 'before'], BEHAVIOR_TARGET_KEY = 'behaviorTarget'; //Performance reasons - definitionBody = definition.split(':'); - if (definitionBody.length > 1) { definitionKey = definitionBody[0].trim(); - //CSS3 selectors support if(definitionBody.length > 2){ definitionValue = definitionBody.slice(1); definitionValue = definitionValue.join(':'); definitionValue = definitionValue.trim(); - } else { definitionValue = definitionBody[1].trim(); } parsedDefinition.value = definitionValue; - //Change by reserved words if (definitionKey === EVENT_RESERVED_WORD) { definitionKey = EVENT_KEY; } else if (definitionKey === EVENT_TARGET_RESERVED_WORD) { definitionKey = EVENT_TARGET_KEY; - } else if (definitionKey === BEHAVIOR_RESERVED_WORD) { - definitionKey = BEHAVIOR_KEY; - definitionValue = this.parseDoDefinition(definitionValue); } else if (definitionKey === BEHAVIOR_TARGET_RESERVED_WORD) { definitionKey = BEHAVIOR_TARGET_KEY; + } else { + for (var i = BEHAVIOR_RESERVED_WORD.length - 1; i >= 0; i--) { + if(definitionKey === BEHAVIOR_RESERVED_WORD[i]) { + definitionKey = BEHAVIOR_KEY[i]; + definitionValue = this.parseDoDefinition(definitionValue); + } + }; } - parsedDefinition.key = definitionKey; parsedDefinition.value = definitionValue; } @@ -963,13 +991,22 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @since 2014-09-03 * @param {[type]} doDefinition [description] */ - parseDoDefinition: function(doDefinition){ - var doDefinitionArray = doDefinition.split('$'); - if(doDefinitionArray.length > 1){ - doDefinitionArray = doDefinitionArray[1].split(' '); + parseDoDefinition: function(doDefinition) { + var reg = /^\$(\w+)\s*/g, + regMatch = reg.exec(doDefinition), + functionName = "", + parametersArray = [], it = 1; + + if(regMatch !== null) { + functionName = regMatch[1]; + doDefinitionArray = doDefinition.split(regMatch[0])[1]; + doDefinitionArray = doDefinitionArray !== null ? doDefinitionArray.split(PARAMS_SEPARATOR) : []; doDefinition = []; - doDefinition[0] = doDefinitionArray[0]; - doDefinition[1] = doDefinitionArray.slice(1).join(' '); + doDefinition[0] = functionName; + for (var i = 0; i < doDefinitionArray.length; i++) { + doDefinition[it++] = doDefinitionArray[i].trim(); + } + return doDefinition; } return doDefinition; } @@ -1043,8 +1080,17 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI */ isFunction: function(obj) { return !!(obj && obj.constructor && obj.call && obj.apply); + }, + /** + * Test if some object is an array + * @author Dariel Noel + * @since 2014-09-09 + * @return {Boolean} [description] + */ + beArray:function(object){ + return Array.isArray(object); } - } + }; ///////////////////////////////////////////////////////// // Public SubModules @@ -1194,7 +1240,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI } } - } + }; /** @@ -1206,7 +1252,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI */ AniJS.EventTarget = function EventTarget() { this._listeners = {}; - } + }; AniJS.EventTarget.prototype = { diff --git a/src/helpers/dom/anijs-helper-dom.js b/src/helpers/dom/anijs-helper-dom.js index 1cb35c0..93ddb46 100644 --- a/src/helpers/dom/anijs-helper-dom.js +++ b/src/helpers/dom/anijs-helper-dom.js @@ -27,8 +27,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @param {object} animationContext AniJS Animation Context Object * @param {[string]} params [description] */ - AniJSDefaultHelper.addClass = function(e, animationContext, target, params) { - AniJSDefaultHelper.makeAction(e, animationContext, target, params, 0); + AniJSDefaultHelper.addClass = function(e, animationContext, params) { + AniJSDefaultHelper.makeAction(e, animationContext, params, 0, e.target); }; /** @@ -39,8 +39,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @param {object} animationContext AniJS Animation Context Object * @param {[string]} params [description] [description] */ - AniJSDefaultHelper.removeClass = function(e, animationContext, target, params) { - AniJSDefaultHelper.makeAction(e, animationContext, target, params, 1); + AniJSDefaultHelper.removeClass = function(e, animationContext, params) { + AniJSDefaultHelper.makeAction(e, animationContext, params, 1, e.target); }; /** @@ -51,8 +51,16 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @param {object} animationContext AniJS Animation Context Object * @param {[string]} params [description] */ - AniJSDefaultHelper.toggleClass = function(e, animationContext, target, params) { - AniJSDefaultHelper.makeAction(e, animationContext, target, params, 2); + AniJSDefaultHelper.toggleClass = function(e, animationContext, params) { + AniJSDefaultHelper.makeAction(e, animationContext, params, 2, e.target); + }; + + AniJSDefaultHelper.remove = function(e, animationContext, params){ + var selector = params[0], + elementsToDelete = e.target; + if(selector){ + elementsToDelete = document.querySelectorAll(selector); + } }; /** @@ -63,18 +71,16 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @param {object} animationContext AniJS Animation Context Object * @param {[string]} params [description] */ - AniJSDefaultHelper.makeAction = function(e, animationContext, target, params, actionID){ - //Current elements that will be animated - animationContextBehaviorTargetList = animationContext.behaviorTargetList; + AniJSDefaultHelper.makeAction = function(e, animationContext, params, actionID, target){ if(actionID === 0){ - animationContext.nodeHelper.addClass(target, params[1]); + animationContext.nodeHelper.addClass(target, params[0]); } else if(actionID === 1){ - animationContext.nodeHelper.removeClass(target, params[1]); + animationContext.nodeHelper.removeClass(target, params[0]); } else{ - if(animationContext.nodeHelper.hasClass(target, params[1])){ - animationContext.nodeHelper.removeClass(target, params[1]); + if(animationContext.nodeHelper.hasClass(target, params[0])){ + animationContext.nodeHelper.removeClass(target, params[0]); }else { - animationContext.nodeHelper.addClass(target, params[1]); + animationContext.nodeHelper.addClass(target, params[0]); } } //Run the animation diff --git a/src/helpers/scrollreveal/anijs-helper-scrollreveal.js b/src/helpers/scrollreveal/anijs-helper-scrollreveal.js index e7e6896..738bdff 100644 --- a/src/helpers/scrollreveal/anijs-helper-scrollreveal.js +++ b/src/helpers/scrollreveal/anijs-helper-scrollreveal.js @@ -24,10 +24,10 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @method scrollReveal * @param {} e * @param {} animationContext - * @return + * @return */ - AniJSDefaultHelper.scrollReveal = function(e, animationContext) { - + AniJSDefaultHelper.scrollReveal = function(e, animationContext, params) { + var viewportRatio = params[0] || 0.33; //Current elements that will be animated animationContextBehaviorTargetList = animationContext.behaviorTargetList; @@ -38,7 +38,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI element = animationContextBehaviorTargetList[i]; //Check if the element is visible - if (ScrollRevealHelper.isElementInViewport(element, 0.33)) { + if (ScrollRevealHelper.isElementInViewport(element, viewportRatio)) { //The element is not animated again if it's visible if (!element.isRevealed) { @@ -56,7 +56,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI //Run the animation animationContext.run(); - } + }; /** * Helper the custom EventTarget @@ -68,7 +68,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI var ScrollRevealHelper = { //ATTRS - + //TODO: This attrs should be customizable viewportFactor: 1, docElem: window.document.documentElement, @@ -97,8 +97,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI * @return ConditionalExpression */ _getViewportH: function() { - var client = this.docElem['clientHeight'], - inner = window['innerHeight']; + var client = this.docElem.clientHeight, + inner = window.innerHeight; return (client < inner) ? inner : client; }, diff --git a/test/jasmine-standalone/SpecRunner.html b/test/jasmine-standalone/SpecRunner.html index 2e31497..98367c5 100644 --- a/test/jasmine-standalone/SpecRunner.html +++ b/test/jasmine-standalone/SpecRunner.html @@ -15,13 +15,14 @@ - + + diff --git a/test/jasmine-standalone/spec/AniJSSpec.js b/test/jasmine-standalone/spec/AniJSSpec.js index 48f07cd..0f29bec 100644 --- a/test/jasmine-standalone/spec/AniJSSpec.js +++ b/test/jasmine-standalone/spec/AniJSSpec.js @@ -423,6 +423,35 @@ YUI().use('node', 'node-event-simulate', function (Y) { targetNode.simulate("click"); }); + describe('the function has', function(){ + beforeEach(function(done) { + //Aqui creo el nodo + var htmlNode = '
Test
'; + Y.one('#testzone').appendChild(htmlNode); + }); + //Registered var with same function name + it("one param", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, before: beforeFunction paramA', + targetNode; + + AniJS.getHelper().beforeFunction = function(e, animationContext, params){ + expect(params[0]).toBe('paramA'); + }; + + targetNode = Y.one('#testzone .test'); + + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.run(); + + targetNode.on('click', function(e){ + //expect(Y.one('body').hasClass('bounce')).toBeFalsy(); + },this, true); + + targetNode.simulate("click"); + }); + }); + }); //--------------------------------------------------------------------- diff --git a/test/jasmine-standalone/spec/AniJSSpecParametros.js b/test/jasmine-standalone/spec/AniJSSpecParametros.js new file mode 100644 index 0000000..cbc54dd --- /dev/null +++ b/test/jasmine-standalone/spec/AniJSSpecParametros.js @@ -0,0 +1,233 @@ +YUI().use('node', 'node-event-simulate', function (Y) { + describe("AniJS", function() { + + //Aqui se pueden poner variables para tener acceso globalmente + + + //Funcion que se ejecuta antes de empezar + beforeEach(function() { + + }); + + afterEach(function() { + + }); + + // Execute a function before animation run + //--------------------------------------------------------------------- + describe("Execute a function before animation run", function() { + beforeEach(function() { + //Aqui creo el nodo + var htmlNode = '
Test
'; + Y.one('#testzone').appendChild(htmlNode); + }); + + afterEach(function() { + Y.one('#testzone .test').remove(); + Y.one('body').removeClass('bounce'); + }); + + it("empty function", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, before: beforeFunction', + targetNode; + + AniJS.getHelper().beforeFunction = function(){ + expect(true).toBeTruthy(); + }; + + targetNode = Y.one('#testzone .test'); + + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.run(); + + targetNode.on('click', function(e){ + expect(Y.one('body').hasClass('bounce')).toBeFalsy(); + },this, true); + + targetNode.simulate("click"); + }); + + //Se espera que no cree la funcion + it("non registered function", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, before: beforeNonRegistered', + targetNode; + + targetNode = Y.one('#testzone .test'); + + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.run(); + + expect(AniJS.getHelper['beforeNonRegistered']).toBeFalsy(); + + targetNode.on('click', function(e){ + expect(Y.one('body').hasClass('bounce')).toBeTruthy(); + },this, true); + + targetNode.simulate("click"); + }); + + //Registered var with same function name + it("registered var with same function name", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, before: beforeVarSameName', + targetNode; + + targetNode = Y.one('#testzone .test'); + + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.getHelper().beforeVarSameName = '23'; + + AniJS.run(); + + targetNode.on('click', function(e){ + expect(Y.one('body').hasClass('bounce')).toBeTruthy(); + },this, true); + + targetNode.simulate("click"); + }); + }); + + //--------------------------------------------------------------------- + // Animation execution management before running it + //--------------------------------------------------------------------- + describe("Animation execution management before running it.", function() { + beforeEach(function() { + //Aqui creo el nodo + var htmlNode = '
Test
'; + Y.one('#testzone').appendChild(htmlNode); + }); + + afterEach(function() { + Y.one('#testzone .test').remove(); + Y.one('body').removeClass('bounce'); + }); + + it("stop animation execution", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, before: beforeFunction', + targetNode; + + AniJS.getHelper().beforeFunction = function(e, animationContext){ + expect(true).toBeTruthy(); + + //animationContext.run(); + }; + + targetNode = Y.one('#testzone .test'); + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.run(); + + targetNode.on('click', function(e){ + expect(Y.one('body').hasClass('bounce')).toBeFalsy(); + },this, true); + + targetNode.simulate("click"); + }); + + it("run animation execution", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, before: beforeFunction', + targetNode; + + AniJS.getHelper().beforeFunction = function(e, animationContext){ + expect(true).toBeTruthy(); + animationContext.run(); + }; + + targetNode = Y.one('#testzone .test'); + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.run(); + + targetNode.on('click', function(e){ + expect(Y.one('body').hasClass('bounce')).toBeTruthy(); + },this, true); + + targetNode.simulate("click"); + }); + }); + + //--------------------------------------------------------------------- + // Execute a function after animation run + //--------------------------------------------------------------------- + describe("Execute a function after animation run", function() { + beforeEach(function() { + //Aqui creo el nodo + var htmlNode = '
Test
'; + Y.one('#testzone').appendChild(htmlNode); + }); + + afterEach(function() { + Y.one('#testzone .test').remove(); + Y.one('body').removeClass('bounce'); + }); + + it("empty function", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, after: afterFunction', + targetNode; + + AniJS.getHelper().afterFunction = function(){ + console.log('haciendo after function'); + }; + + targetNode = Y.one('#testzone .test'); + + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.run(); + + targetNode.on('click', function(e){ + expect(Y.one('body').hasClass('bounce')).toBeTruthy(); + },this, true); + + targetNode.simulate("click"); + }); + + //Se espera que no cree la funcion + it("non registered function", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, after: afterNonRegistered', + targetNode; + + targetNode = Y.one('#testzone .test'); + + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.run(); + + expect(AniJS.getHelper['afterNonRegistered']).toBeFalsy(); + + targetNode.on('click', function(e){ + expect(Y.one('body').hasClass('bounce')).toBeTruthy(); + },this, true); + + targetNode.simulate("click"); + }); + + //Registered var with same function name + it("registered var with same function name", function() { + var dataAnijJS = 'if: click, do: bounce, to: body, after: afterVarSameName', + targetNode; + + targetNode = Y.one('#testzone .test'); + + targetNode.setAttribute('data-anijs', dataAnijJS); + + AniJS.getHelper().afterVarSameName = '23'; + + AniJS.run(); + + targetNode.on('click', function(e){ + expect(Y.one('body').hasClass('bounce')).toBeTruthy(); + },this, true); + + targetNode.simulate("click"); + }); + }); + + }); +}); + + + +