diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b0ce1cc..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/node_modules/ -/nbproject/ diff --git a/README.md b/README.md index 33268a6..bcc7d94 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,14 @@ Preserve expanded sub-menus between session. If jquery.cookie is not included it ---------- +#### storageType: + * **Type:** `string` + * **Default:** `cookie` + +Choose the storage type you want between a cookie and an html session storage : 'cookie' or 'local' + +---------- + #### cookie: * **Type:** `object` * `name`: Cookie name diff --git a/demo/index.html b/demo/index.html index 56ca70f..769ced3 100644 --- a/demo/index.html +++ b/demo/index.html @@ -19,6 +19,7 @@ $(document).ready(function() { // Initialize navgoco with default options $("#demo1").navgoco({ + storageType: 'local', caretHtml: '', accordion: false, openClass: 'open', @@ -49,7 +50,10 @@ diff --git a/src/jquery.navgoco.js b/src/jquery.navgoco.js index 11f79d1..7496301 100644 --- a/src/jquery.navgoco.js +++ b/src/jquery.navgoco.js @@ -4,6 +4,8 @@ * * Copyright (c) 2014 Chris T (@tefra) * BSD - https://github.com/tefra/navgoco/blob/master/LICENSE-BSD + * + * THIS IS A FORK */ (function($) { @@ -170,6 +172,7 @@ * saved with a cookie. For size reasons only the open sub-menus indexes are stored. * */ _save: function() { + if (this.options.save) { var save = {}; for (var key in this.state) { @@ -177,8 +180,17 @@ save[key] = 1; } } - cookie[this.uuid] = this.state = save; - $.cookie(this.options.cookie.name, JSON.stringify(cookie), this.options.cookie); + //save data with a cookie or localStorage + if(this.options.storageType === 'local' && typeof(Storage) !== "undefined"){ + lclStorage = (lclStorage === null) ? {}: lclStorage; + lclStorage[this.uuid] = this.state = save; + var $strLocal = JSON.stringify(lclStorage); + sessionStorage.setItem(this.options.cookie.name, $strLocal); + } else { + cookie[this.uuid] = this.state = save; + $.cookie(this.options.cookie.name, JSON.stringify(cookie), this.options.cookie); + } + } }, /** @@ -187,11 +199,20 @@ */ _load: function() { if (this.options.save) { - if (cookie === null) { - var data = $.cookie(this.options.cookie.name); - cookie = (data) ? JSON.parse(data) : {}; + + if(this.options.storageType === 'local' && typeof(Storage) !== "undefined"){ + var dataStrg = sessionStorage.getItem(this.options.cookie.name); + var lclStorage = (dataStrg && dataStrg !== 'undefined') ? JSON.parse(dataStrg) : {}; + this.state = lclStorage.hasOwnProperty(this.uuid) ? lclStorage[this.uuid] : {}; + } else if(this.options.storageType === 'cookie') { + if (cookie === null) { + var data = $.cookie(this.options.cookie.name); + cookie = (data) ? JSON.parse(data) : {}; + } + this.state = cookie.hasOwnProperty(this.uuid) ? cookie[this.uuid] : {}; } - this.state = cookie.hasOwnProperty(this.uuid) ? cookie[this.uuid] : {}; + + } }, /** @@ -263,7 +284,7 @@ args = Array.prototype.slice.call(arguments, 1); } else { options = $.extend({}, $.fn.navgoco.defaults, options || {}); - if (!$.cookie) { + if (!$.cookie && options.storageType === 'cookie') { options.save = false; } } @@ -285,7 +306,8 @@ * * @type {Object} */ - var cookie = null; + var cookie = null, + lclStorage = null; /** * Default navgoco options @@ -293,6 +315,7 @@ * @type {Object} */ $.fn.navgoco.defaults = { + storageType: 'cookie', caretHtml: '', accordion: false, openClass: 'open', diff --git a/src/jquery.navgoco.min.js b/src/jquery.navgoco.min.js index 4ba4475..4109d0d 100644 --- a/src/jquery.navgoco.min.js +++ b/src/jquery.navgoco.min.js @@ -1,8 +1 @@ -/* - * jQuery Navgoco Menus Plugin v0.2.1 (2014-04-11) - * https://github.com/tefra/navgoco - * - * Copyright (c) 2014 Chris T (@tefra) - * BSD - https://github.com/tefra/navgoco/blob/master/LICENSE-BSD - */ -!function(a){"use strict";var b=function(b,c,d){return this.el=b,this.$el=a(b),this.options=c,this.uuid=this.$el.attr("id")?this.$el.attr("id"):d,this.state={},this.init(),this};b.prototype={init:function(){var b=this;b._load(),b.$el.find("ul").each(function(c){var d=a(this);d.attr("data-index",c),b.options.save&&b.state.hasOwnProperty(c)?(d.parent().addClass(b.options.openClass),d.show()):d.parent().hasClass(b.options.openClass)?(d.show(),b.state[c]=1):d.hide()});var c=a("").prepend(b.options.caretHtml),d=b.$el.find("li > a");b._trigger(c,!1),b._trigger(d,!0),b.$el.find("li:has(ul) > a").prepend(c)},_trigger:function(b,c){var d=this;b.on("click",function(b){b.stopPropagation();var e=c?a(this).next():a(this).parent().next(),f=!1;if(c){var g=a(this).attr("href");f=void 0===g||""===g||"#"===g}if(e=e.length>0?e:!1,d.options.onClickBefore.call(this,b,e),!c||e&&f)b.preventDefault(),d._toggle(e,e.is(":hidden")),d._save();else if(d.options.accordion){var h=d.state=d._parents(a(this));d.$el.find("ul").filter(":visible").each(function(){var b=a(this),c=b.attr("data-index");h.hasOwnProperty(c)||d._toggle(b,!1)}),d._save()}d.options.onClickAfter.call(this,b,e)})},_toggle:function(b,c){var d=this,e=b.attr("data-index"),f=b.parent();if(d.options.onToggleBefore.call(this,b,c),c){if(f.addClass(d.options.openClass),b.slideDown(d.options.slide),d.state[e]=1,d.options.accordion){var g=d.state=d._parents(b);g[e]=d.state[e]=1,d.$el.find("ul").filter(":visible").each(function(){var b=a(this),c=b.attr("data-index");g.hasOwnProperty(c)||d._toggle(b,!1)})}}else f.removeClass(d.options.openClass),b.slideUp(d.options.slide),d.state[e]=0;d.options.onToggleAfter.call(this,b,c)},_parents:function(b,c){var d={},e=b.parent(),f=e.parents("ul");return f.each(function(){var b=a(this),e=b.attr("data-index");return e?void(d[e]=c?b:1):!1}),d},_save:function(){if(this.options.save){var b={};for(var d in this.state)1===this.state[d]&&(b[d]=1);c[this.uuid]=this.state=b,a.cookie(this.options.cookie.name,JSON.stringify(c),this.options.cookie)}},_load:function(){if(this.options.save){if(null===c){var b=a.cookie(this.options.cookie.name);c=b?JSON.parse(b):{}}this.state=c.hasOwnProperty(this.uuid)?c[this.uuid]:{}}},toggle:function(b){var c=this,d=arguments.length;if(1>=d)c.$el.find("ul").each(function(){var d=a(this);c._toggle(d,b)});else{var e,f={},g=Array.prototype.slice.call(arguments,1);d--;for(var h=0;d>h;h++){e=g[h];var i=c.$el.find('ul[data-index="'+e+'"]').first();if(i&&(f[e]=i,b)){var j=c._parents(i,!0);for(var k in j)f.hasOwnProperty(k)||(f[k]=j[k])}}for(e in f)c._toggle(f[e],b)}c._save()},destroy:function(){a.removeData(this.$el),this.$el.find("li:has(ul) > a").unbind("click"),this.$el.find("li:has(ul) > a > span").unbind("click")}},a.fn.navgoco=function(c){if("string"==typeof c&&"_"!==c.charAt(0)&&"init"!==c)var d=!0,e=Array.prototype.slice.call(arguments,1);else c=a.extend({},a.fn.navgoco.defaults,c||{}),a.cookie||(c.save=!1);return this.each(function(f){var g=a(this),h=g.data("navgoco");h||(h=new b(this,d?a.fn.navgoco.defaults:c,f),g.data("navgoco",h)),d&&h[c].apply(h,e)})};var c=null;a.fn.navgoco.defaults={caretHtml:"",accordion:!1,openClass:"open",save:!0,cookie:{name:"navgoco",expires:!1,path:"/"},slide:{duration:400,easing:"swing"},onClickBefore:a.noop,onClickAfter:a.noop,onToggleBefore:a.noop,onToggleAfter:a.noop}}(jQuery); \ No newline at end of file +(function($){"use strict";var Plugin=function(el,options,idx){this.el=el;this.$el=$(el);this.options=options;this.uuid=this.$el.attr("id")?this.$el.attr("id"):idx;this.state={};this.init();return this};Plugin.prototype={init:function(){var self=this;self._load();self.$el.find("ul").each(function(idx){var sub=$(this);sub.attr("data-index",idx);if(self.options.save&&self.state.hasOwnProperty(idx)){sub.parent().addClass(self.options.openClass);sub.show()}else if(sub.parent().hasClass(self.options.openClass)){sub.show();self.state[idx]=1}else{sub.hide()}});var caret=$("").prepend(self.options.caretHtml);var links=self.$el.find("li > a");self._trigger(caret,false);self._trigger(links,true);self.$el.find("li:has(ul) > a").prepend(caret)},_trigger:function(sources,isLink){var self=this;sources.on("click",function(event){event.stopPropagation();var sub=isLink?$(this).next():$(this).parent().next();var isAnchor=false;if(isLink){var href=$(this).attr("href");isAnchor=href===undefined||href===""||href==="#"}sub=sub.length>0?sub:false;self.options.onClickBefore.call(this,event,sub);if(!isLink||sub&&isAnchor){event.preventDefault();self._toggle(sub,sub.is(":hidden"));self._save()}else if(self.options.accordion){var allowed=self.state=self._parents($(this));self.$el.find("ul").filter(":visible").each(function(){var sub=$(this),idx=sub.attr("data-index");if(!allowed.hasOwnProperty(idx)){self._toggle(sub,false)}});self._save()}self.options.onClickAfter.call(this,event,sub)})},_toggle:function(sub,open){var self=this,idx=sub.attr("data-index"),parent=sub.parent();self.options.onToggleBefore.call(this,sub,open);if(open){parent.addClass(self.options.openClass);sub.slideDown(self.options.slide);self.state[idx]=1;if(self.options.accordion){var allowed=self.state=self._parents(sub);allowed[idx]=self.state[idx]=1;self.$el.find("ul").filter(":visible").each(function(){var sub=$(this),idx=sub.attr("data-index");if(!allowed.hasOwnProperty(idx)){self._toggle(sub,false)}})}}else{parent.removeClass(self.options.openClass);sub.slideUp(self.options.slide);self.state[idx]=0}self.options.onToggleAfter.call(this,sub,open)},_parents:function(sub,obj){var result={},parent=sub.parent(),parents=parent.parents("ul");parents.each(function(){var par=$(this),idx=par.attr("data-index");if(!idx){return false}result[idx]=obj?par:1});return result},_save:function(){if(this.options.save){var save={};for(var key in this.state){if(this.state[key]===1){save[key]=1}}if(this.options.storageType==="local"&&typeof Storage!=="undefined"){lclStorage=lclStorage===null?{}:lclStorage;lclStorage[this.uuid]=this.state=save;var $strLocal=JSON.stringify(lclStorage);sessionStorage.setItem(this.options.cookie.name,$strLocal)}else{cookie[this.uuid]=this.state=save;$.cookie(this.options.cookie.name,JSON.stringify(cookie),this.options.cookie)}}},_load:function(){if(this.options.save){if(this.options.storageType==="local"&&typeof Storage!=="undefined"){var dataStrg=sessionStorage.getItem(this.options.cookie.name);var lclStorage=dataStrg&&dataStrg!=="undefined"?JSON.parse(dataStrg):{};this.state=lclStorage.hasOwnProperty(this.uuid)?lclStorage[this.uuid]:{}}else if(this.options.storageType==="cookie"){if(cookie===null){var data=$.cookie(this.options.cookie.name);cookie=data?JSON.parse(data):{}}this.state=cookie.hasOwnProperty(this.uuid)?cookie[this.uuid]:{}}}},toggle:function(open){var self=this,length=arguments.length;if(length<=1){self.$el.find("ul").each(function(){var sub=$(this);self._toggle(sub,open)})}else{var idx,list={},args=Array.prototype.slice.call(arguments,1);length--;for(var i=0;i a").unbind("click");this.$el.find("li:has(ul) > a > span").unbind("click")}};$.fn.navgoco=function(options){if(typeof options==="string"&&options.charAt(0)!=="_"&&options!=="init"){var callback=true,args=Array.prototype.slice.call(arguments,1)}else{options=$.extend({},$.fn.navgoco.defaults,options||{});if(!$.cookie&&options.storageType==="cookie"){options.save=false}}return this.each(function(idx){var $this=$(this),obj=$this.data("navgoco");if(!obj){obj=new Plugin(this,callback?$.fn.navgoco.defaults:options,idx);$this.data("navgoco",obj)}if(callback){obj[options].apply(obj,args)}})};var cookie=null,lclStorage=null;$.fn.navgoco.defaults={storageType:"cookie",caretHtml:"",accordion:false,openClass:"open",save:true,cookie:{name:"navgoco",expires:false,path:"/"},slide:{duration:400,easing:"swing"},onClickBefore:$.noop,onClickAfter:$.noop,onToggleBefore:$.noop,onToggleAfter:$.noop}})(jQuery); \ No newline at end of file