mirror of
https://gitee.com/ShopeX/OMS
synced 2026-04-07 07:15:33 +08:00
9 lines
3.7 KiB
JavaScript
9 lines
3.7 KiB
JavaScript
|
|
var HistoryManager=new Class({Implements:[Options,Events],options:{observeDelay:100,stateSeparator:";",iframeSrc:"blank.html"},dataOptions:{skipDefaultMatch:true,defaults:[],regexpParams:""},initialize:function(a){if(this.modules)return this;this.setOptions(a);this.modules=$H({});this.count=history.length;this.states=[];this.states[this.count]=this.getHash();this.state=null;return this},start:function(){this.observe.periodical(this.options.observeDelay,this);this.started=true;this.observe();this.update();
|
|
this.fireEvent("onStart",[this.state]);return this},register:function(a,b,c,d,f,g){this.modules||this.initialize();b=$merge(this.dataOptions,g||{},{defaults:b,onMatch:c,onGenerate:d,regexp:f});b.regexp=b.regexp||a+"-([\\w_-]*)";if(typeof b.regexp=="string")b.regexp=RegExp(b.regexp,b.regexpParams);b.onGenerate=b.onGenerate||function(e){return a+"-"+e[0]};b.values=b.defaults.copy();this.modules.set(a,b);this.fireEvent("onUnregister",[a,b]);return{setValues:function(e){return this.setValues(a,e)}.bind(this),
|
|
setValue:function(e,h){return this.setValue(a,e,h)}.bind(this),generate:function(e){return this.generate(a,e)}.bind(this),unregister:function(){return this.unregister(a)}.bind(this)}},unregister:function(a){this.fireEvent("onRegister",[a]);this.modules.remove(a)},setValues:function(a,b){var c=this.modules.get(a);if(!c||c.values.isSimilar(b))return this;c.values=b;this.update();return this},setValue:function(a,b,c){a=this.modules.get(a);if(!a||a.values[b]==c)return this;a.values[b]=c;this.update();
|
|
return this},generate:function(a,b){var c=this.modules.get(a),d=c.values.copy();c.values=b;var f=this.generateState();c.values=d;return"#"+f},observe:function(){if(!this.timeout){var a=this.getState();if(this.state!=a){if(Browser.Engine.trident&&!document.querySelectorAll&&this.state!==null)this.setState(a,true);else this.state=a;this.modules.each(function(b){var c=a.match(b.regexp);if(c){c.splice(0,1);c.complement(b.defaults);if(!c.isSimilar(b.defaults))b.values=c}else b.values=b.defaults.copy();
|
|
b.onMatch(b.values,b.defaults)});this.fireEvent("onStateChange",[a]).fireEvent("onObserverChange",[a])}}},generateState:function(){var a=[];this.modules.each(function(b){b.skipDefaultMatch&&b.values.isSimilar(b.defaults)||a.push(b.onGenerate(b.values))});return a.join(this.options.stateSeparator)},update:function(){if(!this.started)return this;var a=this.generateState();if(!this.state&&!a||this.state==a)return this;this.setState(a);this.fireEvent("onStateChange",[a]).fireEvent("onUpdate",[a]);return this},
|
|
observeTimeout:function(){this.timeout=this.timeout?$clear(this.timeout):this.observeTimeout.delay(200,this)},getHash:function(){var a=self.location.href,b=a.indexOf("#")+1;return b?a.substr(b):""},getState:function(){var a=this.getHash();if(this.iframe){var b=this.iframe.contentWindow.document;if(b&&b.body.id=="state"){b=b.body.innerText;if(this.state==a)return b;this.istateOld=true}else return this.istate}return a},setState:function(a,b){a=$pick(a,"");self.location.hash=a||"#";if(Browser.Engine.trident&&
|
|
!document.querySelectorAll&&(!b||this.istateOld)){if(!this.iframe){this.iframe=(new Element("iframe",{src:this.options.iframeSrc,style:"visibility: hidden;height:1px;"})).injectInside(document.body);this.istate=this.state}try{var c=this.iframe.contentWindow.document;c.open();c.write('<html><body id="state">'+a+"</body></html>");c.close();this.istateOld=false}catch(d){}}this.state=a},extend:$extend});
|
|
Array.implement({isSimilar:function(a){return this.toString()==a.toString()},complement:function(a){for(var b=0,c=this.length;b<c;b++)this[b]=$pick(this[b],a[b]||null);return this},copy:function(a,b){a=a||0;if(a<0)a=this.length+a;b=b||this.length-a;for(var c=[],d=0;d<b;d++)c[d]=this[a++];return c}}); |