Comments 50
Как раз сегодня столкнулся с проблемой парсинга url, нашел medialize.github.io/URI.js/, но очень уж мощный, мне столько не надо, попробую jsurl, спасибо.
0
А разве массив не должен выглядеть так?
bar[]=1&bar[]=2&bar[]=3
0
Это PHP-style. В других случаях, то что для вас так очевидно может дать совершенно иной результат. Если вам нужно именно это — не стесняйтесь поменять под свои нужды.
+7
Честно признать поражён что такая важная функция работы встроенного языка интерактивности веб-страниц до сих пор не реализована нативно, ведь она не менее важна, как работа с DOM, например.
+7
И тем не менее — имеем то, что имеем :)
+1
Вообще много чего логичного в этих браузерах нет — проблема не только в этой области а во всей человеческой деятельности. Вон тут мысли проскакивали — поддержку jQuery в браузер «вкомпилить».
Може т Вас немного успокоит тот факт, что «недоделанность» технологий/продуктов повышает стоимость труда разработчиков (что для разработчиков хорошо — ибо доп. хлеб)
Може т Вас немного успокоит тот факт, что «недоделанность» технологий/продуктов повышает стоимость труда разработчиков (что для разработчиков хорошо — ибо доп. хлеб)
0
Parsing URLs with the DOM!
// This function creates a new anchor element and uses location
// properties (inherent) to get the desired URL data. Some String
// operations are used (to normalize results across browsers).
function parseURL(url) {
var a = document.createElement('a');
a.href = url;
return {
source: url,
protocol: a.protocol.replace(':',''),
host: a.hostname,
port: a.port,
query: a.search,
params: (function(){
var ret = {},
seg = a.search.replace(/^\?/,'').split('&'),
len = seg.length, i = 0, s;
for (;i<len;i++) {
if (!seg[i]) { continue; }
s = seg[i].split('=');
ret[s[0]] = s[1];
}
return ret;
})(),
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
hash: a.hash.replace('#',''),
path: a.pathname.replace(/^([^\/])/,'/$1'),
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
segments: a.pathname.replace(/^\//,'').split('/')
};
}
var myURL = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top');
myURL.file; // = 'index.html'
myURL.hash; // = 'top'
myURL.host; // = 'abc.com'
myURL.query; // = '?id=255&m=hello'
myURL.params; // = Object = { id: 255, m: hello }
myURL.path; // = '/dir/index.html'
myURL.segments; // = Array = ['dir', 'index.html']
myURL.port; // = '8080'
myURL.protocol; // = 'http'
myURL.source; // = 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'
+8
IPv6-адреса нормально парсятся?
+1
Все зависит от того, что вы имеете ввиду под понятием нормально. jsfiddle.net/H55PU/1/ Так нормально? Тогда ответ — да, нормально.
0
Хорошая, понятная, простая библиотечка. Спасибо!
Еще бы ее как amd модуль оформить и в репозиторий jam'а добавить — было бы супер!
Еще бы ее как amd модуль оформить и в репозиторий jam'а добавить — было бы супер!
+2
Как быстро и надежно получить абсолютный путь из относительного? Вот так:
function resolveURL(baseURL, relativeURL) {
var html = document.implementation.createHTMLDocument("");
var base = html.createElement("base");
base.setAttribute("href", baseURL);
var img = html.createElement("img");
img.setAttribute("src", relativeURL);
html.head.appendChild(base);
html.body.appendChild(img);
return img.src;
}
0
Как-то сложно, глупо и ещё и два тега в тело страницы добавляется. А картинку убрать за собой не судьба?
upd: хотя глуплю, добавляется всё это на фейковую страницу, но всё-равно операции с дом ради такого использовать — стрёмно.
upd: хотя глуплю, добавляется всё это на фейковую страницу, но всё-равно операции с дом ради такого использовать — стрёмно.
0
Я в своё время делал для этого такой велосипед (т.к. не нравилась обработка #… при задании base):
function qualifyURL(url, base) {
if (!url || /^([a-z]+:|#)/.test(url)) return url;
var a = document.createElement('a');
if (base) {
a.href = base;
a.href = a.protocol + (url.charAt(0) == '/' ? (url.charAt(1) == '/' ? '' : '//' + a.host) : '//' + a.host + a.pathname.slice(0, (url.charAt(0) != '?' && a.pathname.lastIndexOf('/') + 1) || a.pathname.length)) + url;
} else {
a.href = url;
};
return a.href;
};
0
А что делать с такими параметрами: ?asd[color]=red&asd[company]=sotmarket?
Такой сложный параметр не будет обработан?
Такой сложный параметр не будет обработан?
0
Позволяет менять адрес в адресной строке, без перезагрузки страницы. Как в VK.
balupton.com/projects/jquery-history
balupton.com/projects/jquery-history
-5
Нативный и простой вариант, если кто не знает:
var parser = document.createElement('a');
parser.href = "http://example.com:3000/pathname/?search=test#hash";
parser.protocol; // => "http:"
parser.hostname; // => "example.com"
parser.port; // => "3000"
parser.pathname; // => "/pathname/"
parser.search; // => "?search=test"
parser.hash; // => "#hash"
parser.host; // => "example.com:3000"
+9
UFO just landed and posted this here
Цитирую товарища deepsweet:
«я всегда буду смотреть исходный код перед тем, как комментировать…» :)
«я всегда буду смотреть исходный код перед тем, как комментировать…» :)
+2
А где то уже есть?
-1
Да, там именно это и есть — github.com/Mikhus/jsurl/blob/master/url.js
Не находите?
var
...
link = d.createElement( 'a'),
..;
link.href = url;
for (var i in map) {
self[i] = link[map[i]] || '';
}
Не находите?
0
a = new Url('//example.com?x&x=1')
b = new Url('//example.com?x=1&x')
a.query.x // "1"
b.query.x // ["1", ""]
Неаккуратно как-то, не?
+4
habrahabr.ru/post/65407/
Все вроде написано еще в 2009 году. А колошматить здоровенные DOM-объекты с кучей свойств и зависимостей ради того чтобы получить пару готовых свойств — это моветон.
Все вроде написано еще в 2009 году. А колошматить здоровенные DOM-объекты с кучей свойств и зависимостей ради того чтобы получить пару готовых свойств — это моветон.
0
Не парсит QueryString. Исходная задача, которую я, как писал выше, ставил перед собой — изменить часть URL (например, параметры QueryString или протокол или что-то еще) — не решается с помощью данной функции. Это так, для полноты картины, а не холивара ради :)
+2
Для этого можно воспользоваться parse_str, а в обратную сторону http_build_query :)
0
И это нам дает, как я понимаю, «без минимизации 722 байта в сжатом виде.»? :)
+1
Увы, все вместе выливается в два раза больший объем — 1516 байт. Уж для статистики, Ваш файл имеет размер 926 байт.
Обрабатывал JSMin + gzip
Чертов колдун, в рот мне ноги! :)))
Обрабатывал JSMin + gzip
Чертов колдун, в рот мне ноги! :)))
-1
Если возьмете уже минифицированный «url.min.js» из моего репозитория на Github'е и пожмете gzip'ом, получите 900 вместо 926, сэкономив примерно 2.8% :)
0
А чем Вы пользуетесь для минификации?
-1
В данном случае просто этим — javascriptcompressor.com/
+1
В драфте нового стандарта предусмотрен конструктор URL. Работа с ним отличается от вашей реализации. Не претендуя на уникальность решения, вот мой пример реализации: gist.github.com/termi/5443716 (У меня используется старый драфт, сейчас функции для работы с search поменяли)
+1
Спасибо, это действительно интересно. Вот теперь думаю, делать ли версию, совместимую с этим стандартом или подождать-посмотреть куда ветер подует…
0
Sign up to leave a comment.
Манипулирование URL'ами в JavaScript