it-swarm.com.ru

Получить экранированный параметр URL

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

?search=%E6%F8%E5

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

æøå

(персонажи норвежские).

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

301
Sindre Sorhus

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

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

// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå
2
Sindre Sorhus
function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}
418
James

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

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}
294
radicand

Что вам действительно нужно, так это плагин 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 .

107
Lucas

Если вы не знаете, какими будут параметры 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:

43
Edward Anderson

Вы можете использовать браузер native 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, которые могут вам помочь:

40
CMS

Основано на 999 ответ :

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

Изменения:

  • decodeURI() заменяется на decodeURIComponent()
  • [?|&] добавляется в начале регулярного выражения
26
Eugene Yarmash

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

  function getURLParameter(name) {
    return decodeURIComponent(
      (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
    );
  }
6
Scott Wojan
$.urlParam = function(name){
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
  return (results !== null) ? results[1] : 0;
}

$.urlParam("key");
2
Yoshi

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

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
Rubyist

После прочтения всех ответов я получил эту версию с + второй функцией для использования параметров в качестве флагов.

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)','i').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

function isSetURLParameter(name) {
    return (new RegExp('[?|&]' + name + '(?:[=|&|#|;|]|$)','i').exec(location.search) !== null)
}
1
Neon

фрагмент кода jQuery, чтобы получить динамические переменные, хранящиеся в URL-адресе в качестве параметров, и сохранить их в виде переменных JavaScript, готовых для использования с вашими сценариями:

$.urlParam = function(name){
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (results==null){
       return null;
    }
    else{
       return results[1] || 0;
    }
}

example.com?param1=name&param2=&id=6

$.urlParam('param1'); // name
$.urlParam('id');        // 6
$.urlParam('param2');   // null

//example params with spaces
http://www.jquery4u.com?city=Gold Coast
console.log($.urlParam('city'));  
//output: Gold%20Coast

console.log(decodeURIComponent($.urlParam('city'))); 
//output: Gold Coast
0
Reza Baradaran Gazorisangi
<script type="text/javascript">
function getURLParameter(name) {
        return decodeURIComponent(
            (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
        );
    }

</script>

getURLParameter(id) или getURLParameter(Id) работает так же:)

0
user2310887

Здесь много глючного кода, и решения регулярных выражений очень медленные. Я нашел решение, которое работает в 20 раз быстрее, чем аналог регулярного выражения, и элегантно просто:

    /*
    *   @param      string      parameter to return the value of.
    *   @return     string      value of chosen parameter, if found.
    */
    function get_param(return_this)
    {
        return_this = return_this.replace(/\?/ig, "").replace(/=/ig, ""); // Globally replace illegal chars.

        var url = window.location.href;                                   // Get the URL.
        var parameters = url.substring(url.indexOf("?") + 1).split("&");  // Split by "param=value".
        var params = [];                                                  // Array to store individual values.

        for(var i = 0; i < parameters.length; i++)
            if(parameters[i].search(return_this + "=") != -1)
                return parameters[i].substring(parameters[i].indexOf("=") + 1).split("+");

        return "Parameter not found";
    }

console.log(get_param("parameterName"));

Regex не является основным и конечным решением, для этого типа проблем простое манипулирование строками может работать намного эффективнее. Источник кода .

0
George Anthony