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

Комментарии отключены

Итак задача, нужно сохранять состояние страницы после 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.

И еще вот что есть...

Comments are closed.