Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Где взять годный объект параметров урла (https://javascript.ru/forum/events/55782-gde-vzyat-godnyjj-obekt-parametrov-urla.html)

kostyanet 14.05.2015 09:49

Где взять годный объект параметров урла
 
Если с частями pathname все довольно просто, и я даже не заморачивался написанием урло-генератора для них, то с параметрами, которые search string всегда был геморрой. На php от него удалось избавиться, а для js хотелось бы подыскать готовый, потому что я вообще не знаю как на js колдовать с геттерами и сеттерами, без которых геморроя будет не меньше.

Суть такова. На примере как работает пхпшный парсер-генератор:

echo $get->url_home()->page(1)->order('da')->onpage(32)->some('param');


дает типа

http://www.example.com?page=1&order=da&onpage=32&some=param


после того как дал берет (на любой другой странице) и можно поменять или выкинуть параметры

echo $get->url_home()->page(null)->order('dd')->onpage(null)->some('no');


дает

http://www.example.com?order=dd&some=no


Все параметры - условные, просто для примера. Я юзаю коротки ключи, они хранятся в настройках объекта, чтоб было понятно пишу полностью.

Если не стирать значения, а просто поменять или добавить еще, то старые параметры выведутся как были

Допустим было

http://www.example.com?page=1&order=da&onpage=32&some=param


выводим где-то адрес в линк

echo $get->url_home()->some('no')->bar('baz');


получаем

http://www.example.com?page=1&order=da&onpage=32&some=no&bar=baz


Таким образом объект поддерживает любое количество параметров (включая массивы) и в любой момент можно поменять любой параметр, убить или добавить новый.

Затем по проверкам

if($page=$get->page){
/* Если в page что-то есть, оно будет в page, если нет, там будет null */
}


Ну и просто можно профтыкать

$get->page=$page


чтоб поменять номер страницы перед выводом.

Объект сам растеризуется по умолчанию для обычных линков.

Есть что-то похожее на js из готового и не сильно жирного?

kostyanet 14.05.2015 09:54

Например мне надо стереть фильтры которые в параметре f=, но не стирать выбранную сортировку o= , но стереть p= (страницу) если есть. Как подумаю как это на регах делать в js, так сразу становится очень печально.

Да, еще там фича, что генерить кучу ссылок где меняется один-два параметра вообще лафа

$get->url_home(); // инициализировали
foreach($arr as $p)
  echo '<a href="'.$get->page(p).'">'.$p.'</a>';

kostyanet 14.05.2015 19:13

Еще раз напоминаю про заявку. Или как на js оно вообще делается или нет?

kostyanet 15.05.2015 18:38

Ладно, припомню всем кто не ответил... :)

Написал сам приблизительный пердимоноколь:

var Get=(function(){
	var qd = {}, qs={},
	ins=function(k,v){
		qd[k]=v;
	};
	location.search.substr(1).split("&").forEach(
		function(item){
			ins(item.split('=')[0],decodeURIComponent(item.split('=')[1]));
		});
	return {
		set:function(k,v){
			qs[k]=v;
			return this;
		},
		get:function(k){
			return (k in qd)?qd[k]:null;
		},
		toString:function(){
			var k,res=[];
			for(k in qs)
				qd[k]=qs[k];
			for(k in qd)
				if(qd[k]!==null)
					res.push(k+'='+encodeURIComponent(qd[k]));
			return res.join('&');
		},
		ass:function(){
			location.search=this.toString();
		},
		qd:qd
	};
})();


Вопрос, какого члена-корреспондента toString не плющит объект? То есть как оказалось тут и не нужен такой метод как таковой, рендерить ссылки я не собираюсь, но почему-то не плющит, проверял в срачпаде ФФ.

Еще вопрос, а как теперь сделать чтобы set скрылся в приват, а ключи можно было профтыкать по имени, типа вот так

Get.fls=null

kostyanet 15.05.2015 18:45

Еще один, forEach фурычит во всех актуальных браузерах? Я нашел кусочек который над обхектом на СО, от него ничего не осталось почти кроме этого форича.

kostyanet 15.05.2015 22:19

Абсолютно е67ытая система, мля, все никак не могу привыкнуть.

location.search.substr(1).split("&").forEach(

казалось бы нет ни одного сепаратора - пройдет мимо, сразу выпадет по фолс на конец конструкции. Х нанэ - залезет со своей ебучей пустой строкой и нахерачит там ундефайнедов...

ну кто такую логику вообще придумал, суки...

fuckJS 15.05.2015 22:27

че то у тебя много умных слов, а задача, похоже, детская. Ты что, не можешь урл что-ли склеить?

kostyanet 15.05.2015 22:28

Ну склейте если такой умный. Задача с примерами сформулирована выше.

kostyanet 15.05.2015 22:37

Такчта в газенваген форич, синергизм тупизны, блин. Вот так надо

for(var s=location.search.substr(1).split('&'),i=0;item=s[i];i++)
		qd[item.split('=')[0]]=decodeURIComponent(item.split('=')[1]);

fuckJS 15.05.2015 23:44

Цитата:

Сообщение от kostyanet
Задача с примерами сформулирована выше.

Мне твою ахинею читать неохота, но судя по названию темы, типа того
Url={
 clone: function(){
  var o=Object.create(this)
  o.params={}
  return o
 },
 setPath: function(path){this.path=path},
 setParams: function(src){
  for(var i in src) {
   if(!src.hasOwnProperty(i)) return this;  this.params[i]=encodeURIComponent(src[i])
   }
   return this
 },
 removeParam: function(param){with(this){
  for(var i in params){if(i === param) {delete params[i]}}}
 },
 get: function(){
   with(this) {
     var paramsString=""
     for(var i in params){ if(!params.hasOwnProperty(i)) return; paramsString+=i+"="+params[i]+"&"}
     return path+paramsString.replace(/\&$/, "")
   }
 }
}
 
with(url=Url.clone()){
 setPath("http://mysite.com?")
 setParams({foo: "bla-bla", bar: "русский??текст"})
}
 
 
with(url) with(console){
 log(get())
 setParams({baz: "mooo"})
 log(get())
 removeParam("foo")
 log(get())
 setPath("http://another-site.com?")
 log(get())
}



//>>>> [url]http://mysite.com?foo=bla-bla&bar=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%3F%3F%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD[/url]
//>>>> [url]http://mysite.com?foo=bla-bla&bar=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%3F%3F%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD&baz=mooo[/url]
//>>>> [url]http://mysite.com?bar=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%3F%3F%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD&baz=mooo[/url]
//>>>> [url]http://another-site.com?bar=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%3F%3F%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD&baz=mooo[/url]


Часовой пояс GMT +3, время: 11:57.