Получить экранированный параметр URL - PullRequest
301 голосов
/ 10 сентября 2009

Я ищу плагин jQuery, который может получать параметры URL-адреса и поддерживать эту строку поиска без вывода ошибки JavaScript: «неправильная последовательность URI». Если не существует плагина jQuery, который поддерживает это, мне нужно знать, как изменить его для поддержки этого.

?search=%E6%F8%E5

Значение параметра URL при декодировании должно быть:

æøå

(символы норвежские).

У меня нет доступа к серверу, поэтому я ничего не могу изменить на нем.

Ответы [ 19 ]

418 голосов
/ 10 сентября 2009
function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}
294 голосов
/ 07 января 2012

Ниже приведено то, что я создал из комментариев здесь, а также исправление ошибок, не упомянутых (например, возвращение нуля, а не нуля):

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}
107 голосов
/ 01 июня 2012

Что вам действительно нужно, так это плагин jQuery URL Parser . С помощью этого плагина получение значения определенного параметра URL (для текущего URL) выглядит следующим образом:

$.url().param('foo');

Если вы хотите, чтобы объект с именами параметров в качестве ключей и значениями параметров в качестве значений, вы просто вызвали бы param() без аргумента, например:

$.url().param();

Эта библиотека также работает с другими URL-адресами, а не только с текущими:

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

Поскольку это целая библиотека для разбора URL, вы также можете получить другую информацию из URL, такую ​​как указанный порт или путь, протокол и т. Д .:

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

У него есть и другие функции, посетите домашнюю страницу , чтобы получить больше документов и примеров.

Вместо написания собственного анализатора URI для этой конкретной цели, которая своего рода работает в большинстве случаев, используйте фактический анализатор URI. В зависимости от ответа, код из других ответов может возвращать 'null' вместо null, не работает с пустыми параметрами (?foo=&bar=x), не может проанализировать и вернуть все параметры сразу, повторяет работу, если вы повторно запросить URL для параметров и т. д.

Используйте фактический парсер URI, не изобретайте свой собственный.

Для тех, кто не любит jQuery, есть версия плагина, которая является чистым JS .

43 голосов
/ 18 января 2012

Если вы не знаете, какими будут параметры URL, и хотите получить объект с ключами и значениями в параметрах, вы можете использовать это:

function getParameters() {
  var searchString = window.location.search.substring(1),
      params = searchString.split("&"),
      hash = {};

  if (searchString == "") return {};
  for (var i = 0; i < params.length; i++) {
    var val = params[i].split("=");
    hash[unescape(val[0])] = unescape(val[1]);
  }
  return hash;
}

Вызов getParameters () с URL-адресом типа /posts?date=9/10/11&author=nilbus вернет:

{
  date:   '9/10/11',
  author: 'nilbus'
}

Я не буду включать здесь код, так как он еще дальше от вопроса, но weareon.net опубликовал библиотеку, которая также позволяет манипулировать параметрами в URL:

40 голосов
/ 10 сентября 2009

Вы можете использовать собственный браузер location.search свойство:

function getParameter(paramName) {
  var searchString = window.location.search.substring(1),
      i, val, params = searchString.split("&");

  for (i=0;i<params.length;i++) {
    val = params[i].split("=");
    if (val[0] == paramName) {
      return unescape(val[1]);
    }
  }
  return null;
}

Но есть несколько плагинов jQuery, которые могут вам помочь:

26 голосов
/ 22 декабря 2011

На основании ответа 999 :

function getURLParameter(name) {
    return decodeURIComponent(
        (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
    );  
}

Изменения:

  • decodeURI() заменяется на decodeURIComponent()
  • [?|&] добавляется в начале регулярного выражения
6 голосов
/ 18 декабря 2012

Необходимо добавить параметр i, чтобы сделать его нечувствительным к регистру:

  function getURLParameter(name) {
    return decodeURIComponent(
      (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
    );
  }
2 голосов
/ 22 января 2013

Например, функция, которая возвращает значение любой переменной параметра.

function GetURLParameter(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++)
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam)
        {
            return sParameterName[1];
        }
    }
}​

И вот как вы можете использовать эту функцию, предполагая, что URL,

"http://example.com/?technology=jquery&blog=jquerybyexample".

var tech = GetURLParameter('technology');
var blog = GetURLParameter('blog');

Таким образом, в приведенном выше коде переменная «tech» будет иметь значение «jQuery», а переменная «blog» будет «jquerybyexample».

2 голосов
/ 15 ноября 2013

Вы не должны использовать jQuery для чего-то подобного!
Современный способ - использовать небольшие модули многократного использования через менеджер пакетов, такой как Bower.

Я создал крошечный модуль , который может анализировать строку запроса в объект. Используйте это так:

// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå
2 голосов
/ 24 мая 2012
$.urlParam = function(name){
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
  return (results !== null) ? results[1] : 0;
}

$.urlParam("key");
...