С помощью javascript, как я могу добавить параметр строки запроса в URL, если он отсутствует, или, если он присутствует, обновить текущее значение? Я использую jquery для разработки на стороне клиента.
javascript
jquery
query-string
любитель
источник
источник
String#split
принимает второй параметр для максимального разделения. jQuery'smap
также будет полезен.Ответы:
Я написал следующую функцию, которая выполняет то, что я хочу достичь:
источник
[?|&]
должно быть[?&]
var
непосредственно перед объявлением разделителя.value = encodeURIComponent(value);
в первой строке, иначе разрывы строк не будут экранированы правильно.Я расширил решение и скомбинировал его с другим, который я нашел для замены / обновления / удаления параметров строки запроса, основываясь на вводе пользователя и принимая во внимание привязку URL.
Если значение не указано, параметр будет удален, а параметр добавит / обновит параметр. Если URL не указан, он будет взят из window.location
Обновить
При удалении первого параметра в строке запроса произошла ошибка, я переработал регулярное выражение и протестировал, чтобы включить исправление.
Второе обновление
В соответствии с предложением @ JarónBarends - проверка значения твика для проверки неопределенности и нулевого значения, позволяющего установить 0 значений
Третье обновление
Была ошибка, при которой удаление переменной строки запроса непосредственно перед тем, как хэштег потерял символ хештега, которое было исправлено
Четвертое обновление
Спасибо @rooby за указание на оптимизацию регулярных выражений в первом объекте RegExp. Установите начальное регулярное выражение в ([? &]) Из-за проблемы с использованием (\? | &), Найденной @YonatanKarni
Пятое обновление
Удаление объявления хеш-переменной в операторе if / else
источник
value
приведет к удалению переменных из строки запроса, когда вы установите их значение на 0. Поэтому вместоif (value) {}
вас следует использоватьif (typeOf value !== 'undefined' && value !== null) {}
hash
URLSearchParams утилита может быть полезна для этого в сочетании с
window.location.search
. Например:Сейчас
foo
установленоbar
независимо от того, существовало оно или нет.Однако указанное выше назначение
window.location.search
приведет к загрузке страницы, поэтому, если это нежелательно, используйте History API следующим образом:Теперь вам не нужно писать свое собственное регулярное выражение или логику для обработки возможного существования строк запроса.
Тем не менее, поддержка браузера слабая, поскольку в настоящее время она экспериментальная и используется только в последних версиях Chrome, Firefox, Safari, iOS Safari, Android Browser, Android Chrome и Opera. Используйте с полифиллом, если вы решите его использовать.
Обновление: поддержка браузера улучшена с момента моего первоначального ответа.
источник
Unable to set property '__URLSearchParams__:0.8503766759030615' of undefined or null reference
на ie11 вы получаете эту ошибку. это не Pollyfill, если он не работает как запасной вариант.newRelativePathQuery
делает трюк:var newRelativePathQuery = window.location.pathname + '?' + searchParams.toString() + window.location.hash;
Основываясь на ответе @ amateur (и теперь включая исправление из комментария @j_walker_dev), но принимая во внимание комментарий о хэш-тегах в URL, я использую следующее:
Отредактировано, чтобы исправить
[?|&]
в регулярном выражении, которое, конечно, должно быть[?&]
как указано в комментарияхИзменить: Альтернативная версия для поддержки удаления параметров URL, а также. Я использовал
value === undefined
как способ обозначить удаление. Может использоватьvalue === false
или даже отдельный входной параметр, как хотел.Смотрите это в действии на https://jsfiddle.net/bp3tmuxh/1/
источник
var separator
строки справа над возвратом исправляет ошибку с "/ app # / cool? Fun = true". Это выберет «&» в качестве разделителя, хотя реальных параметров строки запроса пока нет. Только клиентские.[?|&]
должно быть просто[?&]
(в противном случае будет соответствовать|
)."([?|&])"
это не хорошо. Пожалуйста, исправьте это какvar re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
илиvar re = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i");
(хорошее расширение другими способами!)var re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
не работает, второй работаетВот моя библиотека, чтобы сделать это: https://github.com/Mikhus/jsurl
источник
Я понимаю, что этот вопрос старый и на него уже дан ответ, но вот мой ответ. Я пытаюсь изобрести колесо здесь, потому что я использовал принятый в настоящее время ответ, а неправильная обработка фрагментов URL недавно укусила меня в проекте.
Функция ниже. Это довольно долго, но это было сделано, чтобы быть максимально устойчивым. Я хотел бы предложения по сокращению / улучшению. Я собрал небольшой набор тестов jsFiddle для него (или других подобных функций). Если функция может пройти все тесты там, я говорю, что это, вероятно, хорошо.
Обновление: я наткнулся на классную функцию для использования DOM для разбора URL , поэтому я включил эту технику здесь. Это делает функцию короче и надежнее. Реквизит для автора этой функции.
источник
window.location.search для чтения / записи.
Однако - изменение строки запроса перенаправит страницу, на которой вы находитесь, и приведет к обновлению с сервера.
Если вы пытаетесь сохранить состояние на стороне клиента (и, возможно, сделать его способным делать закладки), вы захотите изменить хеш URL вместо строки запроса, которая удерживает вас на той же странице (window.location. хэш читается / пишется). Вот как это делают такие сайты, как twitter.com.
Вы также захотите, чтобы кнопка «Назад» работала, вам нужно будет привязать события javascript к событию изменения хеша, хороший плагин для этого - http://benalman.com/projects/jquery-hashchange-plugin/
источник
Если он не установлен или вы хотите обновить его новым значением, вы можете использовать:
Это в простом Javascript, кстати.
РЕДАКТИРОВАТЬ
Вы можете попробовать использовать плагин jquery query-object
источник
Вот мой подход:
location.params()
функцию (показанную ниже) можно использовать как метод получения или установки. Примеры:Учитывая URL
http://example.com/?foo=bar&baz#some-hash
,location.params()
возвращает объект со всеми параметрами запроса:{foo: 'bar', baz: true}
.location.params('foo')
вернется'bar'
.location.params({foo: undefined, hello: 'world', test: true})
изменит URL наhttp://example.com/?baz&hello=world&test#some-hash
.Вот
params()
функция, которую можно при желании назначитьwindow.location
объекту.источник
Это мое предпочтение, и оно охватывает случаи, которые я могу придумать. Кто-нибудь может придумать способ уменьшить его до одной замены?
источник
Я знаю, что это довольно старый, но я хочу запустить мою рабочую версию здесь.
ПРИМЕЧАНИЕ. Это модифицированная версия @elreimundo.
источник
Мой вывод отсюда (совместим с «используйте строгий»; на самом деле не использует jQuery):
Пример использования:
источник
Основываясь на ответе, который дал @ellemayo, я нашел следующее решение, которое позволяет отключить хеш-тег при желании:
Назовите это так:
Результаты в:
источник
typeof value !== 'undefined' && value !== null
более явное, ноvalue != null
означает то же самое и более сжатое.Вот более короткая версия, которая заботится о
Код:
Описание регулярного выражения можно найти здесь .
ПРИМЕЧАНИЕ . Это решение основано на ответе @amateur, но со многими улучшениями.
источник
Код, который добавляет список параметров к существующему URL, используя ES6 и jQuery:
Где listOfParams это как
Пример использования:
Быстрые тесты:
источник
Другой подход без использования регулярных выражений . Поддерживает 'хэш' якоря в конце URL, а также несколько знаков вопроса (?). Должно быть немного быстрее, чем подход с регулярными выражениями.
источник
Используйте эту функцию для добавления, удаления и изменения параметра строки запроса из URL на основе jquery
Добавить новый и изменить существующий параметр в URL
Удалить существующий
источник
Используя
jQuery
мы можем сделать как нижеВ переменной
new_url
у нас будут новые параметры запроса.Ссылка: http://api.jquery.com/jquery.param/
источник
Чтобы дать пример кода для модификации,
window.location.search
как предложено Галом и tradyblix:источник
Код скрипта Java для поиска конкретной строки запроса и замены ее значения *
источник
Да, у меня была проблема, из-за которой моя строка запроса переполнялась и дублировалась, но это было связано с моей собственной медлительностью. так что я немного поиграл и работал над js jquery (на самом деле sizzle) и магией C #.
Так что я только что понял, что после того, как сервер завершил передачу значений, значения больше не имеют значения, повторного использования не будет, если клиент хочет сделать то же самое, очевидно, это всегда будет новый запрос, даже если его такие же параметры передаются. И это все на стороне клиента, так что некоторые кеширование / куки и т. Д. Может быть круто в этом отношении.
JS:
HTML:
C #:
Никаких дубликатов, каждый запрос настолько уникален, насколько вы его изменили, и благодаря тому, как это структурировано, легко добавлять больше запросов динамически изнутри dom.
источник
Вот альтернативный метод, использующий встроенные свойства якорного HTML-элемента:
источник
если вы хотите установить несколько параметров одновременно:
та же функция, что и у @ amateur's
если jslint выдает ошибку, добавьте это после цикла for
источник
http://abc.def/?a&b&c
).На этой странице много неуклюжих и излишне сложных ответов. @ Amateur's с самым высоким рейтингом довольно хорош, хотя в RegExp есть немного ненужного пуха. Вот немного более оптимальное решение с более чистым RegExp и более чистым
replace
вызовом:В качестве дополнительного бонуса, если
uri
не строка, вы не получите ошибок при попытке вызватьmatch
илиreplace
что-то, что не может реализовать эти методы.И если вы хотите обработать случай хэша (и вы уже сделали проверку для правильно отформатированного HTML), вы можете использовать существующую функцию вместо написания новой функции, содержащей ту же логику:
Или вы можете внести небольшие изменения в отличный ответ @ Adam:
источник
separator
не определен вupdateQueryStringParamsNoHash
. ВupdateQueryStringParameter
, все ломается, если заменяемому параметру не присваивается значение (напримерhttp://abc.def/?a&b&c
).Это должно служить цели:
источник