navigation js

AJAX навигация по меткам

Итак задача, нужно сохранять состояние страницы после ajax запроса. Для этого приспособили метки у ссылок, URL будет вот такого вида http://site.ru/#/key:val/key1:val1/keyN:valN/

В js далеко не гуру, но все работает и нативно.

[source language=’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 = »;
};
};
};
[/source]

Делать такую навигацию весьма трудоемко, но позволяет немного шире использовать ajax.