Существует ли способ извлечения значений строки запроса через jQuery (или без него) без плагинов ?
Если так, то как? Если нет, есть ли плагин, который может это сделать?
javascript
url
plugins
query-string
Ripounet
источник
источник
Ответы:
Обновление: сентябрь-2018
Вы можете использовать URLSearchParams, который прост и имеет приличную (но не полную) поддержку браузера .
оригинал
Вам не нужен jQuery для этой цели. Вы можете использовать только чистый JavaScript:
Применение:
Примечание. Если параметр присутствует несколько раз (
?foo=lorem&foo=ipsum
), вы получите первое значение (lorem
). Стандартов на этот счет нет, и использование различается, см., Например, этот вопрос: Официальное положение дублирующих ключей запросов HTTP GET .ПРИМЕЧАНИЕ. Функция чувствительна к регистру. Если вы предпочитаете имя параметра без учета регистра, добавьте модификатор 'i' в RegExp
Это обновление, основанное на новых спецификациях URLSearchParams для более быстрого достижения того же результата. Смотрите ответ под названием « URLSearchParams » ниже.
источник
http://www.mysite.com/index.php?x=x1&x=x2&x=x3
Значение поляx
неоднозначно.?mykey=0&m.+key=1
вызовgetParameterByName("m.+key")
будет возвращен0
вместо1
. Вам нужно экранировать метасимволы регулярных выраженийname
перед созданием регулярного выражения. И вам нужно вызвать.replace()
только один раз, используя глобальный флаг и используя"\\$&"
в качестве выражения замены. Вы должны искатьlocation.search
вместоlocation.href
. Ответ с более чем 400 ответами должен учитывать эти детали.Некоторые из размещенных здесь решений неэффективны. Повторять поиск по регулярному выражению каждый раз, когда скрипту необходим доступ к параметру, совершенно не нужно, достаточно одной функции для разделения параметров на объект стиля ассоциативного массива. Если вы не работаете с HTML 5 History API, это необходимо сделать только один раз для каждой загрузки страницы. Другие предложения здесь также не в состоянии правильно декодировать URL.
Пример строки запроса:
Результат:
Это может быть легко улучшено для обработки строк запроса в стиле массива. Пример этого здесь , но так как параметры стиля массива не определены в RFC 3986, я не буду загрязнять этот ответ исходным кодом. Для тех, кто заинтересован в «загрязненной» версии, посмотрите ответ Кэмпбелна ниже .
Также, как отмечается в комментариях,
;
является допустимым разделителем дляkey=value
пар. Это потребовало бы более сложного регулярного выражения для обработки;
или&
, что я считаю ненужным, потому что редко;
используется, и я бы сказал даже более маловероятным, что оба будут использоваться. Если вам нужна поддержка;
вместо того&
, чтобы просто поменять их в регулярном выражении.Если вы используете серверный язык предварительной обработки, вы можете использовать его встроенные функции JSON, чтобы выполнить тяжелую работу за вас. Например, в PHP вы можете написать:
Намного проще!
ОБНОВЛЕНО
Итак, вот подход к управлению этим:
источник
window.location.hash
свойстве, которое отделено отwindow.location.search
свойства. Если хеш изменяется, это никак не влияет на строку запроса.;
это допустимый разделитель дляkey=value
пар GET . Это редко, но для реализации требуется 5 секунд.?a=b&c=d
обычно, и рекомендация W3C для веб-форм, но спецификация URI просто определяетquery = *( pchar / "/" / "?" )
.while(match = search.exec(query))
сwhile((match = search.exec(query)) !== null)
ES2015 (ES6)
Без jQuery
С URL-адресом
?topic=123&name=query+string
будет возвращено следующее:Метод Google
Срывая код Google, я нашел метод, который они используют:
getUrlParameters
Это запутано, но понятно. Это не работает, потому что некоторые переменные не определены.
Они начинают искать параметры в URL,
?
а также из хеша#
. Затем для каждого параметра они разделяются на знак равенстваb[f][p]("=")
(похожеindexOf
, они используют позицию символа для получения ключа / значения). Разделив его, они проверяют, имеет ли параметр значение или нет, если он имеет, то сохраняют значениеd
, иначе они просто продолжают.В конце объект
d
возвращается, обрабатывая экранирование и+
знак. Этот объект похож на мой, у него такое же поведение.Мой метод как плагин jQuery
Применение
Тест производительности (метод разделения на метод регулярных выражений) ( jsPerf )
Код подготовки: объявление методов
Сплит тестовый код
Тестовый код Regex
Тестирование в Firefox 4.0 x86 на Windows Server 2008 R2 / 7 x64
источник
unescape
является устаревшей функцией и заменяется наdecodeURIComponent()
; имейте в виду, что ни одна из этих функций не будет правильно декодировать+
символ a в пробел. 2. Вы должны объявить результат как объект, а не как массив, потому что JavaScript сам по себе не имеет ассоциативных массивов, а объявленный вами массив обрабатывается как объект, так или иначе назначая ему именованные свойства.window.location
делает спор о производительности, учитывая, что переход клиента к URL-адресу намного, намного дороже.Улучшенная версия ответа Артема Баргера :
Для получения дополнительной информации об улучшениях см .: http://james.padolsey.com/javascript/bujs-1-getparameterbyname/
источник
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
.null
если за параметром не следует «=». Вы можетеif (!RegExp('[?&]'+name+'(&.*)?$').exec(window.location.search)) return false;
сделать так, чтобы он возвращался,boolean false
если параметр вообще отсутствует.new
префикс при создании регулярного выражения:var match = new RegExp('...
.replace('\u200E', '')
var results = new RegExp('[\\?&]' + name + '=([^&#/]*)').exec(url);
URLSearchParams
Firefox 44+, Opera 36+, Edge 17+, Safari 10.3+ и Chrome 49+ поддерживают API URLSearchParams :
Для стабильных версий IE есть предложенный Google полифилл URLSearchParams .
Это не стандартизировано W3C , но это жизненный уровень WhatWG .
Вы можете использовать его на
location
:или
Или, конечно, на любой URL:
Вы также можете получить параметры, используя сокращенное
.searchParams
свойство объекта URL, например:Читаешь / установочные параметры через
get(KEY)
,set(KEY, VALUE)
,append(KEY, VALUE)
API. Вы также можете перебирать все значенияfor (let p of params) {}
.Эталонная реализация и пример страницы доступны для аудита и тестирования.
источник
.get
вместо просто.
slice(1)
на.search
, вы можете использовать его непосредственно. URLSearchParams может обрабатывать ведущие?
.URLSearchParams
бесполезно, потому что не возвращает фактические значения параметров URL.new URL('https://example.com?foo=1&bar=2')
не работает для URL-file:///android_asset/...
Просто еще одна рекомендация. Плагин Purl позволяет извлекать все части URL, включая якорь, хост и т. Д.
Может использоваться с или без jQuery.
Использование очень просто и круто:
Однако по состоянию на 11 ноября 2014 г. Purl больше не поддерживается, и автор рекомендует использовать вместо него URI.js. Плагин jQuery отличается тем, что фокусируется на элементах - для использования со строками, просто используйте
URI
напрямую, с или без jQuery. Подобный код выглядел бы как таковой, более полные документы здесь :источник
ТЛ; др
Быстрое, полное решение , которое обрабатывает многозначные ключи и закодированные символы .
Многострочный:Что это код ...
Пример:«нуль-сливающийся» , оценка короткого замыкания
ES6 деструктурирующие Назначения , функции со стрелками , Шаблон строка
Узнайте больше ... о решении Vanilla JavaScript.
Для доступа к различным частям URL используйте
location.(search|hash)
Самое простое (фиктивное) решение
Многозначные ключи
Простая проверка ключа
(item in dict) ? dict.item.push(val) : dict.item = [val]
qd.key[index]
илиqd[key][index]
Закодированные символы?
Используйте
Пример:decodeURIComponent()
для второго или обоих расколов.Из комментариев
* !!! Обратите внимание, что
decodeURIComponent(undefined)
возвращает строку"undefined"
. Решение заключается в простом использовании&&
, которое гарантирует, чтоdecodeURIComponent()
не вызывается для неопределенных значений. (См. «Полное решение» в верхней части.)Если строка запроса пуста (
location.search == ""
), результат несколько вводит в заблуждениеqd == {"": undefined}
. Рекомендуется проверить строку запроса перед запуском функции синтаксического анализа likeso:источник
array.forEach()
, вставляя определенный код в начале вашего скрипта. см. Polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…var qd = {}; location.search.substr(1).split("&").forEach( function(item) { var s = item.split("="), k = s[0], v; if(s.length>1) v = decodeURIComponent(s[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v] })
Roshambo на snipplr.com имеет простой скрипт для достижения этой цели, описанный в разделе Получить параметры URL с помощью jQuery | Улучшенный . С его сценарием вы также легко получаете те параметры, которые вам нужны.
Вот суть:
Тогда просто получите ваши параметры из строки запроса.
Так что, если строка URL / запроса была
xyz.com/index.html?lang=de
.Просто позвони
var langval = $.urlParam('lang');
, и вы получите это.У UZBEKJON есть отличная запись в блоге об этом, получите параметры и значения URL с помощью jQuery .
источник
0
? Конечно, я мог бы использовать строгую проверку на равенство, но не должно ли это бытьnull
?Если вы используете jQuery, вы можете использовать библиотеку, такую как jQuery BBQ: кнопка Back & Query Library .
Редактировать: Добавление примера Deparam:
Если вы хотите просто использовать простой JavaScript, вы можете использовать ...
Из-за нового API истории HTML, а именно
history.pushState()
иhistory.replaceState()
, то URL может изменить который аннулирует кэш параметров и их значений.Эта версия будет обновлять свой внутренний кэш параметров при каждом изменении истории.
источник
Просто используйте два разбиения :
Я читал все предыдущие и более полные ответы. Но я думаю, что это самый простой и быстрый метод. Вы можете проверить в этом тесте jsPerf
Чтобы решить проблему в комментарии Рупа, добавьте условное разбиение, изменив первую строку на две ниже. Но абсолютная точность означает, что теперь она медленнее, чем регулярное выражение (см. JsPerf ).
Так что, если вы знаете, что не столкнетесь с встречным делом Рупа, это победит. В противном случае, регулярное выражение.
источник
get('value')
наhttp://the-url?oldvalue=1&value=2
.half
это правда, это возвращает ноль для пустого параметра, как?param=
. Он должен вернуть пустую строку в этом случае, и проверкаhalf !== undefined
решает это.function get(param){return decodeURIComponent((location.search.split(param+'=')[1]||'').split('&')[0])}
return half !== undefined ? decodeURIComponent(half[1].split('&')[0]) : null;
заставить его работатьВот мой пример превращения превосходного решения Энди Э в полноценный плагин jQuery:
Синтаксис:
Лучшее из обоих миров!
источник
Если вы выполняете больше манипуляций с URL- адресами, чем просто анализируете строку запроса, вы можете найти URI.js полезным. Это библиотека для манипулирования URL - и поставляется со всеми прибамбасами. (Извините за саморекламу здесь)
чтобы преобразовать вашу строку запроса в карту:
(URI.js также «фиксирует» плохое querystrings нравится
?&foo&&bar=baz&
в?foo&bar=baz
)источник
var data = URI.parseQuery('?foo=bar&bar=baz&foo=world');
для того же результата ( документы ).Мне нравится решение Райана Фелана . Но я не вижу смысла расширять jQuery для этого? Там нет использования функциональности jQuery.
С другой стороны, мне нравится встроенная функция в Google Chrome: window.location.getParameter.
Так почему бы не использовать это? Хорошо, другие браузеры не имеют. Итак, давайте создадим эту функцию, если она не существует:
Эта функция более или менее от Райана Фелана, но она заключена в другую: чистое имя и отсутствие зависимостей от других библиотек javascript. Подробнее об этой функции в моем блоге .
источник
Вот быстрый способ получить объект, похожий на массив PHP $ _GET :
Применение:
Для строки запроса
x=5&y&z=hello&x=6
это возвращает объект:источник
(function($) { $.extend({ get_query: function (name) { var url = location.href; var qs = url.substring(url.indexOf('?') + 1).split('&'); for(var i = 0, result = {}; i < qs.length; i++){ qs[i] = qs[i].split('='); result[qs[i][0]] = qs[i][1]; } return result; } }); })(jQuery);
и используйте его так:$.get_query()
location.href
должен быть заменен наlocation.search
.Сохраняйте это простым в простом коде JavaScript:
Называйте это из любого места в коде JavaScript:
источник
window.location.search
!Все это отличные ответы, но мне нужно было что-то более надежное, и я подумал, что вам всем может понравиться то, что я создал.
Это простой библиотечный метод, который выполняет анализ и манипулирование параметрами URL. Статический метод имеет следующие вспомогательные методы, которые могут быть вызваны на предметном URL:
Пример:
источник
Из MDN :
источник
Код гольф:
Покажите это!
На моем Mac:
test.htm?i=can&has=cheezburger
отображаетисточник
Я часто использую регулярные выражения, но не для этого.
Мне кажется, проще и эффективнее прочитать строку запроса один раз в моем приложении и построить объект из всех пар ключ / значение, таких как:
Для таких URL
http://domain.com?param1=val1¶m2=val2
вы можете получить их значение позже в своем коде какsearch.param1
иsearch.param2
.источник
источник
Метод Roshambo jQuery не заботился о декодировании URL
Просто добавил эту возможность также при добавлении в операторе возврата
Теперь вы можете найти обновленную суть:
источник
Мне нравится этот (взят из jquery-howto.blogspot.co.uk):
Прекрасно работает для меня.
источник
Вот мое редактирование этого превосходного ответа - с добавленной возможностью анализировать строки запроса с ключами без значений.
ВАЖНЫЙ!Параметр для этой функции в последней строке отличается. Это просто пример того, как можно передать ему произвольный URL. Вы можете использовать последнюю строку из ответа Бруно, чтобы проанализировать текущий URL.
Так что именно изменилось? С URL-адресом
http://sb.com/reg/step1?param=
результаты будут такими же. Но с помощью URL-http://sb.com/reg/step1?param
адреса решение Бруно возвращает объект без ключей, в то время как мое возвращает объект с ключомparam
иundefined
значением.источник
Мне нужен объект из строки запроса, и я ненавижу много кода. Возможно, он не самый надежный во вселенной, но это всего лишь несколько строк кода.
URL как
this.htm?hello=world&foo=bar
создаст:источник
decodeURIComponent
значение в том виде, в котором вы его храните - и, возможно, также ключ, но в этом случае вы с меньшей вероятностью будете использовать нечетные строки.?a&b&c
но это действительно очень читабельно (и, кстати, похоже на мою первую идею). Кроме того,split
это избыточно, но у меня есть рыба для повышения производительности, чем разделение строки из 10 символов дважды.location.search.substr(1)
вместо того,location.href.split('?')[1]
чтобы избежать хеша (#anchor
) вместе с последним параметром запроса.location.search
!Вот расширенная версия связанной версии «Обрабатывать строки запроса в стиле массива» Энди Е. Исправлена ошибка (
?key=1&key[]=2&key[]=3
;1
теряется и заменяется[2,3]
), вносились незначительные улучшения производительности (перекодирование значений, пересчет позиции "[" и т. Д.) И добавлялся ряд улучшений (функционализировано, поддержка разделителей?key=1&key=2
, поддержка;
разделителей) , Я оставил переменные раздражающе короткими, но добавил множество комментариев, чтобы сделать их читабельными (о, и я снова использовал ихv
в локальных функциях, извините, если это сбивает с толку;).Он будет обрабатывать следующую строку запроса ...
... превращая его в объект, который выглядит как ...
Как вы можете видеть выше, эта версия обрабатывает некоторую меру «неправильно сформированных» массивов, т. Е. -
person=neek&person[]=jeff&person[]=jim
илиperson=neek&person=jeff&person=jim
поскольку ключ является идентифицируемым и действительным (по крайней мере, в dotNet's NameValueCollection.Add ):Похоже, что присяжные несколько отдают предпочтение повторным клавишам, так как нет никаких спецификаций. В этом случае несколько ключей хранятся в виде (поддельного) массива. Но учтите, что я не обрабатываю значения, основанные на запятых, в массивах.
Код:
источник
q = decodeURIComponent(window.location.search.substring(1)),
помогает сделать это тоже.Это функция, которую я создал некоторое время назад, и я вполне доволен. Это не чувствительно к регистру - что удобно. Также, если запрошенный QS не существует, он просто возвращает пустую строку.
Я использую сжатую версию этого. Я публикую несжатый для начинающих типов, чтобы лучше объяснить, что происходит.
Я уверен, что это можно оптимизировать или сделать по-другому, чтобы работать быстрее, но это всегда отлично работало для того, что мне нужно.
Наслаждаться.
источник
Мы только что выпустили arg.js , проект, нацеленный на решение этой проблемы раз и навсегда. Это традиционно было так сложно, но теперь вы можете сделать:
или получить всю партию:
и если вы заботитесь о разнице между
?query=true
и#hash=true
после этого вы можете использоватьArg.query()
иArg.hash()
методы.источник
Проблема с верхним ответом на этот вопрос заключается в том, что это не поддерживаемые параметры, помещенные после #, но иногда необходимо также получить это значение.
Я изменил ответ, чтобы он также мог анализировать полную строку запроса со знаком хеша:
источник
И вот как вы можете использовать эту функцию, если URL-адрес
источник
?stringtext&stringword=foo
.Если вы используете Browserify, вы можете использовать
url
модуль из Node.js :Дальнейшее чтение: URL Node.js v0.12.2 Руководство и документация
РЕДАКТИРОВАТЬ: Вы можете использовать интерфейс URL , он довольно широко используется практически во всех новых браузерах, и если код будет работать на старом браузере, вы можете использовать полифилл, как этот . Вот пример кода о том, как использовать интерфейс URL для получения параметров запроса (также называемых параметрами поиска)
Вы также можете использовать URLSearchParams для этого, вот пример из MDN, чтобы сделать это с URLSearchParams:
источник
url
API модуля находится здесь: nodejs.org/api/url.html