diff --git a/dist/kutty.js b/dist/kutty.js index c8b00310..35ce3150 100644 --- a/dist/kutty.js +++ b/dist/kutty.js @@ -158,6 +158,15 @@ var kutty = kutty || (function () { sheet.insertRule(rule, sheet.cssRules.length); } + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + //========================================================================================== // public API //========================================================================================== @@ -167,9 +176,10 @@ var kutty = kutty || (function () { } function onLoadHelper(callback) { - kutty.on("load.kutty", function(evt) { + var value = kutty.on("load.kutty", function(evt) { callback(evt.detail.elt); }); + return value; } function logAll(){ @@ -182,17 +192,17 @@ var kutty = kutty || (function () { function find(eltOrSelector, selector) { if (selector) { - eltOrSelector.querySelector(eltOrSelector); + return eltOrSelector.querySelector(selector); } else { - getDocument().body.querySelector(eltOrSelector); + return getDocument().body.querySelector(eltOrSelector); } } function findAll(eltOrSelector, selector) { if (selector) { - eltOrSelector.querySelectorAll(eltOrSelector); + return eltOrSelector.querySelectorAll(selector); } else { - getDocument().body.querySelectorAll(eltOrSelector); + return getDocument().body.querySelectorAll(eltOrSelector); } } @@ -212,7 +222,7 @@ var kutty = kutty || (function () { } } - function removeClassFromElement(elt, clazz) { + function removeClassFromElement(elt, clazz, delay) { if (delay) { setTimeout(function(){removeClassFromElement(elt, clazz);}, delay) } else { @@ -225,7 +235,7 @@ var kutty = kutty || (function () { } function takeClassForElement(elt, clazz) { - forEach(elt.parent.children, function(child){ + forEach(elt.parentElement.children, function(child){ removeClassFromElement(child, clazz); }) addClassToElement(elt, clazz); @@ -254,23 +264,22 @@ var kutty = kutty || (function () { } function addKuttyEventListener(arg1, arg2, arg3) { - var eventArgs = processEventArgs(arg1, arg2, arg3); ready(function(){ + var eventArgs = processEventArgs(arg1, arg2, arg3); eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener); }) - return eventArgs.listener; + var b = isFunction(arg2); + return b ? arg2 : arg3; } function removeKuttyEventListener(arg1, arg2, arg3) { - var eventArgs = processEventArgs(arg1, arg2, arg3); ready(function(){ - eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener); + var eventArgs = processEventArgs(arg1, arg2, arg3); + eventArgs.target.removeEventListener(eventArgs.event, eventArgs.listener); }) - return eventArgs.listener; + return isFunction(arg2) ? arg2 : arg3; } - - //==================================================================== // Node processing //==================================================================== @@ -281,6 +290,8 @@ var kutty = kutty || (function () { var targetStr = getRawAttribute(explicitTarget, "kt-target"); if (targetStr === "this") { return explicitTarget; + } else if (targetStr.indexOf("closest ") === 0) { + return closest(elt, targetStr.substr(8)); } else { return getDocument().querySelector(targetStr); } @@ -545,7 +556,7 @@ var kutty = kutty || (function () { function isLocalLink(elt) { return location.hostname === elt.hostname && getRawAttribute(elt,'href') && - !getRawAttribute(elt,'href').startsWith("#") + getRawAttribute(elt,'href').indexOf("#") !== 0; } function boostElement(elt, nodeData, triggerSpec) { @@ -760,7 +771,7 @@ var kutty = kutty || (function () { } function triggerErrorEvent(elt, eventName, detail) { - triggerEvent(elt, eventName, Object.assign({isError:true}, details)); + triggerEvent(elt, eventName, mergeObjects({isError:true}, detail)); } function triggerEvent(elt, eventName, detail) { @@ -947,7 +958,7 @@ var kutty = kutty || (function () { } } - function getInputValues(elt) { + function getInputValues(elt, verb) { var processed = []; var values = {}; // include the element itself @@ -962,8 +973,10 @@ var kutty = kutty || (function () { }); } - // include the closest form - processInputValue(processed, values, closest(elt, 'form')); + // for a non-GET include the closest form + if (verb !== 'get') { + processInputValue(processed, values, closest(elt, 'form')); + } return values; } @@ -1042,12 +1055,7 @@ var kutty = kutty || (function () { return newValues; } } else { - // By default GETs do not include parameters - if (verb === 'get') { - return {}; - } else { - return inputValues; - } + return inputValues; } } @@ -1203,7 +1211,7 @@ var kutty = kutty || (function () { }; if (swapSpec.swapDelay > 0) { - setTimeout(doSwap, parseInterval(swapSpec.swapDelay)) + setTimeout(doSwap, swapSpec.swapDelay) } else { doSwap(); } @@ -1252,7 +1260,7 @@ var kutty = kutty || (function () { var element = getDocument().querySelector('meta[name="kutty-config"]'); if (element) { var source = JSON.parse(element.content); - kutty.config = Object.assign(kutty.config , source) + kutty.config = mergeObjects(kutty.config , source) } } diff --git a/dist/kutty.min.js b/dist/kutty.min.js index c79d3e7b..7d05ceec 100644 --- a/dist/kutty.min.js +++ b/dist/kutty.min.js @@ -1 +1 @@ -var kutty=kutty||function(){"use strict";var e=["get","post","put","delete","patch"];function k(e){if(e==="null"||e==="false"||e===""){return null}else if(e.lastIndexOf("ms")===e.length-2){return parseFloat(e.substr(0,e.length-2))}else if(e.lastIndexOf("s")===e.length-1){return parseFloat(e.substr(0,e.length-1))*1e3}else{return parseFloat(e)}}function b(e,t){return e.getAttribute&&e.getAttribute(t)}function u(e,t){return b(e,t)||b(e,"data-"+t)}function n(e){return e.parentElement}function a(){return document}function o(e,t){if(t(e)){return e}else if(n(e)){return o(n(e),t)}else{return null}}function S(e,t){var r=null;o(e,function(e){return r=b(e,t)});return r}function l(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function r(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}return i}function s(e){var t=r(e);switch(t){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i(""+e+"
",1);case"col":return i(""+e+"
",2);case"tr":return i(""+e+"
",2);case"td":case"th":return i(""+e+"
",3);default:return i(e,0)}}function t(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function f(e){return t(e,"Function")}function c(e){return t(e,"Object")}function w(e){var t="kutty-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function E(e,t){if(e){for(var r=0;r=0}function v(e){return a().body.contains(e)}function y(e,t){return e.concat(t)}function g(e){return e.split(/\s+/)}function h(e){var t=a().styleSheets[0];t.insertRule(e,t.cssRules.length)}function p(e){return eval(e)}function m(t){kutty.on("load.kutty",function(e){t(e.detail.elt)})}function T(){kutty.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function C(e,t){if(t){e.querySelector(e)}else{a().body.querySelector(e)}}function L(e,t){if(t){e.querySelectorAll(e)}else{a().body.querySelectorAll(e)}}function O(e,t){if(t){setTimeout(function(){O(e)},t)}else{e.parentElement.removeChild(e)}}function q(e,t,r){if(r){setTimeout(function(){q(e,t)},r)}else{e.classList.add(t)}}function N(e,t){if(delay){setTimeout(function(){N(e,t)},delay)}else{e.classList.remove(t)}}function A(e,t){e.classList.toggle(t)}function x(e,t){E(e.parent.children,function(e){N(e,t)});q(e,t)}function D(e,t){do{if(e==null||l(e,t))return e}while(e=e&&n(e))}function M(e,t,r){if(f(t)){return{target:a().body,event:e,listener:t}}else{return{target:e,event:t,listener:r}}}function R(e,t,r){var n=M(e,t,r);Pe(function(){n.target.addEventListener(n.event,n.listener)});return n.listener}function X(e,t,r){var n=M(e,t,r);Pe(function(){n.target.addEventListener(n.event,n.listener)});return n.listener}function H(e){var t=o(e,function(e){return b(e,"kt-target")!==null});if(t){var r=b(t,"kt-target");if(r==="this"){return t}else{return a().querySelector(r)}}else{var n=w(e);if(n.boosted){return a().body}else{return e}}}function I(t,r){E(t.attributes,function(e){if(!r.hasAttribute(e.name)){t.removeAttribute(e.name)}});E(r.attributes,function(e){t.setAttribute(e.name,e.value)})}function F(e){var n=[];E(e.children,function(e){if(u(e,"kt-swap-oob")==="true"){var t=a().getElementById(e.id);if(t){var r=a().createDocumentFragment();r.appendChild(e);n=n.concat(j(t,r))}else{e.parentNode.removeChild(e);ge(a().body,"oobErrorNoTarget.kutty",{content:e})}}});return n}function K(n,e){var i=[];E(e.querySelectorAll("[id]"),function(e){var t=n.querySelector(e.tagName+"[id="+e.id+"]");if(t){var r=e.cloneNode();I(e,t);i.push(function(){I(e,r)})}});return i}function P(e,t,r){var n=K(e,r);while(r.childNodes.length>0){var i=r.firstChild;e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE){he(i,"load.kutty",{});de(i)}}return n}function j(e,t){if(e.tagName==="BODY"){return V(e,t)}else{var r=P(n(e),e,t);n(e).removeChild(e);return r}}function J(e,t){return P(e,e.firstChild,t)}function U(e,t){return P(n(e),e,t)}function z(e,t){return P(e,null,t)}function B(e,t){return P(n(e),e.nextSibling,t)}function V(e,t){var r=e.firstChild;var n=P(e,r,t);if(r){while(r.nextSibling){e.removeChild(r.nextSibling)}e.removeChild(r)}return n}function G(e,t){var r=S(e,"kt-select");if(r){var n=a().createDocumentFragment();E(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function Y(e,t,r,n){var i=s(n);if(i){var a=F(i);i=G(r,i);switch(e){case"outerHTML":return y(a,j(t,i));case"afterbegin":return y(a,J(t,i));case"beforebegin":return y(a,U(t,i));case"beforeend":return y(a,z(t,i));case"afterend":return y(a,B(t,i));default:return y(a,V(t,i))}}}function _(e,t){if(t){if(t.indexOf("{")===0){var r=JSON.parse(t);for(var n in r){if(r.hasOwnProperty(n)){var i=r[n];if(!c(i)){i={value:i}}he(e,n,i)}}}else{he(e,t,[])}}}function W(e){var t={trigger:"click"};var r=u(e,"kt-trigger");if(r){var n=g(r);if(n.length>0){var i=n[0];if(i==="every"){t.pollInterval=k(n[1])}else if(i.indexOf("sse:")===0){t.sseEvent=i.substr(4)}else{t["trigger"]=i;for(var a=1;a1){var r=t[0];var n=t[1].trim();var i;var a;if(n.indexOf(":")>0){var o=n.split(":");i=o[0];a=k(o[1])}else{i=n;a=100}return{operation:r,cssClass:i,delay:a}}else{return null}}function Z(i,e){E(e.split("&"),function(e){var n=0;E(e.split(","),function(e){var t=e.trim();var r=Q(t);if(r){if(r.operation==="toggle"){setTimeout(function(){setInterval(function(){i.classList[r.operation].call(i.classList,r.cssClass)},r.delay)},n);n=n+r.delay}else{n=n+r.delay;setTimeout(function(){i.classList[r.operation].call(i.classList,r.cssClass)},n)}}})})}function $(e){w(e).cancelled=true}function ee(e,t,r,n){var i=w(e);i.timeout=setTimeout(function(){if(v(e)&&i.cancelled!==true){Ke(e,t,r);ee(e,t,u(e,"kt-"+t),n)}},n)}function te(e){return location.hostname===e.hostname&&b(e,"href")&&!b(e,"href").startsWith("#")}function re(e,t,r){if(e.tagName==="A"&&te(e)||e.tagName==="FORM"){t.boosted=true;var n,i;if(e.tagName==="A"){n="get";i=b(e,"href")}else{var a=b(e,"method");n=a?a.toLowerCase():"get";i=b(e,"action")}ie(e,n,i,t,r,true)}}function ne(e){return e.tagName==="FORM"||l(e,'input[type="submit"], button')&&D(e,"form")!==null||e.tagName==="A"&&e.href&&e.href.indexOf("#")!==0}function ie(i,a,o,e,u,l){var t=function(e){if(l||ne(i))e.preventDefault();var t=w(e);var r=w(i);if(!t.handled){t.handled=true;if(u.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(u.changed){if(r.lastValue===i.value){return}else{r.lastValue=i.value}}if(r.delayed){clearTimeout(r.delayed)}var n=function(){Ke(i,a,o,e.target)};if(u.delay){r.delayed=setTimeout(n,u.delay)}else{n()}}};e.trigger=u.trigger;e.eventListener=t;i.addEventListener(u.trigger,t)}function ae(){if(!window["kuttyScrollHandler"]){var e=function(){E(a().querySelectorAll("[kt-trigger='revealed']"),function(e){oe(e)})};window["kuttyScrollHandler"]=e;window.addEventListener("scroll",e)}}function oe(e){var t=w(e);if(!t.revealed&&d(e)){t.revealed=true;Ke(e,t.verb,t.path)}}function ue(e){if(!v(e)){e.sseSource.close();return true}}function le(t,e){var r={config:{withCredentials:true}};he(t,"initSSE.kutty",r);var n=new EventSource(e,r.config);n.onerror=function(e){ge(t,"sseError.kutty",{error:e,source:n});ue(t)};w(t).sseSource=n}function se(e,t,r,n){var i=o(e,function(e){return e.sseSource});if(i){var a=function(){if(!ue(i)){if(v(e)){Ke(e,t,r)}else{i.sseSource.removeEventListener(n,a)}}};i.sseSource.addEventListener(n,a)}else{ge(e,"noSSESourceError.kutty")}}function fe(e,t,r,n,i){var a=function(){if(!n.loaded){n.loaded=true;Ke(e,t,r)}};if(i){setTimeout(a,i)}else{a()}}function ce(r,n,i){var a=false;E(e,function(e){var t=u(r,"kt-"+e);if(t){a=true;n.path=t;n.verb=e;if(i.sseEvent){se(r,e,t,i.sseEvent)}else if(i.trigger==="revealed"){ae();oe(r)}else if(i.trigger==="load"){fe(r,e,t,n,i.delay)}else if(i.pollInterval){n.polling=true;ee(r,e,t,i.pollInterval)}else{ie(r,e,t,n,i)}}});return a}function de(e){var t=w(e);if(!t.processed){t.processed=true;var r=W(e);var n=ce(e,t,r);if(!n&&S(e,"kt-boost")==="true"){re(e,t,r)}var i=u(e,"kt-sse-source");if(i){le(e,i)}var a=u(e,"kt-classes");if(a){Z(e,a)}}if(e.children){E(e.children,function(e){de(e)})}}function ve(e,t,r){var n=S(e,"kt-error-url");if(n){var i=new XMLHttpRequest;i.open("POST",n);i.setRequestHeader("Content-Type","application/json;charset=UTF-8");i.send(JSON.stringify({elt:e.id,event:t,detail:r}))}}function ye(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=a().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function ge(e,t,r){he(e,t,Object.assign({isError:true},details))}function he(e,t,r){r["elt"]=e;var n=ye(t,r);if(kutty.logger){kutty.logger(e,t,r);if(r.isError){ve(e,t,r)}}var i=e.dispatchEvent(n);return i}var pe=null;function me(){var e=a().querySelector("[kt-history-elt]");return e||a().body}function ke(e,t,r,n){var i=JSON.parse(localStorage.getItem("kutty-history-cache"))||[];for(var a=0;akutty.config.historyCacheSize){i.shift()}localStorage.setItem("kutty-history-cache",JSON.stringify(i))}function be(e){var t=JSON.parse(localStorage.getItem("kutty-history-cache"))||[];for(var r=0;r=200&&this.status<400){he(a().body,"historyCacheMissLoad.kutty",r);var e=s(this.response);e=e.querySelector("[kt-history-elt]")||e;Ee(V(me(),e));pe=t}else{ge(a().body,"historyCacheMissLoadError.kutty",r)}};e.send()}function Ce(e){Se(pe);e=e||location.pathname+location.search;he(a().body,"historyRestore.kutty",{path:e});var t=be(e);if(t){Ee(V(me(),s(t.content)));document.title=t.title;window.scrollTo(0,t.scroll);pe=e}else{Te(e)}}function Le(e){return S(e,"kt-push-url")==="true"||e.tagName==="A"&&w(e).boosted}function Oe(e){Ne(e,"add")}function qe(e){Ne(e,"remove")}function Ne(e,t){var r=S(e,"kt-indicator");if(r){var n=a().querySelectorAll(r)}else{n=[e]}E(n,function(e){e.classList[t].call(e.classList,"kutty-request")})}function Ae(e,t){for(var r=0;r0){r["swapStyle"]=n[0];for(var i=1;i=200&&this.status<400){if(this.status===286){$(o)}if(this.status!==204){if(!he(o,"beforeSwap.kutty",m))return;var i=this.response;if(n){Se()}var a=Fe(o);u.classList.add("kutty-swapping");var e=function(){try{var e=Y(a.swapStyle,u,o,i);u.classList.remove("kutty-swapping");u.classList.add("kutty-settling");he(o,"afterSwap.kutty",m);var t=function(){E(e,function(e){e.call()});u.classList.remove("kutty-settling");if(n){we(r||g)}he(o,"afterSettle.kutty",m)};if(a.settleDelay>0){setTimeout(t,a.settleDelay)}else{t()}}catch(e){ge(o,"swapError.kutty",m);throw e}};if(a.swapDelay>0){setTimeout(e,k(a.swapDelay))}else{e()}}}else{ge(o,"responseError.kutty",m)}}catch(e){m["exception"]=e;ge(o,"onLoadError.kutty",m);throw e}finally{qe(o);l();he(o,"afterOnLoad.kutty",m)}};f.onerror=function(){qe(o);ge(o,"sendError.kutty",m);l()};if(!he(o,"beforeRequest.kutty",m))return l();Oe(o);f.send(e==="get"?null:Xe(v))}function Pe(e){if(a().readyState!=="loading"){e()}else{a().addEventListener("DOMContentLoaded",e)}}h(".kutty-indicator{opacity:0;transition: opacity 200ms ease-in;}");h(".kutty-request .kutty-indicator{opacity:1}");h(".kutty-request.kutty-indicator{opacity:1}");function je(){var e=a().querySelector('meta[name="kutty-config"]');if(e){var t=JSON.parse(e.content);kutty.config=Object.assign(kutty.config,t)}}Pe(function(){je();var e=a().body;de(e);he(e,"load.kutty",{});window.onpopstate=function(){Ce()}});return{onLoad:m,process:de,on:R,off:X,trigger:he,find:C,findAll:L,closest:D,remove:O,addClass:q,removeClass:N,toggleClass:A,takeClass:x,logAll:T,logger:null,config:{historyEnabled:true,historyCacheSize:10,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:100},version:"0.0.1",_:p}}(); \ No newline at end of file +var kutty=kutty||function(){"use strict";var e=["get","post","put","delete","patch"];function u(e){if(e==="null"||e==="false"||e===""){return null}else if(e.lastIndexOf("ms")===e.length-2){return parseFloat(e.substr(0,e.length-2))}else if(e.lastIndexOf("s")===e.length-1){return parseFloat(e.substr(0,e.length-1))*1e3}else{return parseFloat(e)}}function k(e,t){return e.getAttribute&&e.getAttribute(t)}function l(e,t){return k(e,t)||k(e,"data-"+t)}function n(e){return e.parentElement}function o(){return document}function s(e,t){if(t(e)){return e}else if(n(e)){return s(n(e),t)}else{return null}}function b(e,t){var r=null;s(e,function(e){return r=k(e,t)});return r}function f(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function r(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}return i}function c(e){var t=r(e);switch(t){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i(""+e+"
",1);case"col":return i(""+e+"
",2);case"tr":return i(""+e+"
",2);case"td":case"th":return i(""+e+"
",3);default:return i(e,0)}}function t(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function a(e){return t(e,"Function")}function v(e){return t(e,"Object")}function S(e){var t="kutty-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function w(e,t){if(e){for(var r=0;r=0}function y(e){return o().body.contains(e)}function g(e,t){return e.concat(t)}function h(e){return e.split(/\s+/)}function p(e){var t=o().styleSheets[0];t.insertRule(e,t.cssRules.length)}function m(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){return eval(e)}function T(t){var e=kutty.on("load.kutty",function(e){t(e.detail.elt)});return e}function C(){kutty.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function O(e,t){if(t){return e.querySelector(t)}else{return o().body.querySelector(e)}}function L(e,t){if(t){return e.querySelectorAll(t)}else{return o().body.querySelectorAll(e)}}function q(e,t){if(t){setTimeout(function(){q(e)},t)}else{e.parentElement.removeChild(e)}}function N(e,t,r){if(r){setTimeout(function(){N(e,t)},r)}else{e.classList.add(t)}}function x(e,t,r){if(r){setTimeout(function(){x(e,t)},r)}else{e.classList.remove(t)}}function A(e,t){e.classList.toggle(t)}function D(e,t){w(e.parentElement.children,function(e){x(e,t)});N(e,t)}function M(e,t){do{if(e==null||f(e,t))return e}while(e=e&&n(e))}function R(e,t,r){if(a(t)){return{target:o().body,event:e,listener:t}}else{return{target:e,event:t,listener:r}}}function X(t,r,n){Je(function(){var e=R(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=a(r);return e?r:n}function H(t,r,n){Je(function(){var e=R(t,r,n);e.target.removeEventListener(e.event,e.listener)});return a(r)?r:n}function I(e){var t=s(e,function(e){return k(e,"kt-target")!==null});if(t){var r=k(t,"kt-target");if(r==="this"){return t}else if(r.indexOf("closest ")===0){return M(e,r.substr(8))}else{return o().querySelector(r)}}else{var n=S(e);if(n.boosted){return o().body}else{return e}}}function F(t,r){w(t.attributes,function(e){if(!r.hasAttribute(e.name)){t.removeAttribute(e.name)}});w(r.attributes,function(e){t.setAttribute(e.name,e.value)})}function K(e){var n=[];w(e.children,function(e){if(l(e,"kt-swap-oob")==="true"){var t=o().getElementById(e.id);if(t){var r=o().createDocumentFragment();r.appendChild(e);n=n.concat(U(t,r))}else{e.parentNode.removeChild(e);he(o().body,"oobErrorNoTarget.kutty",{content:e})}}});return n}function P(n,e){var i=[];w(e.querySelectorAll("[id]"),function(e){var t=n.querySelector(e.tagName+"[id="+e.id+"]");if(t){var r=e.cloneNode();F(e,t);i.push(function(){F(e,r)})}});return i}function J(e,t,r){var n=P(e,r);while(r.childNodes.length>0){var i=r.firstChild;e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE){pe(i,"load.kutty",{});de(i)}}return n}function U(e,t){if(e.tagName==="BODY"){return G(e,t)}else{var r=J(n(e),e,t);n(e).removeChild(e);return r}}function j(e,t){return J(e,e.firstChild,t)}function z(e,t){return J(n(e),e,t)}function B(e,t){return J(e,null,t)}function V(e,t){return J(n(e),e.nextSibling,t)}function G(e,t){var r=e.firstChild;var n=J(e,r,t);if(r){while(r.nextSibling){e.removeChild(r.nextSibling)}e.removeChild(r)}return n}function Y(e,t){var r=b(e,"kt-select");if(r){var n=o().createDocumentFragment();w(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function _(e,t,r,n){var i=c(n);if(i){var a=K(i);i=Y(r,i);switch(e){case"outerHTML":return g(a,U(t,i));case"afterbegin":return g(a,j(t,i));case"beforebegin":return g(a,z(t,i));case"beforeend":return g(a,B(t,i));case"afterend":return g(a,V(t,i));default:return g(a,G(t,i))}}}function Q(e,t){if(t){if(t.indexOf("{")===0){var r=JSON.parse(t);for(var n in r){if(r.hasOwnProperty(n)){var i=r[n];if(!v(i)){i={value:i}}pe(e,n,i)}}}else{pe(e,t,[])}}}function W(e){var t={trigger:"click"};var r=l(e,"kt-trigger");if(r){var n=h(r);if(n.length>0){var i=n[0];if(i==="every"){t.pollInterval=u(n[1])}else if(i.indexOf("sse:")===0){t.sseEvent=i.substr(4)}else{t["trigger"]=i;for(var a=1;a1){var r=t[0];var n=t[1].trim();var i;var a;if(n.indexOf(":")>0){var o=n.split(":");i=o[0];a=u(o[1])}else{i=n;a=100}return{operation:r,cssClass:i,delay:a}}else{return null}}function $(i,e){w(e.split("&"),function(e){var n=0;w(e.split(","),function(e){var t=e.trim();var r=Z(t);if(r){if(r.operation==="toggle"){setTimeout(function(){setInterval(function(){i.classList[r.operation].call(i.classList,r.cssClass)},r.delay)},n);n=n+r.delay}else{n=n+r.delay;setTimeout(function(){i.classList[r.operation].call(i.classList,r.cssClass)},n)}}})})}function ee(e){S(e).cancelled=true}function te(e,t,r,n){var i=S(e);i.timeout=setTimeout(function(){if(y(e)&&i.cancelled!==true){Pe(e,t,r);te(e,t,l(e,"kt-"+t),n)}},n)}function re(e){return location.hostname===e.hostname&&k(e,"href")&&k(e,"href").indexOf("#")!==0}function ne(e,t,r){if(e.tagName==="A"&&re(e)||e.tagName==="FORM"){t.boosted=true;var n,i;if(e.tagName==="A"){n="get";i=k(e,"href")}else{var a=k(e,"method");n=a?a.toLowerCase():"get";i=k(e,"action")}ae(e,n,i,t,r,true)}}function ie(e){return e.tagName==="FORM"||f(e,'input[type="submit"], button')&&M(e,"form")!==null||e.tagName==="A"&&e.href&&e.href.indexOf("#")!==0}function ae(i,a,o,e,u,l){var t=function(e){if(l||ie(i))e.preventDefault();var t=S(e);var r=S(i);if(!t.handled){t.handled=true;if(u.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(u.changed){if(r.lastValue===i.value){return}else{r.lastValue=i.value}}if(r.delayed){clearTimeout(r.delayed)}var n=function(){Pe(i,a,o,e.target)};if(u.delay){r.delayed=setTimeout(n,u.delay)}else{n()}}};e.trigger=u.trigger;e.eventListener=t;i.addEventListener(u.trigger,t)}function oe(){if(!window["kuttyScrollHandler"]){var e=function(){w(o().querySelectorAll("[kt-trigger='revealed']"),function(e){ue(e)})};window["kuttyScrollHandler"]=e;window.addEventListener("scroll",e)}}function ue(e){var t=S(e);if(!t.revealed&&d(e)){t.revealed=true;Pe(e,t.verb,t.path)}}function le(e){if(!y(e)){e.sseSource.close();return true}}function se(t,e){var r={config:{withCredentials:true}};pe(t,"initSSE.kutty",r);var n=new EventSource(e,r.config);n.onerror=function(e){he(t,"sseError.kutty",{error:e,source:n});le(t)};S(t).sseSource=n}function fe(e,t,r,n){var i=s(e,function(e){return e.sseSource});if(i){var a=function(){if(!le(i)){if(y(e)){Pe(e,t,r)}else{i.sseSource.removeEventListener(n,a)}}};i.sseSource.addEventListener(n,a)}else{he(e,"noSSESourceError.kutty")}}function ce(e,t,r,n,i){var a=function(){if(!n.loaded){n.loaded=true;Pe(e,t,r)}};if(i){setTimeout(a,i)}else{a()}}function ve(r,n,i){var a=false;w(e,function(e){var t=l(r,"kt-"+e);if(t){a=true;n.path=t;n.verb=e;if(i.sseEvent){fe(r,e,t,i.sseEvent)}else if(i.trigger==="revealed"){oe();ue(r)}else if(i.trigger==="load"){ce(r,e,t,n,i.delay)}else if(i.pollInterval){n.polling=true;te(r,e,t,i.pollInterval)}else{ae(r,e,t,n,i)}}});return a}function de(e){var t=S(e);if(!t.processed){t.processed=true;var r=W(e);var n=ve(e,t,r);if(!n&&b(e,"kt-boost")==="true"){ne(e,t,r)}var i=l(e,"kt-sse-source");if(i){se(e,i)}var a=l(e,"kt-classes");if(a){$(e,a)}}if(e.children){w(e.children,function(e){de(e)})}}function ye(e,t,r){var n=b(e,"kt-error-url");if(n){var i=new XMLHttpRequest;i.open("POST",n);i.setRequestHeader("Content-Type","application/json;charset=UTF-8");i.send(JSON.stringify({elt:e.id,event:t,detail:r}))}}function ge(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=o().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function he(e,t,r){pe(e,t,m({isError:true},r))}function pe(e,t,r){r["elt"]=e;var n=ge(t,r);if(kutty.logger){kutty.logger(e,t,r);if(r.isError){ye(e,t,r)}}var i=e.dispatchEvent(n);return i}var me=null;function ke(){var e=o().querySelector("[kt-history-elt]");return e||o().body}function be(e,t,r,n){var i=JSON.parse(localStorage.getItem("kutty-history-cache"))||[];for(var a=0;akutty.config.historyCacheSize){i.shift()}localStorage.setItem("kutty-history-cache",JSON.stringify(i))}function Se(e){var t=JSON.parse(localStorage.getItem("kutty-history-cache"))||[];for(var r=0;r=200&&this.status<400){pe(o().body,"historyCacheMissLoad.kutty",r);var e=c(this.response);e=e.querySelector("[kt-history-elt]")||e;Te(G(ke(),e));me=t}else{he(o().body,"historyCacheMissLoadError.kutty",r)}};e.send()}function Oe(e){we(me);e=e||location.pathname+location.search;pe(o().body,"historyRestore.kutty",{path:e});var t=Se(e);if(t){Te(G(ke(),c(t.content)));document.title=t.title;window.scrollTo(0,t.scroll);me=e}else{Ce(e)}}function Le(e){return b(e,"kt-push-url")==="true"||e.tagName==="A"&&S(e).boosted}function qe(e){xe(e,"add")}function Ne(e){xe(e,"remove")}function xe(e,t){var r=b(e,"kt-indicator");if(r){var n=o().querySelectorAll(r)}else{n=[e]}w(n,function(e){e.classList[t].call(e.classList,"kutty-request")})}function Ae(e,t){for(var r=0;r0){r["swapStyle"]=n[0];for(var i=1;i=200&&this.status<400){if(this.status===286){ee(o)}if(this.status!==204){if(!pe(o,"beforeSwap.kutty",m))return;var i=this.response;if(n){we()}var a=Ke(o);u.classList.add("kutty-swapping");var e=function(){try{var e=_(a.swapStyle,u,o,i);u.classList.remove("kutty-swapping");u.classList.add("kutty-settling");pe(o,"afterSwap.kutty",m);var t=function(){w(e,function(e){e.call()});u.classList.remove("kutty-settling");if(n){Ee(r||g)}pe(o,"afterSettle.kutty",m)};if(a.settleDelay>0){setTimeout(t,a.settleDelay)}else{t()}}catch(e){he(o,"swapError.kutty",m);throw e}};if(a.swapDelay>0){setTimeout(e,a.swapDelay)}else{e()}}}else{he(o,"responseError.kutty",m)}}catch(e){m["exception"]=e;he(o,"onLoadError.kutty",m);throw e}finally{Ne(o);l();pe(o,"afterOnLoad.kutty",m)}};f.onerror=function(){Ne(o);he(o,"sendError.kutty",m);l()};if(!pe(o,"beforeRequest.kutty",m))return l();qe(o);f.send(e==="get"?null:He(d))}function Je(e){if(o().readyState!=="loading"){e()}else{o().addEventListener("DOMContentLoaded",e)}}p(".kutty-indicator{opacity:0;transition: opacity 200ms ease-in;}");p(".kutty-request .kutty-indicator{opacity:1}");p(".kutty-request.kutty-indicator{opacity:1}");function Ue(){var e=o().querySelector('meta[name="kutty-config"]');if(e){var t=JSON.parse(e.content);kutty.config=m(kutty.config,t)}}Je(function(){Ue();var e=o().body;de(e);pe(e,"load.kutty",{});window.onpopstate=function(){Oe()}});return{onLoad:T,process:de,on:X,off:H,trigger:pe,find:O,findAll:L,closest:M,remove:q,addClass:N,removeClass:x,toggleClass:A,takeClass:D,logAll:C,logger:null,config:{historyEnabled:true,historyCacheSize:10,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:100},version:"0.0.1",_:E}}(); \ No newline at end of file diff --git a/dist/kutty.min.js.gz b/dist/kutty.min.js.gz index e8cf6111..16af2e55 100644 Binary files a/dist/kutty.min.js.gz and b/dist/kutty.min.js.gz differ diff --git a/src/kutty.js b/src/kutty.js index a7dc81cc..35ce3150 100644 --- a/src/kutty.js +++ b/src/kutty.js @@ -176,9 +176,10 @@ var kutty = kutty || (function () { } function onLoadHelper(callback) { - kutty.on("load.kutty", function(evt) { + var value = kutty.on("load.kutty", function(evt) { callback(evt.detail.elt); }); + return value; } function logAll(){ @@ -191,17 +192,17 @@ var kutty = kutty || (function () { function find(eltOrSelector, selector) { if (selector) { - eltOrSelector.querySelector(eltOrSelector); + return eltOrSelector.querySelector(selector); } else { - getDocument().body.querySelector(eltOrSelector); + return getDocument().body.querySelector(eltOrSelector); } } function findAll(eltOrSelector, selector) { if (selector) { - eltOrSelector.querySelectorAll(eltOrSelector); + return eltOrSelector.querySelectorAll(selector); } else { - getDocument().body.querySelectorAll(eltOrSelector); + return getDocument().body.querySelectorAll(eltOrSelector); } } @@ -221,7 +222,7 @@ var kutty = kutty || (function () { } } - function removeClassFromElement(elt, clazz) { + function removeClassFromElement(elt, clazz, delay) { if (delay) { setTimeout(function(){removeClassFromElement(elt, clazz);}, delay) } else { @@ -234,7 +235,7 @@ var kutty = kutty || (function () { } function takeClassForElement(elt, clazz) { - forEach(elt.parent.children, function(child){ + forEach(elt.parentElement.children, function(child){ removeClassFromElement(child, clazz); }) addClassToElement(elt, clazz); @@ -267,7 +268,8 @@ var kutty = kutty || (function () { var eventArgs = processEventArgs(arg1, arg2, arg3); eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener); }) - return isFunction(arg2) ? arg2 : arg3; + var b = isFunction(arg2); + return b ? arg2 : arg3; } function removeKuttyEventListener(arg1, arg2, arg3) { diff --git a/test/core/api.js b/test/core/api.js new file mode 100644 index 00000000..392623a1 --- /dev/null +++ b/test/core/api.js @@ -0,0 +1,161 @@ +describe("Core kutty API test", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('version is correct', function(){ + kutty.version.should.equal("0.0.1"); + }); + + it('onLoad is called... onLoad', function(){ + // also tests on/off + this.server.respondWith("GET", "/test", "
") + var helper = kutty.onLoad(function (elt) { + elt.setAttribute("foo", "bar"); + }); + try { + var div = make("
"); + div.click(); + this.server.respond(); + byId("d1").getAttribute("foo").should.equal("bar"); + } finally { + kutty.off("load.kutty", helper); + } + }); + + it('triggers properly', function () { + var div = make("
"); + var myEventCalled = false; + var detailStr = ""; + kutty.on("myEvent", function(evt){ + myEventCalled = true; + detailStr = evt.detail.str; + }) + kutty.trigger(div, "myEvent", {str:"foo"}) + + myEventCalled.should.equal(true); + detailStr.should.equal("foo"); + }); + + it('should find properly', function(){ + var div = make("
"); + div.should.equal(kutty.find("#d1")); + div.should.equal(kutty.find(".c1")); + div.should.equal(kutty.find(".c2")); + div.should.equal(kutty.find(".c1.c2")); + }); + + it('should find properly from elt', function(){ + var div = make("
"); + kutty.find(div, "a").id.should.equal('a1'); + }); + + it('should find all properly', function(){ + var div = make("
"); + kutty.findAll(".c1").length.should.equal(3); + kutty.findAll(".c2").length.should.equal(2); + kutty.findAll(".c3").length.should.equal(1); + }); + + it('should find all properly from elt', function(){ + var div = make("
"); + kutty.findAll(div, ".c1").length.should.equal(3); + kutty.findAll(div, ".c2").length.should.equal(2); + kutty.findAll(div,".c3").length.should.equal(1); + }); + + it('should find closest element properly', function () { + var div = make("
"); + var a = kutty.find(div, "a"); + kutty.closest(a, "div").should.equal(div); + }); + + it('should remove element properly', function () { + var div = make("
"); + var a = kutty.find(div, "a"); + kutty.remove(a); + div.innerHTML.should.equal(""); + }); + + it('should add class properly', function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + kutty.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + }); + + it('should add class properly after delay', function (done) { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + kutty.addClass(div, "foo", 10); + div.classList.contains("foo").should.equal(false); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + done(); + }, 20); + }); + + it('should remove class properly', function () { + var div = make("
"); + kutty.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + kutty.removeClass(div, "foo"); + div.classList.contains("foo").should.equal(false); + }); + + it('should add class properly after delay', function (done) { + var div = make("
"); + kutty.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + kutty.removeClass(div, "foo", 10); + div.classList.contains("foo").should.equal(true); + setTimeout(function () { + div.classList.contains("foo").should.equal(false); + done(); + }, 20); + }); + + it('should toggle class properly', function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + kutty.toggleClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + kutty.toggleClass(div, "foo"); + div.classList.contains("foo").should.equal(false); + }); + + it('should take class properly', function () { + var div1 = make("
"); + var div2 = make("
"); + var div3 = make("
"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(false); + + kutty.takeClass(div1, "foo"); + + div1.classList.contains("foo").should.equal(true); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(false); + + kutty.takeClass(div2, "foo"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(true); + div3.classList.contains("foo").should.equal(false); + + kutty.takeClass(div3, "foo"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(true); + }); + + +}) diff --git a/test/index.html b/test/index.html index 94b7622b..bc14ce71 100644 --- a/test/index.html +++ b/test/index.html @@ -27,6 +27,7 @@ + diff --git a/www/js/kutty.js b/www/js/kutty.js index a7dc81cc..35ce3150 100644 --- a/www/js/kutty.js +++ b/www/js/kutty.js @@ -176,9 +176,10 @@ var kutty = kutty || (function () { } function onLoadHelper(callback) { - kutty.on("load.kutty", function(evt) { + var value = kutty.on("load.kutty", function(evt) { callback(evt.detail.elt); }); + return value; } function logAll(){ @@ -191,17 +192,17 @@ var kutty = kutty || (function () { function find(eltOrSelector, selector) { if (selector) { - eltOrSelector.querySelector(eltOrSelector); + return eltOrSelector.querySelector(selector); } else { - getDocument().body.querySelector(eltOrSelector); + return getDocument().body.querySelector(eltOrSelector); } } function findAll(eltOrSelector, selector) { if (selector) { - eltOrSelector.querySelectorAll(eltOrSelector); + return eltOrSelector.querySelectorAll(selector); } else { - getDocument().body.querySelectorAll(eltOrSelector); + return getDocument().body.querySelectorAll(eltOrSelector); } } @@ -221,7 +222,7 @@ var kutty = kutty || (function () { } } - function removeClassFromElement(elt, clazz) { + function removeClassFromElement(elt, clazz, delay) { if (delay) { setTimeout(function(){removeClassFromElement(elt, clazz);}, delay) } else { @@ -234,7 +235,7 @@ var kutty = kutty || (function () { } function takeClassForElement(elt, clazz) { - forEach(elt.parent.children, function(child){ + forEach(elt.parentElement.children, function(child){ removeClassFromElement(child, clazz); }) addClassToElement(elt, clazz); @@ -267,7 +268,8 @@ var kutty = kutty || (function () { var eventArgs = processEventArgs(arg1, arg2, arg3); eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener); }) - return isFunction(arg2) ? arg2 : arg3; + var b = isFunction(arg2); + return b ? arg2 : arg3; } function removeKuttyEventListener(arg1, arg2, arg3) { diff --git a/www/test/0.0.1-alpha.3/src/kutty.js b/www/test/0.0.1-alpha.3/src/kutty.js index a7dc81cc..35ce3150 100644 --- a/www/test/0.0.1-alpha.3/src/kutty.js +++ b/www/test/0.0.1-alpha.3/src/kutty.js @@ -176,9 +176,10 @@ var kutty = kutty || (function () { } function onLoadHelper(callback) { - kutty.on("load.kutty", function(evt) { + var value = kutty.on("load.kutty", function(evt) { callback(evt.detail.elt); }); + return value; } function logAll(){ @@ -191,17 +192,17 @@ var kutty = kutty || (function () { function find(eltOrSelector, selector) { if (selector) { - eltOrSelector.querySelector(eltOrSelector); + return eltOrSelector.querySelector(selector); } else { - getDocument().body.querySelector(eltOrSelector); + return getDocument().body.querySelector(eltOrSelector); } } function findAll(eltOrSelector, selector) { if (selector) { - eltOrSelector.querySelectorAll(eltOrSelector); + return eltOrSelector.querySelectorAll(selector); } else { - getDocument().body.querySelectorAll(eltOrSelector); + return getDocument().body.querySelectorAll(eltOrSelector); } } @@ -221,7 +222,7 @@ var kutty = kutty || (function () { } } - function removeClassFromElement(elt, clazz) { + function removeClassFromElement(elt, clazz, delay) { if (delay) { setTimeout(function(){removeClassFromElement(elt, clazz);}, delay) } else { @@ -234,7 +235,7 @@ var kutty = kutty || (function () { } function takeClassForElement(elt, clazz) { - forEach(elt.parent.children, function(child){ + forEach(elt.parentElement.children, function(child){ removeClassFromElement(child, clazz); }) addClassToElement(elt, clazz); @@ -267,7 +268,8 @@ var kutty = kutty || (function () { var eventArgs = processEventArgs(arg1, arg2, arg3); eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener); }) - return isFunction(arg2) ? arg2 : arg3; + var b = isFunction(arg2); + return b ? arg2 : arg3; } function removeKuttyEventListener(arg1, arg2, arg3) { diff --git a/www/test/0.0.1-alpha.3/test/core/api.js b/www/test/0.0.1-alpha.3/test/core/api.js new file mode 100644 index 00000000..392623a1 --- /dev/null +++ b/www/test/0.0.1-alpha.3/test/core/api.js @@ -0,0 +1,161 @@ +describe("Core kutty API test", function(){ + beforeEach(function() { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function() { + this.server.restore(); + clearWorkArea(); + }); + + it('version is correct', function(){ + kutty.version.should.equal("0.0.1"); + }); + + it('onLoad is called... onLoad', function(){ + // also tests on/off + this.server.respondWith("GET", "/test", "
") + var helper = kutty.onLoad(function (elt) { + elt.setAttribute("foo", "bar"); + }); + try { + var div = make("
"); + div.click(); + this.server.respond(); + byId("d1").getAttribute("foo").should.equal("bar"); + } finally { + kutty.off("load.kutty", helper); + } + }); + + it('triggers properly', function () { + var div = make("
"); + var myEventCalled = false; + var detailStr = ""; + kutty.on("myEvent", function(evt){ + myEventCalled = true; + detailStr = evt.detail.str; + }) + kutty.trigger(div, "myEvent", {str:"foo"}) + + myEventCalled.should.equal(true); + detailStr.should.equal("foo"); + }); + + it('should find properly', function(){ + var div = make("
"); + div.should.equal(kutty.find("#d1")); + div.should.equal(kutty.find(".c1")); + div.should.equal(kutty.find(".c2")); + div.should.equal(kutty.find(".c1.c2")); + }); + + it('should find properly from elt', function(){ + var div = make("
"); + kutty.find(div, "a").id.should.equal('a1'); + }); + + it('should find all properly', function(){ + var div = make("
"); + kutty.findAll(".c1").length.should.equal(3); + kutty.findAll(".c2").length.should.equal(2); + kutty.findAll(".c3").length.should.equal(1); + }); + + it('should find all properly from elt', function(){ + var div = make("
"); + kutty.findAll(div, ".c1").length.should.equal(3); + kutty.findAll(div, ".c2").length.should.equal(2); + kutty.findAll(div,".c3").length.should.equal(1); + }); + + it('should find closest element properly', function () { + var div = make("
"); + var a = kutty.find(div, "a"); + kutty.closest(a, "div").should.equal(div); + }); + + it('should remove element properly', function () { + var div = make("
"); + var a = kutty.find(div, "a"); + kutty.remove(a); + div.innerHTML.should.equal(""); + }); + + it('should add class properly', function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + kutty.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + }); + + it('should add class properly after delay', function (done) { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + kutty.addClass(div, "foo", 10); + div.classList.contains("foo").should.equal(false); + setTimeout(function () { + div.classList.contains("foo").should.equal(true); + done(); + }, 20); + }); + + it('should remove class properly', function () { + var div = make("
"); + kutty.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + kutty.removeClass(div, "foo"); + div.classList.contains("foo").should.equal(false); + }); + + it('should add class properly after delay', function (done) { + var div = make("
"); + kutty.addClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + kutty.removeClass(div, "foo", 10); + div.classList.contains("foo").should.equal(true); + setTimeout(function () { + div.classList.contains("foo").should.equal(false); + done(); + }, 20); + }); + + it('should toggle class properly', function () { + var div = make("
"); + div.classList.contains("foo").should.equal(false); + kutty.toggleClass(div, "foo"); + div.classList.contains("foo").should.equal(true); + kutty.toggleClass(div, "foo"); + div.classList.contains("foo").should.equal(false); + }); + + it('should take class properly', function () { + var div1 = make("
"); + var div2 = make("
"); + var div3 = make("
"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(false); + + kutty.takeClass(div1, "foo"); + + div1.classList.contains("foo").should.equal(true); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(false); + + kutty.takeClass(div2, "foo"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(true); + div3.classList.contains("foo").should.equal(false); + + kutty.takeClass(div3, "foo"); + + div1.classList.contains("foo").should.equal(false); + div2.classList.contains("foo").should.equal(false); + div3.classList.contains("foo").should.equal(true); + }); + + +}) diff --git a/www/test/0.0.1-alpha.3/test/index.html b/www/test/0.0.1-alpha.3/test/index.html index 94b7622b..bc14ce71 100644 --- a/www/test/0.0.1-alpha.3/test/index.html +++ b/www/test/0.0.1-alpha.3/test/index.html @@ -27,6 +27,7 @@ +