Где взять годный объект параметров урла
Если с частями 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 из готового и не сильно жирного? |
Например мне надо стереть фильтры которые в параметре f=, но не стирать выбранную сортировку o= , но стереть p= (страницу) если есть. Как подумаю как это на регах делать в js, так сразу становится очень печально.
Да, еще там фича, что генерить кучу ссылок где меняется один-два параметра вообще лафа $get->url_home(); // инициализировали foreach($arr as $p) echo '<a href="'.$get->page(p).'">'.$p.'</a>'; |
Еще раз напоминаю про заявку. Или как на js оно вообще делается или нет?
|
Ладно, припомню всем кто не ответил... :)
Написал сам приблизительный пердимоноколь: 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 |
Еще один, forEach фурычит во всех актуальных браузерах? Я нашел кусочек который над обхектом на СО, от него ничего не осталось почти кроме этого форича.
|
Абсолютно е67ытая система, мля, все никак не могу привыкнуть.
location.search.substr(1).split("&").forEach( казалось бы нет ни одного сепаратора - пройдет мимо, сразу выпадет по фолс на конец конструкции. Х нанэ - залезет со своей ебучей пустой строкой и нахерачит там ундефайнедов... ну кто такую логику вообще придумал, суки... |
че то у тебя много умных слов, а задача, похоже, детская. Ты что, не можешь урл что-ли склеить?
|
Ну склейте если такой умный. Задача с примерами сформулирована выше.
|
Такчта в газенваген форич, синергизм тупизны, блин. Вот так надо
for(var s=location.search.substr(1).split('&'),i=0;item=s[i];i++) qd[item.split('=')[0]]=decodeURIComponent(item.split('=')[1]); |
Цитата:
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. |