From 5f9f1940b1f4db8537418f42fe38a7a34c4b3030 Mon Sep 17 00:00:00 2001 From: carson Date: Thu, 14 May 2020 17:10:24 -0700 Subject: [PATCH] Clean up parameter inclusion logic and update demos to use GET where appropriate, rather than hiding from my bad design choices Add API test + fixes and update all files --- dist/kutty.js | 62 +++++---- dist/kutty.min.js | 2 +- dist/kutty.min.js.gz | Bin 5682 -> 5729 bytes src/kutty.js | 18 +-- test/core/api.js | 161 ++++++++++++++++++++++++ test/index.html | 1 + www/js/kutty.js | 18 +-- www/test/0.0.1-alpha.3/src/kutty.js | 18 +-- www/test/0.0.1-alpha.3/test/core/api.js | 161 ++++++++++++++++++++++++ www/test/0.0.1-alpha.3/test/index.html | 1 + 10 files changed, 390 insertions(+), 52 deletions(-) create mode 100644 test/core/api.js create mode 100644 www/test/0.0.1-alpha.3/test/core/api.js 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 e8cf61117c277495a3f827273336c3c72f36ca82..16af2e556df78beffcfefa302702f9e55ad0ea2d 100644 GIT binary patch literal 5729 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") + 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 @@ +