Где взять годный объект параметров урла
Если с частями 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, время: 08:39. |