Итак задача, нужно сохранять состояние страницы после ajax запроса. Для этого приспособили метки у ссылок, URL будет вот такого вида http://site.ru/#/key:val/key1:val1/keyN:valN/
В js далеко не гуру, но все работает и нативно.
var Navigation = function() { this.isHash = function(){return (window.location.href.indexOf('#') !== -1 && window.location.hash.length > 1);}; /** * Возвращает все параметры из url в виде объекта */ this.getQueryParams = function(){ if(this.isHash()) { var _ar = window.location.hash.replace('#', '').split('/'); var _ob = {}; for(var i=0; i < _ar.length; i++){ if(_ar[i] !== "") _ob[i] = _ar[i]; } var returnObject = {}; for(var j in _ob){ if (_ob.hasOwnProperty(j)) { var _ar_params = _ob[j].split(':'); returnObject[_ar_params[0]] = _ar_params[1]; } } return returnObject; } return false; }; /** * Устанавливает строку параметров, если есть сотрет что было */ this.setHash = function(objectParsms){ var ar = [], j = 0; for(var i in objectParsms){ j++; ar[j] = i + ':' + objectParsms[i]; } var hashString = ar.join('/'); if(hashString.length > 0) window.location.hash = '#' + hashString + '/'; }; this._isEmptyObject = function(Obj) { var i = 0; for(var o in Obj){ i++; } return i; }; this._isKeyObject = function(obj, key){ for(var o in obj) { if(o === key) return true; } return false; }; /** * Добавляет параметр в url, если параметр уже есть то заменит значение на новое */ this.addHashParam = function(objectParams){ if(this.isHash()) { var params = this.getQueryParams(); for(var o in objectParams){ if(this._isKeyObject(params, o)){ params[o] = objectParams[o]; } } var arRes = [], k = 0; for(var or in params){ k++;arRes[k] = or + ':' + params[or]; } var str_hash = arRes.join('/'); var ar = [], j = 0; for(var i in objectParams){ if(!this._isKeyObject(params, i)){ j++; ar[j] = i + ':' + objectParams[i]; } } if(ar.length > 0){ str_hash += ar.join('/') + '/'; } else{ str_hash += '/'; } window.location.hash = str_hash; } else { this.setHash(objectParams); } }; /** * Удаляет параметр из url можно указывать несколько, принимает массив ключей */ this.delHashParams = function(arParams){ if(this.isHash()) { var params = this.getQueryParams(); for(var a = 0; a <= arParams.length; a++){ delete params[arParams[a]]; } if(this._isEmptyObject(params) > 0) this.setHash(params); else window.location.hash = ''; }; }; };
Делать такую навигацию весьма трудоемко, но позволяет немного шире использовать ajax.