URL — Как я могу получить значения строки запроса в JavaScript?

Обновление: сентябрь-2018

Вы можете использовать URLSearchParams, который прост и имеет хорошего браузера support Глядя на вывод

const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');

Original

Вам не нужен jQuery для этой цели. Вы можете использовать только чистый JavaScript:

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[[]]/g, '\$&');
    var regex = new RegExp('[?&]'   name   '(=([^&#]*)|&|#|$)'),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/ /g, ' '));
}

Использование:

// query string: ?foo=lorem&bar=&baz
var foo = getParameterByName('foo'); // "lorem"
var bar = getParameterByName('bar'); // "" (present with empty value)
var baz = getParameterByName('baz'); // "" (present with no value)
var qux = getParameterByName('qux'); // null (absent)

Примечание. Если параметр присутствует несколько раз (?foo=lorem&foo=ipsum), вы получите первое значение (lorem). Стандартов на этот счет нет, и использование различается, см., Например, этот вопрос: Официальная позиция дублирующего запроса HTTP GET ключи Глядя на вывод
ПРИМЕЧАНИЕ: функция чувствительна к регистру. Если вы предпочитаете имя параметра без учета регистра, добавить модификатор ‘i’ к RegExp


Это обновление на основе нового спецификации URLSearchParams , чтобы получить тот же результат более лаконично. Смотрите ответ « URLSearchParams » ниже.

Некоторые из опубликованных здесь решений неэффективны. Повторять поиск по регулярному выражению каждый раз, когда скрипту необходим доступ к параметру, совершенно не нужно, достаточно одной функции для разделения параметров на объект стиля ассоциативного массива. Если вы не работаете с HTML 5 History API, это необходимо сделать только один раз для каждой загрузки страницы. Другие предложения здесь также не в состоянии правильно декодировать URL.

var urlParams;
(window.onpopstate = function () {
    var match,
        pl     = / /g,  // Regex for replacing addition symbol with a space
        search = /([^&=] )=?([^&]*)/g,
        decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
        query  = window.location.search.substring(1);

    urlParams = {};
    while (match = search.exec(query))
       urlParams[decode(match[1])] = decode(match[2]);
})();

Пример строки запроса:

?i=main&mode=front&sid=de8d49b78a85a322c4155015fdce22c4&enc= Hello &empty

Результат:

 urlParams = {
    enc: " Hello ",
    i: "main",
    mode: "front",
    sid: "de8d49b78a85a322c4155015fdce22c4",
    empty: ""
}

alert(urlParams["mode"]);
// -> "front"

alert("empty" in urlParams);
// -> true

Это можно легко улучшить, обрабатывая строки запроса в виде массива. Примером этого является говорится, что , но параметры стиля массива не определены в {* } Тогда если вы знакомы с Настраиваемый формат даты и времени. Эта библиотека должна делать то же самое и помогать форматировать дату и время. dtmFRM Глядя на вывод

Использование ;, все, что вам нужно сделать, это передать любой из этого формата умиротворены в библиотеках key=value файла ; или & мы сравниваем две даты в javascript. Учитываются также часы, минуты и секунды. Так что, если нам нужно только сравнить только дату, это подход: ; будет работать как шарм. ; вывод будет: & … что похоже на меня. Конечно, вы должны убедиться, что обе даты не являются неопределенными …


Таким образом, мы можем гарантировать, что будет выполнено положительное сравнение, если оба они также не определены, или …

<script>var urlParams = <?php echo json_encode($_GET, JSON_HEX_TAG);?>;</script>

… если вы предпочитаете, чтобы они не были равны.

ES6 представляет

getQueryStringParams = query => {
    return query
        ? (/^[?#]/.test(query) ? query.slice(1) : query)
            .split('&')
            .reduce((params, param) => {
                    let [key, value] = param.split('=');
                    params[key] = value ? decodeURIComponent(value.replace(/ /g, ' ')) : '';
                    return params;
                }, {}
            )
        : {}
};

Без jQuery

var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length;   i)
    {
        var p=a[i].split('=', 2);
        if (p.length == 1)
            b[p[0]] = "";
        else
            b[p[0]] = decodeURIComponent(p[1].replace(/ /g, " "));
    }
    return b;
})(window.location.search.substr(1).split('&'));

http://jsfiddle.net/guhokemk/1/ ?topic=123&name=query string Метод возвращает 1, если

qs["topic"];    // 123
qs["name"];     // query string
qs["nothere"];  // undefined (object)

больше, чем

Метод возвращает 0, если getUrlParameters

function (b) {
    var c = typeof b === "undefined";
    if (a !== h && c) return a;
    for (var d = {}, b = b || k[B][vb], e = b[p]("?"), f = b[p]("#"), b = (f === -1 ? b[Ya](e   1) : [b[Ya](e   1, f - e - 1), "&", b[Ya](f   1)][K](""))[z]("&"), e = i.dd ? ia : unescape, f = 0, g = b[w]; f < g;   f) {
        var l = b[f][p]("=");
        if (l !== -1) {
            var q = b[f][I](0, l),
                l = b[f][I](l   1),
                l = l[Ca](/ /g, " ");
            try {
                d[q] = e(l)
            } catch (A) {}
        }
    }
    c && (a = d);
    return d
}

равно

Метод возвращает -1, если ? меньше # https://code.google.com/archive/p/datejs/downloads b[f][p]("=") и использует indexOf и возвращают d, что означает следующий результат:

— 1 = дата1 меньше даты2. d 0 = равны. 1 = дата1 больше даты2.


ОСТЕРЕГАЙТЕСЬ ВРЕМЕННОЙ ЗОНЕ Дата JavaScript содержит

(function($) {
    $.QueryString = (function(paramsArray) {
        let params = {};

        for (let i = 0; i < paramsArray.length;   i)
        {
            let param = paramsArray[i]
                .split('=', 2);

            if (param.length !== 2)
                continue;

            params[param[0]] = decodeURIComponent(param[1].replace(/ /g, " "));
        }

        return params;
    })(window.location.search.substr(1).split('&'))
})(jQuery);

без понятия часового пояса

//Get a param
$.QueryString.param
//-or-
$.QueryString["param"]
//This outputs something like...
//"val"

//Get all params as object
$.QueryString
//This outputs something like...
//Object { param: "val", param2: "val" }

//Set a param (only in the $.QueryString object, doesn't affect the browser's querystring)
$.QueryString.param = "newvalue"
//This doesn't output anything, it just updates the $.QueryString object

//Convert object into string suitable for url a querystring (Requires jQuery)
$.param($.QueryString)
//This outputs something like...
//"param=newvalue&param2=val"

//Update the url/querystring in the browser's location bar with the $.QueryString object
history.replaceState({}, '', "?"   $.param($.QueryString));
//-or-
history.pushState({}, '', "?"   $.param($.QueryString));

, вы хотите, чтобы ваши даты представляли полночь UTC в начале рассматриваемой даты.

Это общее и необходимое соглашение, которое позволяет вам работать с датами независимо от сезона или часового пояса их создания. Таким образом, вы должны быть очень бдительными, чтобы управлять понятием часового пояса, особенно когда вы создаете свой объект UTC Date.

var qs = window.GetQueryString(query);

var search = qs["q"];
var value = qs["value"];
var undef = qs["undefinedstring"];

В большинстве случаев вы хотите, чтобы ваша дата отражала часовой пояс пользователя.

var search = window.getParameterByName("q");
var value = window.getParameterByName("value");
var undef = window.getParameterByName("undefinedstring");

Нажмите, если сегодня ваш день рождения

  • Сплит метод : 144,780 ± 2.17 % fasttest
  • Метод Regex : 13 891 ± 0,85 % | На 90 % медленнее

URLSearchParams

Firefox 44, Opera 36, ​​Edge 17, Safari 10.3 и Chrome 49 поддерживают URLSearchParams Существует Google-предложенный

. Чтобы создавать даты из свободного текста в Javascript, вам нужно проанализировать его в объект Date (). Вы можете использовать Date.parse (), который использует свободный текст, пытается преобразовать его в новую дату, но если у вас есть контроль над страницей, я бы рекомендовал использовать вместо этого поля выбора HTML или средство выбора даты, например Управление календарем YUI

или JQuery UI Datepicker . люди указали, что вы можете использовать простую арифметику, чтобы вычесть даты и преобразовать их обратно в число дней, разделив число (в секундах) на количество секунд в дне (60 * 60 * 24 = 86400). Допустим, вы получили объекты даты A и B, получили их значение времени EPOC, а затем вычли, чтобы получить разницу в миллисекундах. Глядя на вывод

Вычитать две даты, получить разницу в миллисекундах, если вы получите ? это та же самая дата {*) } Улучшенная версия кода, опубликованная с помощью «some» .slice(1)):

let params = new URLSearchParams(location.search);

или

let params = (new URL(location)).searchParams;

Вы можете получить параметры, также используя стенографию

let url = new URL('https://example.com?foo=1&bar=2');
let params = new URLSearchParams(url.search);

объекта URL, например, так: .searchParams Вы читаете / устанавливаете параметры через

let params = new URL('https://example.com?foo=1&bar=2').searchParams;
params.get('foo'); // "1"
params.get('bar'); // "2" 

при необходимости. get(KEY), set(KEY, VALUE), append(KEY, VALUE) Дата к метке времени for (let p of params) {} Глядя на вывод

Закрытие и пример страницы Перед сравнением объект, попробуйте установить обе их миллисекунды в ноль, как

позволяет получить все части URL, включая якорь, хост и т. Д. динамически создается в javascript, если вы продолжаете печатать . Его можно использовать с или без jQuery.

Используйте этот код для сравнения даты с использованием JavaScript.

ThanksD.Jeeva

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

Вот что я сделал в одном из моих проектов, {* } вместо. Плагин jQuery отличается тем, что он фокусируется на элементах — для использования со строками просто используйте напрямую, с или без jQuery. Подобный код выглядел бы так, полные документы или этим URI Как видите, мы удаляем разделитель (и) ), а затем сравнить целые числа. говорится, что :

var url = new URI('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.protocol(); // returns 'http'
url.path(); // returns '/folder/dir/index.html'

, самого простого и удобочитаемого способа включения индексной переменной:

Быстрое, полное решение , которое обрабатывает многозначные ключи и закодированные символы Глядя на вывод

var qd = {};
if (location.search) location.search.substr(1).split("&").forEach(function(item) {var s = item.split("="), k = s[0], v = s[1] && decodeURIComponent(s[1]); (qd[k] = qd[k] || []).push(v)})

//using ES6   (23 characters cooler)
var qd = {};
if (location.search) location.search.substr(1).split`&`.forEach(item => {let [k,v] = item.split`=`; v = v && decodeURIComponent(v); (qd[k] = qd[k] || []).push(v)})

Многострочный:

var qd = {};
if (location.search) location.search.substr(1).split("&").forEach(function(item) {
    var s = item.split("="),
        k = s[0],
        v = s[1] && decodeURIComponent(s[1]); //  null-coalescing / short-circuit
    //(k in qd) ? qd[k].push(v) : qd[k] = [v]
    (qd[k] = qd[k] || []).push(v) // null-coalescing / short-circuit
})

Что весь этот код …
«null -coalescing «, оценка короткого замыкания
ES6 Уничтожение заданий , Функции стрелок , Строки шаблона

пример:

"?a=1&b=0&c=3&d&e&a=5&a=t e x t&e=http://w3schools.com/my test.asp?name=ståle&car=saab"
> qd
a: ["1", "5", "t e x t"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

> qd.a[1]    // "5"
> qd["a"][1] // "5"

Подробнее … о решении Vanilla JavaScript .

Чтобы получить доступ к различным частям URL-адреса, используйте location.(search|hash)

простейшее (фиктивное) решение

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
  • Дескрипторы пустых ключей правильно.
  • Переопределение multi-keys . Это как окно, которое вы можете открыть с помощью последнее найденное значение.
"?a=1&b=0&c=3&d&e&a=5"
> queryDict
a: "5"
b: "0"
c: "3"
d: undefined
e: undefined

многозначные ключи

Простая проверка ключей (item in dict) ? dict.item.push(val) : dict.item = [val]

var qd = {};
location.search.substr(1).split("&").forEach(function(item) {(item.split("=")[0] in qd) ? qd[item.split("=")[0]].push(item.split("=")[1]) : qd[item.split("=")[0]] = [item.split("=")[1]]})
  • Теперь возвращает массивы .
  • Доступ к значениям с помощью qd.key[index] или qd[key][index]
> qd
a: ["1", "5"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined]

кодированных символов?

Использование decodeURIComponent() для второго или оба разбиения.

var qd = {};
location.search.substr(1).split("&").forEach(function(item) {var k = item.split("=")[0], v = decodeURIComponent(item.split("=")[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v]})

пример:

"?a=1&b=0&c=3&d&e&a=5&a=t e x t&e=http://w3schools.com/my test.asp?name=ståle&car=saab"
> qd
a: ["1", "5", "t e x t"]
b: ["0"]
c: ["3"]
d: ["undefined"]  // decodeURIComponent(undefined) returns "undefined" !!!*
e: ["undefined", "http://w3schools.com/my test.asp?name=ståle&car=saab"]

Из комментариев

* !!! Обратите внимание, что decodeURIComponent(undefined) возвращает строку "undefined". Решение заключается в простом использовании &&, который гарантирует, что decodeURIComponent() не вызывается для неопределенных значений. (см. «полное решение» вверху.)

v = v && decodeURIComponent(v);

Если строка запроса пуста (location.search == ""), результат несколько вводит в заблуждение qd == {"": undefined}. Рекомендуется проверить строку запроса перед запуском функции синтаксического анализа likeso:

if (location.search) location.search.substr(1).split("&").forEach(...)

У Roshambo на snipplr.com есть простой скрипт для достижения этой цели, описанный в Получить параметры URL с помощью jQuery | Улучшенный . С его сценарием вы также легко получаете те параметры, которые вам нужны.

Вот метод gist:

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

Затем просто получите ваши параметры из строки запроса.

Таким образом, если строка URL / запроса была xyz.com/index.html?lang=de Глядя на вывод

Просто позвоните var langval = $.urlParam('lang');, и вы получите его.

UZBEKJON также написал отличную запись в блоге, Получить параметры URL Значения & amp ; с помощью jQuery Глядя на вывод

Если вы используете jQuery, вы можете использовать библиотеку, такую ​​как jQuery BBQ: кнопка Back & Amp ; Query Library Глядя на вывод

… jQuery BBQ предоставляет полный аргумент .deparam(), наряду с методами управления состоянием хеш-функции, утилитами разбора фрагментов / запросов и утилитами слияния.

Редактировать: пример добавления примера:

 var DeparamExample = function() {
            var params = $.deparam.querystring();

            //nameofparam is the name of a param from url
            //code below will get param if ajax refresh with hash
            if (typeof params.nameofparam == 'undefined') {
                params = jQuery.deparam.fragment(window.location.href);
            }
            
            if (typeof params.nameofparam != 'undefined') {
                var paramValue = params.nameofparam.toString();
                  
            }
        };

Если вы хотите просто использовать простой JavaScript, вы можете использовать …

var getParamValue = (function() {
    var params;
    var resetParams = function() {
            var query = window.location.search;
            var regex = /[?&;](. ?)=([^&;] )/g;
            var match;

            params = {};

            if (query) {
                while (match = regex.exec(query)) {
                    params[match[1]] = decodeURIComponent(match[2]);
                }
            }    
        };

    window.addEventListener
    && window.addEventListener('popstate', resetParams);

    resetParams();

    return function(param) {
        return params.hasOwnProperty(param) ? params[param] : null;
    }

})();​

выполняет итерацию только по history.pushState() и history.replaceState() ). Для простых объектов и литералов объектов любой из этих методов будет работать нормально.

Как правило, все описанные методы имеют одинаковое поведение с любыми предоставленными объектами. Помимо использования нативного

обычно быстрее :

function get(n) {
    var half = location.search.split(n   '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

, эти методы значительно проще в использовании, требуют меньше кодирования и обеспечивают лучшую обработку ошибок. В ECMAScript 5 у вас есть новый подход в полях итераций литерала —

JsPerf Мой выбор ниже в качестве более быстрого решения в текущих версиях браузеров (Chrome30, IE10, FF25) ).

function get(n) {
    var half = location.search.split('&'   n   '=')[1];
    if (!half) half = location.search.split('?'   n   '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

jsperf.com

или Поддержка браузера, которую вы можете увидеть в { *} Вот мой опыт превращения превосходного решения Энди Э в полноценный плагин jQuery:

    function getQueryStringValueByName(name) {
        var queryStringFromStartOfValue = location.search.split(name   '=')[1];
         return queryStringFromStartOfValue !== undefined ? queryStringFromStartOfValue.split('&')[0] : null;

Синтаксис:

;(function ($) {
    $.extend({      
        getQueryString: function (name) {           
            function parseParams() {
                var params = {},
                    e,
                    a = / /g,  // Regex for replacing addition symbol with a space
                    r = /([^&=] )=?([^&]*)/g,
                    d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
                    q = window.location.search.substring(1);

                while (e = r.exec(q))
                    params[d(e[1])] = d(e[2]);

                return params;
            }

            if (!this.queryStringParams)
                this.queryStringParams = parseParams(); 

            return this.queryStringParams[name];
        }
    });
})(jQuery);

простой

var someVar = $.getQueryString('myParam');

полный

полезным. Это библиотека для • манипулирует URL-адресами — и поставляется со всеми прибамбасами. (Извините за саморекламу здесь) напрямую, с или без jQuery. Подобный код выглядел бы так, полные документы для преобразования строки запроса в карту:

(URI.js также «исправляет» плохие строки запроса, такие как

var data = URI('?foo=bar&bar=baz&foo=world').query(true);
data == {
  "foo": ["bar", "world"],
  "bar": "baz"
}

(URI.js также «исправляет» некорректные строки запросов, такие как ?&foo&&bar=baz&?foo&bar=baz С чем вы столкнулись

Обратите внимание, что не будет принимать значение свойства, это всего лишь значение индекса. Предисловие:

Свойства объекта могут быть

(свойство находится на самом объекте) или

if (!window.location.getParameter ) {
  window.location.getParameter = function(key) {
    function parseParams() {
        var params = {},
            e,
            a = / /g,  // Regex for replacing addition symbol with a space
            r = /([^&=] )=?([^&]*)/g,
            d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
            q = window.location.search.substring(1);

        while (e = r.exec(q))
            params[d(e[1])] = d(e[2]);

        return params;
    }

    if (!this.queryStringParams)
        this.queryStringParams = parseParams(); 

    return this.queryStringParams[key];
  };
}

унаследовано (не о самом объекте, ни об одном из его прототипов). {* } enumerable Глядя на вывод

$ _ GET : Для строки запроса

function get_query(){
    var url = location.search;
    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]] = decodeURIComponent(qs[i][1]);
    }
    return result;
}

Использование:

var $_GET = get_query();

это возвращает объект: x=5&y&z=hello&x=6 [

{
  x: "6",
  y: undefined,
  z: "hello"
}

Все это отличные ответы, но мне нужно что-то более надежное, и я подумал, что вам всем может понравиться то, что я создал.

function qs(key) {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?')   1).split('&');
    for(var i = 0; i < hashes.length; i  )
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars[key];
}

spec

var result = qs('someKey');

Это простой библиотечный метод, который выполняет анализ и манипулирование параметрами URL. Статический метод имеет следующие вспомогательные методы, которые могут быть вызваны на URL-адресе субъекта:

getHost

  • getPath
  • setHash
  • ] — функция, предоставляющая массив имен свойств объекта
  • getParams
  • setParam
  • , имена которых являются строками.
  • getParam
  • removeParam
  • ] — функция, предоставляющая массив
  • значений

Пример:

URLParser(url).getParam('myparam1')

var url = "http://www.test.com/folder/mypage.html?myparam1=1&myparam2=2#something";

function URLParser(u){
    var path="",query="",hash="",params;
    if(u.indexOf("#") > 0){
        hash = u.substr(u.indexOf("#")   1);
        u = u.substr(0 , u.indexOf("#"));
    }
    if(u.indexOf("?") > 0){
        path = u.substr(0 , u.indexOf("?"));
        query = u.substr(u.indexOf("?")   1);
        params= query.split('&');
    }else
        path = u;
    return {
        getHost: function(){
            var hostexp = ///([w.-]*)/;
            var match = hostexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getPath: function(){
            var pathexp = ///[w.-]*(?:/([^?]*))/;
            var match = pathexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getHash: function(){
            return hash;
        },
        getParams: function(){
            return params
        },
        getQuery: function(){
            return query;
        },
        setHash: function(value){
            if(query.length > 0)
                query = "?"   query;
            if(value.length > 0)
                query = query   "#"   value;
            return path   query;
        },
        setParam: function(name, value){
            if(!params){
                params= new Array();
            }
            params.push(name   '='   value);
            for (var i = 0; i < params.length; i  ) {
                if(query.length > 0)
                    query  = "&";
                query  = params[i];
            }
            if(query.length > 0)
                query = "?"   query;
            if(hash.length > 0)
                query = query   "#"   hash;
            return path   query;
        },
        getParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i  ) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return decodeURIComponent(pair[1]);
                }
            }
            console.log('Query variable %s not found', name);
        },
        hasParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i  ) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return true;
                }
            }
            console.log('Query variable %s not found', name);
        },
        removeParam: function(name){
            query = "";
            if(params){
                var newparams = new Array();
                for (var i = 0;i < params.length;i  ) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) != name)
                          newparams .push(params[i]);
                }
                params = newparams;
                for (var i = 0; i < params.length; i  ) {
                    if(query.length > 0)
                        query  = "&";
                    query  = params[i];
                }
            }
            if(query.length > 0)
                query = "?"   query;
            if(hash.length > 0)
                query = query   "#"   hash;
            return path   query;
        },
    }
}


document.write("Host: "   URLParser(url).getHost()   '<br>');
document.write("Path: "   URLParser(url).getPath()   '<br>');
document.write("Query: "   URLParser(url).getQuery()   '<br>');
document.write("Hash: "   URLParser(url).getHash()   '<br>');
document.write("Params Array: "   URLParser(url).getParams()   '<br>');
document.write("Param: "   URLParser(url).getParam('myparam1')   '<br>');
document.write("Has Param: "   URLParser(url).hasParam('myparam1')   '<br>');

document.write(url   '<br>');

// Remove the first parameter
url = URLParser(url).removeParam('myparam1');
document.write(url   ' - Remove the first parameter<br>');

// Add a third parameter
url = URLParser(url).setParam('myparam3',3);
document.write(url   ' - Add a third parameter<br>');

// Remove the second parameter
url = URLParser(url).removeParam('myparam2');
document.write(url   ' - Remove the second parameter<br>');

// Add a hash
url = URLParser(url).setHash('newhash');
document.write(url   ' - Set Hash<br>');

// Remove the last parameter
url = URLParser(url).removeParam('myparam3');
document.write(url   ' - Remove the last parameter<br>');

// Remove a parameter that doesn't exist
url = URLParser(url).removeParam('myparam3');
document.write(url   ' - Remove a parameter that doesn"t exist<br>');

Показать его!

var a = location.search&&location.search.substr(1).replace(/ /gi," ").split("&");
for (var i in a) {
    var s = a[i].split("=");
    a[i]  = a[unescape(s[0])] = unescape(s[1]);
}

свойства.

for (i in a) {
    document.write(i   ":"   a[i]   "<br/>");   
};

отображает test.htm?i=can&has=cheezburger Мне кажется, проще и эффективнее прочитать строку запроса один раз в моем приложении и построить объект из всех пар ключ / значение, например:

0:can
1:cheezburger
i:can
has:cheezburger

] — Функция, предоставляющая массив имен

Для таких URL, как

var search = function() {
  var s = window.location.search.substr(1),
    p = s.split(/&/), l = p.length, kv, r = {};
  if (l === 0) {return false;}
  while (l--) {
    kv = p[l].split(/=/);
    r[kv[0]] = decodeURIComponent(kv[1] || '') || true;
  }
  return r;
}();

, вы можете получить их значение позже в своем коде как http://domain.com?param1=val1&param2=val2 объекта (каждая запись в массиве является search.param1 и search.param2 Глядя на вывод

function GET() {
        var data = [];
        for(x = 0; x < arguments.length;   x)
            data.push(location.href.match(new RegExp("/?".concat(arguments[x],"=","([^n&]*)")))[1])
                return data;
    }


example:
data = GET("id","name","foo");
query string : ?id=3&name=jet&foo=b
returns:
    data[0] // 3
    data[1] // jet
    data[2] // b
or
    alert(GET("id")[0]) // return 3

Обратите внимание, что массив). Вот мое редактирование

// get an array with all querystring values
// example: var valor = getUrlVars()["valor"];
function getUrlVars() {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?')   1).split('&');
    for (var i = 0; i < hashes.length; i  ) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

— с добавленной возможностью анализировать строки запроса с ключами без значений.

свойства (даже не перечисляемые), чьи имена являются строками. ВАЖНЫЙ! Параметр для этой функции в последней строке отличается. Это просто пример того, как можно передать ему произвольный URL. Вы можете использовать последнюю строку из ответа Бруно, чтобы проанализировать текущий URL.

var url = 'http://sb.com/reg/step1?param';
var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length;   i) {
        var p=a[i].split('=', 2);
        if (p[1]) p[1] = decodeURIComponent(p[1].replace(/ /g, " "));
        b[p[0]] = p[1];
    }
    return b;
})((url.split('?'))[1].split('&'));

результаты будут такими же. Но со свойствами url (даже не перечисляемыми), имена которых являются символами.

Решение Бруно возвращает объект без ключей, в то время как мое возвращает объект со значением ключа http://sb.com/reg/step1?param=результаты будут такими же. Но со свойствами url http://sb.com/reg/step1?param Решение Бруно возвращает объект без ключей, в то время как мое возвращает объект со значением ключа param и undefined.

Мне нужен объект из строки запроса, и я ненавижу много кода. Возможно, он не самый надежный во вселенной, но это всего лишь несколько строк кода.

var q = {};
location.href.split('?')[1].split('&').forEach(function(i){
    q[i.split('=')[0]]=i.split('=')[1];
});

URL типа this.htm?hello=world&foo=bar создаст:

{hello:'world', foo:'bar'}

Это функция, которую я создал некоторое время назад, и я вполне доволен. Это не чувствительно к регистру — что удобно. Также, если запрошенный QS не существует, он просто возвращает пустую строку.

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

Я уверен, что это можно оптимизировать или сделать иначе, чтобы работать быстрее, но это всегда отлично работало для того, что мне нужно.

Наслаждайтесь.

function getQSP(sName, sURL) {
    var theItmToRtn = "";
    var theSrchStrg = location.search;
    if (sURL) theSrchStrg = sURL;
    var sOrig = theSrchStrg;
    theSrchStrg = theSrchStrg.toUpperCase();
    sName = sName.toUpperCase();
    theSrchStrg = theSrchStrg.replace("?", "&") theSrchStrg = theSrchStrg   "&";
    var theSrchToken = "&"   sName   "=";
    if (theSrchStrg.indexOf(theSrchToken) != -1) {
        var theSrchTokenLth = theSrchToken.length;
        var theSrchTokenLocStart = theSrchStrg.indexOf(theSrchToken)   theSrchTokenLth;
        var theLocOfNextAndSign = theSrchStrg.indexOf("&", theSrchTokenLocStart);
        theItmToRtn = unescape(sOrig.substring(theSrchTokenLocStart, theLocOfNextAndSign));
    }
    return unescape(theItmToRtn);
}

Вот расширенная версия связанной версии «Обрабатывать строки запроса в стиле массива» Энди Е. Исправлена ​​ошибка (?key=1&key[]=2&key[]=3 ; 1 Теряется и заменяется на [2,3]), сделали несколько незначительных улучшений производительности (перекодирование значений, пересчет позиции «[» и т. д.) и добавили количество улучшений (функционализировано, поддержка ?key=1&key=2, поддержка ; разделителей). Я оставил переменные раздражающе короткими, но добавил много комментариев, чтобы сделать их читабельными (о, и я снова использовал v Примеры:

? Test = Hello & Amp ; person = neek & Amp ; person [] = Джеф & {амп ***} человек [] = джим & {амп ***} человек [экстра] = джон & {амп ***} test3 & {амп ***} nocache = 1398914891264

цикл, но вы можете использовать любую конструкцию цикла)

{
    "test": "Hello",
    "person": {
        "0": "neek",
        "1": "jeff",
        "2": "jim",
        "length": 3,
        "extra": "john"
    },
    "test3": "",
    "nocache": "1398914891264"
}

, поскольку ключ является идентифицируемым и действительным (по крайней мере, в dotNet person=neek&person[]=jeff&person[]=jim или person=neek&person=jeff&person=jim NameValueCollection.Add , если указанный ключ уже существует в целевом экземпляре NameValueCollection указанное значение добавляется в существующий список значений, разделенных запятыми, в виде «значение1, значение2, значение3». ):

Все свойства

, включая унаследованные не перечисляемые: Поскольку es2015 становится все более популярным, я публикую этот ответ, который включает в себя использование генератора и итератора для плавного перебора пар. Как это возможно в других языках, например, Ruby. Хорошо, вот код: Надеюсь, это помогло кому-то.

РЕДАКТИРОВАТЬ:

getQueryStringKey = function(key) {
    return getQueryStringAsObject()[key];
};


getQueryStringAsObject = function() {
    var b, cv, e, k, ma, sk, v, r = {},
        d = function (v) { return decodeURIComponent(v).replace(/ /g, " "); }, //# d(ecode) the v(alue)
        q = window.location.search.substring(1), //# suggested: q = decodeURIComponent(window.location.search.substring(1)),
        s = /([^&;=] )=?([^&;]*)/g //# original regex that does not allow for ; as a delimiter:   /([^&=] )=?([^&]*)/g
    ;

    //# ma(make array) out of the v(alue)
    ma = function(v) {
        //# If the passed v(alue) hasn't been setup as an object
        if (typeof v != "object") {
            //# Grab the cv(current value) then setup the v(alue) as an object
            cv = v;
            v = {};
            v.length = 0;

            //# If there was a cv(current value), .push it into the new v(alue)'s array
            //#     NOTE: This may or may not be 100% logical to do... but it's better than loosing the original value
            if (cv) { Array.prototype.push.call(v, cv); }
        }
        return v;
    };

    //# While we still have key-value e(ntries) from the q(uerystring) via the s(earch regex)...
    while (e = s.exec(q)) { //# while((e = s.exec(q)) !== null) {
        //# Collect the open b(racket) location (if any) then set the d(ecoded) v(alue) from the above split key-value e(ntry) 
        b = e[1].indexOf("[");
        v = d(e[2]);

        //# As long as this is NOT a hash[]-style key-value e(ntry)
        if (b < 0) { //# b == "-1"
            //# d(ecode) the simple k(ey)
            k = d(e[1]);

            //# If the k(ey) already exists
            if (r[k]) {
                //# ma(make array) out of the k(ey) then .push the v(alue) into the k(ey)'s array in the r(eturn value)
                r[k] = ma(r[k]);
                Array.prototype.push.call(r[k], v);
            }
            //# Else this is a new k(ey), so just add the k(ey)/v(alue) into the r(eturn value)
            else {
                r[k] = v;
            }
        }
        //# Else we've got ourselves a hash[]-style key-value e(ntry) 
        else {
            //# Collect the d(ecoded) k(ey) and the d(ecoded) sk(sub-key) based on the b(racket) locations
            k = d(e[1].slice(0, b));
            sk = d(e[1].slice(b   1, e[1].indexOf("]", b)));

            //# ma(make array) out of the k(ey) 
            r[k] = ma(r[k]);

            //# If we have a sk(sub-key), plug the v(alue) into it
            if (sk) { r[k][sk] = v; }
            //# Else .push the v(alue) into the k(ey)'s array
            else { Array.prototype.push.call(r[k], v); }
        }
    }

    //# Return the r(eturn value)
    return r;
};

ES2017 будет включать в себя , который сделает итерацию по пары в объектах еще проще. Теперь известно, что он будет частью стандарта в соответствии с

var name = Arg.get("name");

ts39

var params = Arg.all();

информацией о сцене. ?query=true и #hash=true page Arg.query() и Arg.hash() После просмотра всех ответов здесь hasOwnProperty не требуется для моего собственного использования, потому что мой объект json чистый ;, действительно нет никакого смысла добавлять какую-либо дополнительную обработку javascript. Это все, что я использую:

Проблема с главным ответом на этот вопрос заключается в том, что это неподдерживаемые параметры, помещенные после #, но иногда необходимо также получить это значение.

, который я изменил, чтобы он мог анализировать полную строку запроса со знаком хеша:

var getQueryStringData = function(name) {
    var result = null;
    var regexS = "[\?&#]"   name   "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec('?'   window.location.href.split('?')[1]);
    if (results != null) {
        result = decodeURIComponent(results[1].replace(/ /g, " "));
    }
    return result;
};
function GetQueryStringParams(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://dummy.com/?stringtext=jquery&stringword=jquerybyexample

var tech = GetQueryStringParams('stringtext');
var blog = GetQueryStringParams('stringword');
http://someurl.com?key=value&keynovalue&keyemptyvalue=&&keynovalue=nowhasvalue#somehash
  • обычную пару ключ / значение (?param=value С чем вы столкнулись
  • Ключи без значения (?param, который должен пропускать цепочку прототипов
  • свойства: ?param= Интересно, что люди в этих ответах касались обоих
  • , но никогда не комбинировали их: ?param=1&param=2 С чем вы столкнулись
  • Вы не можете просто ?&& код

потому что это не итератор, и

  • var queryString = window.location.search || '';
    var keyValPairs = [];
    var params      = {};
    queryString     = queryString.substr(1);
    
    if (queryString.length)
    {
       keyValPairs = queryString.split('&');
       for (pairNum in keyValPairs)
       {
          var key = keyValPairs[pairNum].split('=')[0];
          if (!key.length) continue;
          if (typeof params[key] === 'undefined')
             params[key] = [];
          params[key].push(keyValPairs[pairNum].split('=')[1]);
       }
    }
    

вывод

  • params['key'];  // returns an array of values (1..n)
    

ужасно / неэффективно.

  • key            ["value"]
    keyemptyvalue  [""]
    keynovalue     [undefined, "nowhasvalue"]
    

, несколько абзацев под большой таблицей в начале этого раздела), где говорится:

(с или без проверки

), поскольку это также немного грязно, поэтому, кроме моего ответа выше, я здесь, чтобы сказать …

извлечение конкретного параметра / ключа:

DEMO

query.get('param');

и тонны больше … проверьте ссылку на github для большего количества примеров.

var storage = query.build();
console.log(storage.param);

Особенности

Кэширование как для декодирования, так и для параметров

  1. Поддерживает строки хеш-запросов
  2. . Поддерживает передачу пользовательских запросов #hello?page=3
  3. Поддерживает параметры Array / Object
  4. Теперь вы можете просто вызывать ее как обычную функцию, больше ничего не влияет user[]="jim"&user[]="bob"
  5. Поддерживает повторяющиеся параметры &&
  6. Добро пожаловать в будущее. name&hello="world"
  7. Object.keys (obj): Array param=1&param=2
  8. извлекает все строковые ключи всех перечисляемых собственных (не наследуемых) свойств. 4kb
  9. , поэтому он дает тот же список ключей, что и вы, проверяя каждый ключ объекта с помощью hasOwnProperty. Вам не нужна эта дополнительная тестовая операция, а

должен быть быстрее. Давайте докажем это: url Подход Object.keys занял 40.21101451665163 миллисекунд. для JavaScript на стороне сервера) или использует «Polyfill». Polyfill для этой функциональности, однако, тривиален, и, поскольку он делает код более легким для чтения, его стоит включить в Polyfill. :

var url = require('url');

url.parse('http://example.com/?bob=123', true).query;

// returns { "bob": "123" }

http://codepen.io/dsheiko/pen/JdrqXa Вы можете использовать

Метод URL , он довольно широко применяется практически во всех новых браузерах, и если код будет работать в старом браузере, вы можете использовать URL , он довольно широко применяется практически во всех новых браузерах, и если код будет работать в старом браузере, вы можете использовать полифилл, подобный этому . Вот пример кода о том, как использовать интерфейс URL для получения параметров запроса (он же параметры поиска)

const url = new URL('http://example.com/?bob=123');
url.searchParams.get('bob'); 

Вы также можете использовать для него URLSearchParams, здесь есть функция Для тех, кому не нравится « for … in

var paramsString = "q=URLUtils.searchParams&topic=api";
var searchParams = new URLSearchParams(paramsString);

//Iterate the search parameters.
for (let p of searchParams) {
  console.log(p);
}

searchParams.has("topic") === true; // true
searchParams.get("topic") === "api"; // true
searchParams.getAll("topic"); // ["api"]
searchParams.get("foo") === null; // true
searchParams.append("topic", "webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=api&topic=webdev"
searchParams.set("topic", "More webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=More webdev"
searchParams.delete("topic");
searchParams.toString(); // "q=URLUtils.searchParams"

» — метод :

var qs = window.location.search.replace('?','').split('&'),
    request = {};
$.each(qs, function(i,v) {
    var initial, pair = v.split('=');
    if(initial = request[pair[0]]){
        if(!$.isArray(initial)) {
            request[pair[0]] = [initial]
        }
        request[pair[0]].push(pair[1]);
    } else {
        request[pair[0]] = pair[1];
    }
    return;
});
console.log(request);

Если вы не хотите конфликтовать с другими методами forEach, вы можете назвать его своим уникальным именем.

alert(request.q)

только код JavaScript без зависимостей: Циклы могут быть довольно интересными при использовании чистого JavaScript. Похоже, что только ECMA6 (новая спецификация JavaScript 2015) получила контроль над циклами. К сожалению, пока я пишу это, браузеры и популярная интегрированная среда разработки (IDE) все еще пытаются полностью поддержать новые навороты. Глядя на вывод

Кроме того, я знаю, что этот вопрос выходит за рамки этого вопроса, но в 2011 году ECMAScript 5.1 добавил

метод только для массивов, который в основном создал новый улучшенный способ циклического перемещения по массивам, при этом оставляя не повторяемые объекты со старым многословным и запутанным циклом

arr[]=10&arr[]=20&arr[]=100

или

hash[key1]=hello&hash[key2]=moto&a=How are you

jQuery.toQueryParams = function(str, separator) {
    separator = separator || '&'
    var obj = {}
    if (str.length == 0)
        return obj
    var c = str.substr(0,1)
    var s = c=='?' || c=='#'  ? str.substr(1) : str; 

    var a = s.split(separator)
    for (var i=0; i<a.length; i  ) {
        var p = a[i].indexOf('=')
        if (p < 0) {
            obj[a[i]] = ''
            continue
        }
        var k = decodeURIComponent(a[i].substr(0,p)),
            v = decodeURIComponent(a[i].substr(p 1))

        var bps = k.indexOf('[')
        if (bps < 0) {
            obj[k] = v
            continue;
        } 

        var bpe = k.substr(bps 1).indexOf(']')
        if (bpe < 0) {
            obj[k] = v
            continue;
        }

        var bpv = k.substr(bps 1, bps bpe-1)
        var k = k.substr(0,bps)
        if (bpv.length <= 0) {
            if (typeof(obj[k]) != 'object') obj[k] = []
            obj[k].push(v)
        } else {
            if (typeof(obj[k]) != 'object') obj[k] = {}
            obj[k][bpv] = v
        }
    }
    return obj;

}

метод не поддерживает

/**
 * Examples:
 * getUrlParams()['myparam']    // url defaults to the current page
 * getUrlParams(url)['myparam'] // url can be just a query string
 *
 * Results of calling `getUrlParams(url)['myparam']` with various urls:
 * example.com                               (undefined)
 * example.com?                              (undefined)
 * example.com?myparam                       (empty string)
 * example.com?myparam=                      (empty string)
 * example.com?myparam=0                     (the string '0')
 * example.com?myparam=0&myparam=override    (the string 'override')
 *
 * Origin: http://stackoverflow.com/a/23946023/2407309
 */
function getUrlParams (url) {
    var urlParams = {} // return value
    var queryString = getQueryString()
    if (queryString) {
        var keyValuePairs = queryString.split('&')
        for (var i = 0; i < keyValuePairs.length; i  ) {
            var keyValuePair = keyValuePairs[i].split('=')
            var paramName = keyValuePair[0]
            var paramValue = keyValuePair[1] || ''
            urlParams[paramName] = decodeURIComponent(paramValue.replace(/ /g, ' '))
        }
    }
    return urlParams // functions below
    function getQueryString () {
        var reducedUrl = url || window.location.search
        reducedUrl = reducedUrl.split('#')[0] // Discard fragment identifier.
        var queryString = reducedUrl.split('?')[1]
        if (!queryString) {
            if (reducedUrl.search('=') !== false) { // URL is a query string.
                queryString = reducedUrl
            }
        }
        return queryString
    } // getQueryString
} // getUrlParams

По сути, в 2011 году не было реального надежного способа зацикливания в JavaScript, кроме того, что многие популярные библиотеки (jQuery, Underscore и т. Д.) Решили повторно реализовать.

Начиная с 2015 года, теперь у нас есть лучший способ зацикливания (и разбиения) любого типа объекта (включая массивы и строки). Вот как в конечном итоге будет выглядеть цикл в JavaScript, когда рекомендация станет основной: split() Обратите внимание, что большинство браузеров не поддерживают приведенный выше код по состоянию на 18 июня 2016 года. Даже в Chrome вам нужно включить этот специальный флаг, чтобы он работал:

function getUrlParams() {
    var result = {};
    var params = (window.location.search.split('?')[1] || '').split('&');
    for(var param in params) {
        if (params.hasOwnProperty(param)) {
            var paramParts = params[param].split('=');
            result[paramParts[0]] = decodeURIComponent(paramParts[1] || "");
        }
    }
    return result;
}

Пока это не станет новым стандартом, старый метод все еще может использоваться, но в популярных библиотеках есть альтернативы или даже

Облегченные альтернативы

для тех, кто не использует ни одну из этих библиотек.

function qs(a){
 if(!a)return {};
 a=a.split('#')[0].split('&');
 var b=a.length,c={},d,k,v;
 while(b--){
  d=a[b].split('=');
  k=d[0].replace('[]',''),v=decodeURIComponent(d[1]||'');
  c[k]?typeof c[k]==='string'?(c[k]=[v,c[k]]):(c[k].unshift(v)):c[k]=v;
 }
 return c
}

Учитывая ES6, я бы хотел добавить собственную ложку сахара и предоставить еще один подход для перебора свойств объекта.

итерируемый

  1. просто из коробки, мы не можем использовать цикл для перебора его содержимого. Но никто не может остановить нас С чем вы столкнулись
  2. ключ = значение Давайте создадим объект С чем вы столкнулись
  3. Или, если вы знаете мощь ключа ES6 , так что вы наверняка можете сделать приведенный выше код намного короче. {* * } Hash ( С чем вы столкнулись
  4. разделенный хэш-тег хеш-тег разделенным С чем вы столкнулись

Примечания:

Он не поддерживает массивы объектов (ключ [ключ] = значение)

Если Пространство это остается.

Добавить .replace(/ /g, " "), если вам нужно.

Использование:

qs('array[]=1&array[]=2&key=value&empty=&empty2#hash')

Возврат:

{
    "empty": "",
    "key": "value",
    "array": [
        "1",
        "2"
    ]
}

Демо:

http://jsfiddle.net/ZQMrt/1/

Информация

Если вы чего-то не понимаете или не можете прочитать функцию, просто спросите. Я счастлив объяснить, что я здесь сделал.

Если вы считаете, что функция нечитаема и не поддерживается, я с радостью переписываю эту функцию для вас, но учтите, что сокращенные операторы & Amp ; побитовые всегда быстрее стандартного синтаксиса (возможно, читайте о сокращенные и побитовые операторы в книге ECMA-262 или используйте ваш любимый поисковик). Переписывание кода в стандартном читаемом синтаксисе означает потерю производительности.

Этот работает нормально

function getQuerystring(key) {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i = 0; i < vars.length; i  ) {
        var pair = vars[i].split("=");
        if (pair[0] == key) {
            return pair[1];
        }
    }
}

, взятом из говорится, что

Эта функция преобразует строку запроса в JSON-подобный объект, а также обрабатывает бессмысленные и многозначные параметры:

"use strict";
function getQuerystringData(name) {
    var data = { };
    var parameters = window.location.search.substring(1).split("&");
    for (var i = 0, j = parameters.length; i < j; i  ) {
        var parameter = parameters[i].split("=");
        var parameterName = decodeURIComponent(parameter[0]);
        var parameterValue = typeof parameter[1] === "undefined" ? parameter[1] : decodeURIComponent(parameter[1]);
        var dataType = typeof data[parameterName];
        if (dataType === "undefined") {
            data[parameterName] = parameterValue;
        } else if (dataType === "array") {
            data[parameterName].push(parameterValue);
        } else {
            data[parameterName] = [data[parameterName]];
            data[parameterName].push(parameterValue);
        }
    }
    return typeof name === "string" ? data[name] : data;
}

Мы выполняем проверку для undefined в parameter[1], потому что decodeURIComponent возвращает строку «undefined», если переменная также undefined, и это неправильно.

Использование:

"use strict";
var data = getQuerystringData();
var parameterValue = getQuerystringData("parameterName");

следующий код создаст объект, который имеет два метода:

  1. isKeyExist: проверить, существует ли определенный параметр
  2. getValue: получить значение определенного параметр.
var QSParam = new function() {
       var qsParm = {};
       var query = window.location.search.substring(1);
       var params = query.split('&');
       for (var i = 0; i < params.length; i  ) {
           var pos = params[i].indexOf('=');
           if (pos > 0) {
               var key = params[i].substring(0, pos);
               var val = params[i].substring(pos   1);
               qsParm[key] = val;
           }
       }
       this.isKeyExist = function(query){
           if(qsParm[query]){
               return true;
           }
           else{
              return false;
           }
       };
       this.getValue = function(query){
           if(qsParm[query])
           {
               return qsParm[query];
           }
           throw "URL does not contain query "  query;
       }
};

Я использовал этот код (JavaScript), чтобы получить то, что передается через URL:

function getUrlVars() {
            var vars = {};
            var parts = window.location.href.replace(/[?&] ([^=&] )=([^&]*)/gi, function(m,key,value) {
                vars[key] = value;
            });
            return vars;
        }

Затем, чтобы присвоить значение переменная, вам нужно только указать, какой параметр вы хотите получить, т.е. если URL example.com/?I=1&p=2&f=3

Вы можете сделать это, чтобы получить значения:

var getI = getUrlVars()["I"];
var getP = getUrlVars()["p"];
var getF = getUrlVars()["f"];

тогда значения будут:

getI = 1, getP = 2 and getF = 3

Попробуйте:

String.prototype.getValueByKey = function(k){
    var p = new RegExp('\b' k '\b','gi');
    return this.search(p) != -1 ? decodeURIComponent(this.substr(this.search(p) k.length 1).substr(0,this.substr(this.search(p) k.length 1).search(/(&|;|$)/))) : "";
};

Затем назовите его так:

if(location.search != "") location.search.getValueByKey("id");

Вы можете использовать это для куки также:

if(navigator.cookieEnabled) document.cookie.getValueByKey("username");

Это работает только для строк, которые имеют key=value[&|;|$] … не будет работать с объектами / массивами.

для этого, вы можете передать флаг: { *} Вот как: не не хочу использовать String.prototype … переместите его в функцию и передайте строку в качестве аргумента

Вот мой собственный взгляд на это. Эта первая функция декодирует строку URL в объект пар имя / значение:

url_args_decode = function (url) {
  var args_enc, el, i, nameval, ret;
  ret = {};
  // use the DOM to parse the URL via an 'a' element
  el = document.createElement("a");
  el.href = url;
  // strip off initial ? on search and split
  args_enc = el.search.substring(1).split('&');
  for (i = 0; i < args_enc.length; i  ) {
    // convert   into space, split on =, and then decode 
    args_enc[i].replace(/ /g, ' ');
    nameval = args_enc[i].split('=', 2);
    ret[decodeURIComponent(nameval[0])]=decodeURIComponent(nameval[1]);
  }
  return ret;
};

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

url_args_replace = function (url, args) {
  var args_enc, el, name;
  // use the DOM to parse the URL via an 'a' element
  el = document.createElement("a");
  el.href = url;
  args_enc = [];
  // encode args to go into url
  for (name in args) {
    if (args.hasOwnProperty(name)) {
      name = encodeURIComponent(name);
      args[name] = encodeURIComponent(args[name]);
      args_enc.push(name   '='   args[name]);
    }
  }
  if (args_enc.length > 0) {
    el.search = '?'   args_enc.join('&');
  } else {
    el.search = '';
  }
  return el.href;
};

Следующая функция возвращает объектную версию вашего queryString. Вы можете просто написать obj.key1 и obj.key2, чтобы получить доступ к значениям key1 и key2 в параметре.

function getQueryStringObject()
{
    var querystring = document.location.search.replace('?','').split( '&' );
    var objQueryString={};
    var key="",val="";
    if(typeof querystring == 'undefined')
    {
        return (typeof querystring);
    }
    for(i=0;i<querystring.length;i  )
    {
        key=querystring[i].split("=")[0];
        val=querystring[i].split("=")[1];
        objQueryString[key] = val;
    }
    return objQueryString;
}

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

var obj= getQueryStringObject();
alert(obj.key1);

я создал небольшую библиотеку URL для своих нужд здесь: https : //github.com/Mikhus/jsurl

Это более распространенный способ манипулирования URL в JavaScript. Между тем он действительно легкий (минимизированный и сжатый & Lt ; 1 КБ) и имеет очень простой и понятный API. И для работы не нужна никакая другая библиотека.

Что касается первоначального вопроса, это очень просто сделать:

var u = new Url; // Current document URL
// or
var u = new Url('http://user:pass@example.com:8080/some/path?foo=bar&bar=baz#anchor');

// Looking for query string parameters
alert( u.query.bar);
alert( u.query.foo);

// Modifying query string parameters
u.query.foo = 'bla';
u.query.woo = ['hi', 'hey']

alert(u.query.foo);
alert(u.query.woo);
alert(u);

Я взял этот ответ и добавил поддержку для необязательной передачи URL-адреса в качестве параметра ; обратно в window.location .поиск. Очевидно, что это полезно для получения параметров строки запроса из URL-адресов, которые не являются текущей страницей:

(function($, undef) {
  $.QueryString = function(url) {
    var pairs, qs = null, index, map = {};
    if(url == undef){
      qs = window.location.search.substr(1);
    }else{
      index = url.indexOf('?');
      if(index == -1) return {};
      qs = url.substring(index 1);
    }
    pairs = qs.split('&');
    if (pairs == "") return {};
    for (var i = 0; i < pairs.length;   i)
    {
      var p = pairs[i].split('=');
      if(p.length != 2) continue;
      map[p[0]] = decodeURIComponent(p[1].replace(/ /g, " "));
    }
    return map;
  };
})(jQuery);

Для этого есть небольшая полезная утилита url с некоторым интересным добавлением сахара:

http://www.example.com/path/index.html?silly=willy#chucky=cheese

url();            // http://www.example.com/path/index.html?silly=willy#chucky=cheese
url('domain');    // example.com
url('1');         // path
url('-1');        // index.html
url('?');         // silly=willy
url('?silly');    // willy
url('?poo');      // (an empty string)
url('#');         // chucky=cheese
url('#chucky');   // cheese
url('#poo');      // (an empty string)

Ознакомьтесь с другими примерами и загрузите здесь: { *} https://github.com/websanova/js-url # url Это самая простая и небольшая функция JavaScript для получения значения параметра int ans String из URL

jquery — Как использовать переменная для ключа в литерале объекта JavaScript? — Переполнение стека

/* THIS FUNCTION IS TO FETCH INT PARAMETER VALUES */

function getParameterint(param) {
            var val = document.URL;
            var url = val.substr(val.indexOf(param))  
            var n=parseInt(url.replace(param "=",""));
            alert(n); 
}
getParameteraint("page");
getParameteraint("pagee");

/*THIS FUNCTION IS TO FETCH STRING PARAMETER*/
function getParameterstr(param) {
            var val = document.URL;
            var url = val.substr(val.indexOf(param))  
            var n=url.replace(param "=","");
            alert(n); 
}
getParameterstr("str");

Почему работает следующее? & # xA ; & # xA {*** } & {амп ***} {*** л} {-то *.} {амп ***} {*** GT}. остановки (). анимировать (& {**** } xA ; {‘top’: 10}, 10 & # xA ;) ; & # xD { ***} & # xA ; Хотя это не работает: & # xA ; & {** **} xA ; var thetop = ‘top’ ; & # xA ; & amp ; lt {** *} что-то & amp ; gt ;. stop (). animate (& # xA ; {thetop: 10}, 10 { *.} # xA ; … Я считаю, что это точный и лаконичный способ достижения этого (изменено из

jquery — Как использовать переменную для ключа в литерале объекта JavaScript? Почему работает следующее? ):

function getQueryVariable(variable) {

    var query = window.location.search.substring(1),            // Remove the ? from the query string.
        vars = query.split("&");                                // Split all values by ampersand.

    for (var i = 0; i < vars.length; i  ) {                     // Loop through them...
        var pair = vars[i].split("=");                          // Split the name from the value.
        if (pair[0] == variable) {                              // Once the requested value is found...
            return ( pair[1] == undefined ) ? null : pair[1];   // Return null if there is no value (no equals sign), otherwise return the value.
        }
    }

    return undefined;                                           // Wasn't found.

}
var getUrlParameters = function (name, url) {
    if (!name) {
        return undefined;
    }

    name = name.replace(/[[]/, '\[').replace(/[]]/, '\]');
    url = url || location.search;

    var regex = new RegExp('[\?&#]'   name   '=?([^&#]*)', 'gi'), result, resultList = [];

    while (result = regex.exec(url)) {
        resultList.push(decodeURIComponent(result[1].replace(/ /g, ' ')));
    }

    return resultList.length ? resultList.length === 1 ? resultList[0] : resultList : undefined;
};

является допустимым литералом объекта. Код создаст объект со свойством

function get(name){
   if(name=(new RegExp('[?&]' encodeURIComponent(name) '=([^&]*)')).exec(location.search))
      return decodeURIComponent(name[1]);
}

имели значение 10. Оба следующих параметра одинаковы: В ES5 и более ранних версиях Вы не можете использовать переменную в качестве имени свойства внутри литерала объекта. Единственный вариант — сделать следующее: ES6

url.get("val[0]=zero&val[1]=one&val[2]&val[3]=&val[4]=four&val[5][0]=n1&val[5][1]=n2&val[5][2]=n3&key=val", {array:true});
// Result
{
    val: [
        'zero',
        'one',
        true,
        '',
        'four',
        [ 'n1', 'n2', 'n3' ]
    ]
    key: 'val'
}

определяет

data = {};
$.each(
    location.search.substr(1).split('&').filter(Boolean).map(function(kvpairs){
        return kvpairs.split('=')
    }),
    function(i,values) {
        data[values.shift()] = values.join('=')
    }
);

ComputedPropertyName ?a[]=1&a[]2

. Этот новый синтаксис можно использовать в последних версиях каждого основного браузера. window.location С

// Example - window.location = "index.htm?name=bob";

var value = getParameterValue("name");

alert("name = "   value);

function getParameterValue(param)
{
    var url = window.location;
    var parts = url.split('?');
    var params = parts[1].split('&');
    var val = "";

    for ( var i=0; i<params.length; i  )
    {
        var paramNameVal = params[i].split('=');

        if ( paramNameVal[0] == param )
        {
            val = paramNameVal[1];
        }
    }
    return val;
}

, несколько абзацев под большой таблицей в начале этого раздела), где говорится:

, теперь вы можете сделать это непосредственно в объявлении объекта с помощью функции скобок:

Использование gV(para_name) может быть любое выражение (например, переменная), возвращающее значение.

var a=window.location.search;
a=a.replace(a.charAt(0),""); //Removes '?'
a=a.split("&");

function gV(x){
 for(i=0;i<a.length;i  ){
  var b=a[i].substr(0,a[i].indexOf("="));
  if(x==b){
   return a[i].substr(a[i].indexOf("=") 1,a[i].length)}

Это будет анализировать переменные И массивы из строки URL. Он не использует ни regex или любые другие внешняя библиотека.

function url2json(url) {
   var obj={};
   function arr_vals(arr){
      if (arr.indexOf(',') > 1){
         var vals = arr.slice(1, -1).split(',');
         var arr = [];
         for (var i = 0; i < vals.length; i  )
            arr[i]=vals[i];
         return arr;
      }
      else
         return arr.slice(1, -1);
   }
   function eval_var(avar){
      if (!avar[1])
          obj[avar[0]] = '';
      else
      if (avar[1].indexOf('[') == 0)
         obj[avar[0]] = arr_vals(avar[1]);
      else
         obj[avar[0]] = avar[1];
   }
   if (url.indexOf('?') > -1){
      var params = url.split('?')[1];
      if(params.indexOf('&') > 2){
         var vars = params.split('&');
         for (var i in vars)
            eval_var(vars[i].split('='));
      }
      else
         eval_var(params.split('='));
   }
   return obj;
}

Пример:

var url = "http://www.x.com?luckyNums=[31,21,6]&name=John&favFoods=[pizza]&noVal"
console.log(url2json(url));

Вывод:

[object]
   noVal: ""
   favFoods: "pizza"
   name:     "John"
   luckyNums:
      0: "31"
      1: "21"
      2: "6"

Самое короткое из возможных выражений в терминах размера для получения объекта запроса выглядит следующим образом:

var params = {};
location.search.substr(1).replace(/([^&=]*)=([^&]*)&?/g,
  function () { params[decodeURIComponent(arguments[1])] = decodeURIComponent(arguments[2]); });

Вы можете использовать элемент A для анализа URI из строки в его location — подобные компоненты (чтобы избавиться от #..., например):

var a = document.createElement('a');
a.href = url;
// Parse a.search.substr(1)... as above

Использование:

  $(document).ready(function () {
      var urlParams = {};
      (function () {
          var match,
          pl = / /g, // Regex for replacing addition symbol with a space
              search = /([^&=] )=?([^&]*)/g,
              decode = function (s) {
                  return decodeURIComponent(s.replace(pl, " "));
              },
              query = window.location.search.substring(1);

          while (match = search.exec(query))
              urlParams[decode(match[1])] = decode(match[2]);
      })();
      if (urlParams["q1"] === 1) {
          return 1;
      }

Пожалуйста, проверьте и дайте мне знать ваши комментарии. Также обратитесь к Как получить значение строки запроса с помощью jQuery Глядя на вывод

Я рекомендую Dar Lessons , как хороший плагин. Я работал с этим для долгое время. Вы также можете использовать следующий код. Поставьте var queryObj = {}; перед document.ready и поместите приведенный ниже код в начале document.ready. После этого кода вы можете использовать queryObj["queryObjectName"] для любого объекта запроса, который у вас есть

var querystring = location.search.replace('?', '').split('&');
for (var i = 0; i < querystring.length; i  ) {
    var name = querystring[i].split('=')[0];
    var value = querystring[i].split('=')[1];
    queryObj[name] = value;
}

. Надежное выполнение этого более сложное занятие, чем кажется на первый взгляд.

  1. location.search, которое используется в других ответах, является хрупким и его следует избегать — например, оно возвращает пустое значение, если кто-то напортачил, и вставляет #fragment идентификатор перед ?query.
  2. Существует несколько способов, по которым URL-адреса автоматически экранируются в браузере, что делает decodeURIComponent довольно обязательным, по моему мнению.
  3. Многие строки запроса генерируются из пользовательского ввода, что означает, что предположения о содержании URL очень плохие. Включая такие базовые вещи, как каждый ключ уникален или даже имеет значение.

Чтобы решить эту проблему, вот настраиваемый API с допустимой дозой защитное программирование . Обратите внимание, что он может быть уменьшен вдвое, если вы хотите жестко закодировать некоторые переменные или если входные данные никогда не будут содержать hasOwnProperty и т. Д.

Версия 1: Возвращает объект данных с именами и значениями для каждого параметра. Он эффективно их дублирует и всегда учитывает первый, найденный слева направо.

function getQueryData(url, paramKey, pairKey, missingValue, decode) {

    var query, queryStart, fragStart, pairKeyStart, i, len, name, value, result;

    if (!url || typeof url !== 'string') {
        url = location.href; // more robust than location.search, which is flaky
    }
    if (!paramKey || typeof paramKey !== 'string') {
        paramKey = '&';
    }
    if (!pairKey || typeof pairKey !== 'string') {
        pairKey = '=';
    }
    // when you do not explicitly tell the API...
    if (arguments.length < 5) {
        // it will unescape parameter keys and values by default...
        decode = true;
    }

    queryStart = url.indexOf('?');
    if (queryStart >= 0) {
        // grab everything after the very first ? question mark...
        query = url.substring(queryStart   1);
    } else {
        // assume the input is already parameter data...
        query = url;
    }
    // remove fragment identifiers...
    fragStart = query.indexOf('#');
    if (fragStart >= 0) {
        // remove everything after the first # hash mark...
        query = query.substring(0, fragStart);
    }
    // make sure at this point we have enough material to do something useful...
    if (query.indexOf(paramKey) >= 0 || query.indexOf(pairKey) >= 0) {
        // we no longer need the whole query, so get the parameters...
        query = query.split(paramKey);
        result = {};
        // loop through the parameters...
        for (i = 0, len = query.length; i < len; i = i   1) {
            pairKeyStart = query[i].indexOf(pairKey);
            if (pairKeyStart >= 0) {
                name = query[i].substring(0, pairKeyStart);
            } else {
                name = query[i];
            }
            // only continue for non-empty names that we have not seen before...
            if (name && !Object.prototype.hasOwnProperty.call(result, name)) {
                if (decode) {
                    // unescape characters with special meaning like ? and #
                    name = decodeURIComponent(name);
                }
                if (pairKeyStart >= 0) {
                    value = query[i].substring(pairKeyStart   1);
                    if (value) {
                        if (decode) {
                            value = decodeURIComponent(value);
                        }
                    } else {
                        value = missingValue;
                    }
                } else {
                    value = missingValue;
                }
                result[name] = value;
            }
        }
        return result;
    }
}

Версия 2: возвращает объект карты данных с двумя одинаковыми массивами длины, один для имен и один для значений, с Индекс для каждого параметра. Этот поддерживает дублирующиеся имена и намеренно не дублирует их, потому что, возможно, именно поэтому вы захотите использовать этот формат.

function getQueryData(url, paramKey, pairKey, missingValue, decode) {

   var query, queryStart, fragStart, pairKeyStart, i, len, name, value, result;

   if (!url || typeof url !== 'string') {
       url = location.href; // more robust than location.search, which is flaky
   }
   if (!paramKey || typeof paramKey !== 'string') {
       paramKey = '&';
   }
   if (!pairKey || typeof pairKey !== 'string') {
       pairKey = '=';
   }
   // when you do not explicitly tell the API...
   if (arguments.length < 5) {
       // it will unescape parameter keys and values by default...
       decode = true;
   }

   queryStart = url.indexOf('?');
   if (queryStart >= 0) {
       // grab everything after the very first ? question mark...
       query = url.substring(queryStart   1);
   } else {
       // assume the input is already parameter data...
       query = url;
   }
   // remove fragment identifiers...
   fragStart = query.indexOf('#');
   if (fragStart >= 0) {
       // remove everything after the first # hash mark...
       query = query.substring(0, fragStart);
   }
   // make sure at this point we have enough material to do something useful...
   if (query.indexOf(paramKey) >= 0 || query.indexOf(pairKey) >= 0) {
       // we no longer need the whole query, so get the parameters...
       query = query.split(paramKey);
       result = {
           names: [],
           values: []
       };
       // loop through the parameters...
       for (i = 0, len = query.length; i < len; i = i   1) {
           pairKeyStart = query[i].indexOf(pairKey);
           if (pairKeyStart >= 0) {
               name = query[i].substring(0, pairKeyStart);
           } else {
               name = query[i];
           }
           // only continue for non-empty names...
           if (name) {
               if (decode) {
                   // unescape characters with special meaning like ? and #
                   name = decodeURIComponent(name);
               }
               if (pairKeyStart >= 0) {
                   value = query[i].substring(pairKeyStart   1);
                   if (value) {
                       if (decode) {
                           value = decodeURIComponent(value);
                       }
                   } else {
                       value = missingValue;
                   }
               } else {
                   value = missingValue;
               }
               result.names.push(name);
               result.values.push(value);
           }
       }
       return result;
   }

}

. Эта функция будет возвращать проанализированный объект JavaScript с любыми произвольно вложенными значениями, используя при необходимости рекурсию.

Вот jsfiddle .

[
  '?a=a',
  '&b=a',
  '&b=b',
  '&c[]=a',
  '&c[]=b',
  '&d[a]=a',
  '&d[a]=x',
  '&e[a][]=a',
  '&e[a][]=b',
  '&f[a][b]=a',
  '&f[a][b]=x',
  '&g[a][b][]=a',
  '&g[a][b][]=b',
  '&h=+ %',
  '&i[aa=b',
  '&i[]=b',
  '&j=',
  '&k',
  '&=l',
  '&abc=foo',
  '&def=[asf]',
  '&ghi=[j=kl]',
  '&xy=z=5',
  '&foo=b=ar',
  '&xy[z=5'
].join('');

, учитывая любой из приведенных выше тестовых примеров.

var qs = function(a) {
  var b, c, e;
  b = {};
  c = function(d) {
    return d && decodeURIComponent(d.replace(/ /g, " "));
  };
  e = function(f, g, h) {
    var i, j, k, l;
    h = h ? h : null;
    i = /(. ?)[(. ?)?](. )?/g.exec(g);
    if (i) {
      [j, k, l] = [i[1], i[2], i[3]]
      if (k === void 0) {
        if (f[j] === void 0) {
          f[j] = [];
        }
        f[j].push(h);
      } else {
        if (typeof f[j] !== "object") {
          f[j] = {};
        }
        if (l) {
          e(f[j], k   l, h);
        } else {
          e(f[j], k, h);
        }
      }
    } else {
      if (f.hasOwnProperty(g)) {
        if (Array.isArray(f[g])) {
          f[g].push(h);
        } else {
          f[g] = [].concat.apply([f[g]], [h]);
        }
      } else {
        f[g] = h;
      }
      return f[g];
    }
  };
  a.replace(/^(?|#)/, "").replace(/([^#&=?] )?=?([^&=] )?/g, function(m, n, o) {
    n && e(b, c(n), c(o));
  });
  return b;
};

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

function getParameterByName(name)
{
  name = name.replace(/[[]/,"\[").replace(/[]]/,"\]");
  var regexS = "[\?&]" name "=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  alert(results[1]);
  if (results == null)
    return "";
  else
    return results[1];
}

Быстро, просто и быстро:

Функция:

function getUrlVar() {
    var result = {};
    var location = window.location.href.split('#');
    var parts = location[0].replace(/[?&] ([^=&] )=([^&]*)/gi, function(m,key,value) {
        result [key] = value;
    });
    return result;
}

Использование:

var varRequest = getUrlVar()["theUrlVarName"];

Посмотрите это после или используйте это:

<script type="text/javascript" language="javascript">
    $(document).ready(function()
    {
        var urlParams = {};
        (function ()
        {
            var match,
            pl= / /g,  // Regular expression for replacing addition symbol with a space
            search = /([^&=] )=?([^&]*)/g,
            decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
            query  = window.location.search.substring(1);

            while (match = search.exec(query))
                urlParams[decode(match[1])] = decode(match[2]);
        })();

        if (urlParams["q1"] === 1)
        {
            return 1;
        }
    });
</script>

Это не сработало для меня, я хочу сопоставить ?b как b присутствует и не соответствует ?return как r, здесь реализация прототипа: Глядя на вывод

window.query_param = function(name) {
  var param_value, params;

  params = location.search.replace(/^?/, '');
  params = _.map(params.split('&'), function(s) {
    return s.split('=');
  });

  param_value = _.select(params, function(s) {
    return s.first === name;
  })[0];

  if (param_value) {
    return decodeURIComponent(param_value[1] || '');
  } else {
    return null;
  }
};

только код JavaScript без зависимостей: String Пример вызова:

String.prototype.getParam = function( str ){
    str = str.replace(/[[]/,"\[").replace(/[]]/,"\]");
    var regex = new RegExp( "[\?&]*" str "=([^&#]*)" );    
    var results = regex.exec( this );
    if( results == null ){
        return "";
    } else {
        return results[1];
    }
}

может быть строкой запроса или URL-адресом

var status = str.getParam("status")

str Как справиться с точностью чисел с плавающей запятой в JavaScript? — Переполнение стека

, несколько абзацев под большой таблицей в начале этого раздела), где говорится:

Обновление: сентябрь-2018

Вы можете использовать URLSearchParams, который прост и имеет хорошего браузера support Глядя на вывод

const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');

Original

Вам не нужен jQuery для этой цели. Вы можете использовать только чистый JavaScript:

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[[]]/g, '\$&');
    var regex = new RegExp('[?&]'   name   '(=([^&#]*)|&|#|$)'),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/ /g, ' '));
}

Использование:

// query string: ?foo=lorem&bar=&baz
var foo = getParameterByName('foo'); // "lorem"
var bar = getParameterByName('bar'); // "" (present with empty value)
var baz = getParameterByName('baz'); // "" (present with no value)
var qux = getParameterByName('qux'); // null (absent)

Примечание. Если параметр присутствует несколько раз (?foo=lorem&foo=ipsum), вы получите первое значение (lorem). Стандартов на этот счет нет, и использование различается, см., Например, этот вопрос: Официальная позиция дублирующего запроса HTTP GET ключи Глядя на вывод
ПРИМЕЧАНИЕ: функция чувствительна к регистру. Если вы предпочитаете имя параметра без учета регистра, добавить модификатор ‘i’ к RegExp


Это обновление на основе нового спецификации URLSearchParams , чтобы получить тот же результат более лаконично. Смотрите ответ « URLSearchParams » ниже.

Некоторые из опубликованных здесь решений неэффективны. Повторять поиск по регулярному выражению каждый раз, когда скрипту необходим доступ к параметру, совершенно не нужно, достаточно одной функции для разделения параметров на объект стиля ассоциативного массива. Если вы не работаете с HTML 5 History API, это необходимо сделать только один раз для каждой загрузки страницы. Другие предложения здесь также не в состоянии правильно декодировать URL.

var urlParams;
(window.onpopstate = function () {
    var match,
        pl     = / /g,  // Regex for replacing addition symbol with a space
        search = /([^&=] )=?([^&]*)/g,
        decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
        query  = window.location.search.substring(1);

    urlParams = {};
    while (match = search.exec(query))
       urlParams[decode(match[1])] = decode(match[2]);
})();

Пример строки запроса:

?i=main&mode=front&sid=de8d49b78a85a322c4155015fdce22c4&enc= Hello &empty

Результат:

 urlParams = {
    enc: " Hello ",
    i: "main",
    mode: "front",
    sid: "de8d49b78a85a322c4155015fdce22c4",
    empty: ""
}

alert(urlParams["mode"]);
// -> "front"

alert("empty" in urlParams);
// -> true

Это можно легко улучшить, обрабатывая строки запроса в виде массива. Примером этого является говорится, что , но параметры стиля массива не определены в {* } Тогда если вы знакомы с Настраиваемый формат даты и времени. Эта библиотека должна делать то же самое и помогать форматировать дату и время. dtmFRM Глядя на вывод

Использование ;, все, что вам нужно сделать, это передать любой из этого формата умиротворены в библиотеках key=value файла ; или & мы сравниваем две даты в javascript. Учитываются также часы, минуты и секунды. Так что, если нам нужно только сравнить только дату, это подход: ; будет работать как шарм. ; вывод будет: & … что похоже на меня. Конечно, вы должны убедиться, что обе даты не являются неопределенными …


Таким образом, мы можем гарантировать, что будет выполнено положительное сравнение, если оба они также не определены, или …

<script>var urlParams = <?php echo json_encode($_GET, JSON_HEX_TAG);?>;</script>

… если вы предпочитаете, чтобы они не были равны.

ES6 представляет

getQueryStringParams = query => {
    return query
        ? (/^[?#]/.test(query) ? query.slice(1) : query)
            .split('&')
            .reduce((params, param) => {
                    let [key, value] = param.split('=');
                    params[key] = value ? decodeURIComponent(value.replace(/ /g, ' ')) : '';
                    return params;
                }, {}
            )
        : {}
};

Без jQuery

var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length;   i)
    {
        var p=a[i].split('=', 2);
        if (p.length == 1)
            b[p[0]] = "";
        else
            b[p[0]] = decodeURIComponent(p[1].replace(/ /g, " "));
    }
    return b;
})(window.location.search.substr(1).split('&'));

http://jsfiddle.net/guhokemk/1/ ?topic=123&name=query string Метод возвращает 1, если

qs["topic"];    // 123
qs["name"];     // query string
qs["nothere"];  // undefined (object)

больше, чем

Метод возвращает 0, если getUrlParameters

function (b) {
    var c = typeof b === "undefined";
    if (a !== h && c) return a;
    for (var d = {}, b = b || k[B][vb], e = b[p]("?"), f = b[p]("#"), b = (f === -1 ? b[Ya](e   1) : [b[Ya](e   1, f - e - 1), "&", b[Ya](f   1)][K](""))[z]("&"), e = i.dd ? ia : unescape, f = 0, g = b[w]; f < g;   f) {
        var l = b[f][p]("=");
        if (l !== -1) {
            var q = b[f][I](0, l),
                l = b[f][I](l   1),
                l = l[Ca](/ /g, " ");
            try {
                d[q] = e(l)
            } catch (A) {}
        }
    }
    c && (a = d);
    return d
}

равно

Метод возвращает -1, если ? меньше # https://code.google.com/archive/p/datejs/downloads b[f][p]("=") и использует indexOf и возвращают d, что означает следующий результат:

— 1 = дата1 меньше даты2. d 0 = равны. 1 = дата1 больше даты2.


ОСТЕРЕГАЙТЕСЬ ВРЕМЕННОЙ ЗОНЕ Дата JavaScript содержит

(function($) {
    $.QueryString = (function(paramsArray) {
        let params = {};

        for (let i = 0; i < paramsArray.length;   i)
        {
            let param = paramsArray[i]
                .split('=', 2);

            if (param.length !== 2)
                continue;

            params[param[0]] = decodeURIComponent(param[1].replace(/ /g, " "));
        }

        return params;
    })(window.location.search.substr(1).split('&'))
})(jQuery);

Это зависит от того, какие расчеты вы делаете.

//Get a param
$.QueryString.param
//-or-
$.QueryString["param"]
//This outputs something like...
//"val"

//Get all params as object
$.QueryString
//This outputs something like...
//Object { param: "val", param2: "val" }

//Set a param (only in the $.QueryString object, doesn't affect the browser's querystring)
$.QueryString.param = "newvalue"
//This doesn't output anything, it just updates the $.QueryString object

//Convert object into string suitable for url a querystring (Requires jQuery)
$.param($.QueryString)
//This outputs something like...
//"param=newvalue&param2=val"

//Update the url/querystring in the browser's location bar with the $.QueryString object
history.replaceState({}, '', "?"   $.param($.QueryString));
//-or-
history.pushState({}, '', "?"   $.param($.QueryString));

, вы хотите, чтобы ваши даты представляли полночь UTC в начале рассматриваемой даты.

Это общее и необходимое соглашение, которое позволяет вам работать с датами независимо от сезона или часового пояса их создания. Таким образом, вы должны быть очень бдительными, чтобы управлять понятием часового пояса, особенно когда вы создаете свой объект UTC Date.

var qs = window.GetQueryString(query);

var search = qs["q"];
var value = qs["value"];
var undef = qs["undefinedstring"];

В большинстве случаев вы хотите, чтобы ваша дата отражала часовой пояс пользователя.

var search = window.getParameterByName("q");
var value = window.getParameterByName("value");
var undef = window.getParameterByName("undefinedstring");

Нажмите, если сегодня ваш день рождения

  • Сплит метод : 144,780 ± 2.17 % fasttest
  • Метод Regex : 13 891 ± 0,85 % | На 90 % медленнее

URLSearchParams

Firefox 44, Opera 36, ​​Edge 17, Safari 10.3 и Chrome 49 поддерживают URLSearchParams Существует Google-предложенный

. Чтобы создавать даты из свободного текста в Javascript, вам нужно проанализировать его в объект Date (). Вы можете использовать Date.parse (), который использует свободный текст, пытается преобразовать его в новую дату, но если у вас есть контроль над страницей, я бы рекомендовал использовать вместо этого поля выбора HTML или средство выбора даты, например Управление календарем YUI

или JQuery UI Datepicker . люди указали, что вы можете использовать простую арифметику, чтобы вычесть даты и преобразовать их обратно в число дней, разделив число (в секундах) на количество секунд в дне (60 * 60 * 24 = 86400). Допустим, вы получили объекты даты A и B, получили их значение времени EPOC, а затем вычли, чтобы получить разницу в миллисекундах. Глядя на вывод

Вычитать две даты, получить разницу в миллисекундах, если вы получите ? это та же самая дата {*) } Улучшенная версия кода, опубликованная с помощью «some» .slice(1)):

let params = new URLSearchParams(location.search);

или

let params = (new URL(location)).searchParams;

Вы можете получить параметры, также используя стенографию

let url = new URL('https://example.com?foo=1&bar=2');
let params = new URLSearchParams(url.search);

объекта URL, например, так: .searchParams Вы читаете / устанавливаете параметры через

let params = new URL('https://example.com?foo=1&bar=2').searchParams;
params.get('foo'); // "1"
params.get('bar'); // "2" 

при необходимости. get(KEY), set(KEY, VALUE), append(KEY, VALUE) Дата к метке времени for (let p of params) {} Глядя на вывод

Закрытие и , чтобы узнать почему. Перед сравнением объект, попробуйте установить обе их миллисекунды в ноль, как

позволяет получить все части URL, включая якорь, хост и т. Д. динамически создается в javascript, если вы продолжаете печатать . Его можно использовать с или без jQuery.

Используйте этот код для сравнения даты с использованием JavaScript.

ThanksD.Jeeva

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

Вот что я сделал в одном из моих проектов, {* } вместо. Плагин jQuery отличается тем, что он фокусируется на элементах — для использования со строками просто используйте напрямую, с или без jQuery. Подобный код выглядел бы так, полные документы или этим URI Как видите, мы удаляем разделитель (и) ), а затем сравнить целые числа. говорится, что :

var url = new URI('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.protocol(); // returns 'http'
url.path(); // returns '/folder/dir/index.html'

, самого простого и удобочитаемого способа включения индексной переменной:

Быстрое, полное решение , которое обрабатывает многозначные ключи и закодированные символы Глядя на вывод

var qd = {};
if (location.search) location.search.substr(1).split("&").forEach(function(item) {var s = item.split("="), k = s[0], v = s[1] && decodeURIComponent(s[1]); (qd[k] = qd[k] || []).push(v)})

//using ES6   (23 characters cooler)
var qd = {};
if (location.search) location.search.substr(1).split`&`.forEach(item => {let [k,v] = item.split`=`; v = v && decodeURIComponent(v); (qd[k] = qd[k] || []).push(v)})

Многострочный:

var qd = {};
if (location.search) location.search.substr(1).split("&").forEach(function(item) {
    var s = item.split("="),
        k = s[0],
        v = s[1] && decodeURIComponent(s[1]); //  null-coalescing / short-circuit
    //(k in qd) ? qd[k].push(v) : qd[k] = [v]
    (qd[k] = qd[k] || []).push(v) // null-coalescing / short-circuit
})

Что весь этот код …
«null -coalescing «, оценка короткого замыкания
ES6 Уничтожение заданий , функции со стрелками , Строки шаблона

пример:

"?a=1&b=0&c=3&d&e&a=5&a=t e x t&e=http://w3schools.com/my test.asp?name=ståle&car=saab"
> qd
a: ["1", "5", "t e x t"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

> qd.a[1]    // "5"
> qd["a"][1] // "5"

Подробнее … о решении Vanilla JavaScript .

Чтобы получить доступ к различным частям URL-адреса, используйте location.(search|hash)

простейшее (фиктивное) решение

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
  • Дескрипторы пустых ключей правильно.
  • Переопределение multi-keys . Это как окно, которое вы можете открыть с помощью последнее найденное значение.
"?a=1&b=0&c=3&d&e&a=5"
> queryDict
a: "5"
b: "0"
c: "3"
d: undefined
e: undefined

многозначные ключи

Простая проверка ключей (item in dict) ? dict.item.push(val) : dict.item = [val]

var qd = {};
location.search.substr(1).split("&").forEach(function(item) {(item.split("=")[0] in qd) ? qd[item.split("=")[0]].push(item.split("=")[1]) : qd[item.split("=")[0]] = [item.split("=")[1]]})
  • Теперь возвращает arrays .
  • Доступ к значениям с помощью qd.key[index] или qd[key][index]
> qd
a: ["1", "5"]
b: ["0"]
c: ["3"]
d: [undefined]
e: [undefined]

кодированных символов?

Использование decodeURIComponent() для второго или оба разбиения.

var qd = {};
location.search.substr(1).split("&").forEach(function(item) {var k = item.split("=")[0], v = decodeURIComponent(item.split("=")[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v]})

пример:

"?a=1&b=0&c=3&d&e&a=5&a=t e x t&e=http://w3schools.com/my test.asp?name=ståle&car=saab"
> qd
a: ["1", "5", "t e x t"]
b: ["0"]
c: ["3"]
d: ["undefined"]  // decodeURIComponent(undefined) returns "undefined" !!!*
e: ["undefined", "http://w3schools.com/my test.asp?name=ståle&car=saab"]

Из комментариев

* !!! Обратите внимание, что decodeURIComponent(undefined) возвращает строку "undefined". Решение заключается в простом использовании &&, который гарантирует, что decodeURIComponent() не вызывается для неопределенных значений. (см. «полное решение» вверху.)

v = v && decodeURIComponent(v);

Если строка запроса пуста (location.search == ""), результат несколько вводит в заблуждение qd == {"": undefined}. Рекомендуется проверить строку запроса перед запуском функции синтаксического анализа likeso:

if (location.search) location.search.substr(1).split("&").forEach(...)

У Roshambo на snipplr.com есть простой скрипт для достижения этой цели, описанный в Получить параметры URL с помощью jQuery | Улучшенный . С его сценарием вы также легко получаете те параметры, которые вам нужны.

Вот метод gist:

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

Затем просто получите ваши параметры из строки запроса.

Таким образом, если строка URL / запроса была xyz.com/index.html?lang=de Глядя на вывод

Просто позвоните var langval = $.urlParam('lang');, и вы получите его.

UZBEKJON также написал отличную запись в блоге, Получить параметры URL Значения & amp ; с помощью jQuery Глядя на вывод

Если вы используете jQuery, вы можете использовать библиотеку, такую ​​как jQuery BBQ: кнопка Back & Amp ; Query Library Глядя на вывод

… jQuery BBQ предоставляет полный аргумент .deparam(), наряду с методами управления состоянием хеш-функции, утилитами разбора фрагментов / запросов и утилитами слияния.

Редактировать: пример добавления примера:

 var DeparamExample = function() {
            var params = $.deparam.querystring();

            //nameofparam is the name of a param from url
            //code below will get param if ajax refresh with hash
            if (typeof params.nameofparam == 'undefined') {
                params = jQuery.deparam.fragment(window.location.href);
            }
            
            if (typeof params.nameofparam != 'undefined') {
                var paramValue = params.nameofparam.toString();
                  
            }
        };

Если вы хотите просто использовать простой JavaScript, вы можете использовать …

var getParamValue = (function() {
    var params;
    var resetParams = function() {
            var query = window.location.search;
            var regex = /[?&;](. ?)=([^&;] )/g;
            var match;

            params = {};

            if (query) {
                while (match = regex.exec(query)) {
                    params[match[1]] = decodeURIComponent(match[2]);
                }
            }    
        };

    window.addEventListener
    && window.addEventListener('popstate', resetParams);

    resetParams();

    return function(param) {
        return params.hasOwnProperty(param) ? params[param] : null;
    }

})();​

выполняет итерацию только по history.pushState() и history.replaceState() ). Для простых объектов и литералов объектов любой из этих методов будет работать нормально.

Как правило, все описанные методы имеют одинаковое поведение с любыми предоставленными объектами. Помимо использования нативного

обычно быстрее :

function get(n) {
    var half = location.search.split(n   '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

, эти методы значительно проще в использовании, требуют меньше кодирования и обеспечивают лучшую обработку ошибок. В ECMAScript 5 у вас есть новый подход в полях итераций литерала —

JsPerf Мой выбор ниже в качестве более быстрого решения в текущих версиях браузеров (Chrome30, IE10, FF25) ).

function get(n) {
    var half = location.search.split('&'   n   '=')[1];
    if (!half) half = location.search.split('?'   n   '=')[1];
    return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}

jsperf.com

или Поддержка браузера, которую вы можете увидеть в { *} Вот мой опыт превращения превосходного решения Энди Э в полноценный плагин jQuery:

    function getQueryStringValueByName(name) {
        var queryStringFromStartOfValue = location.search.split(name   '=')[1];
         return queryStringFromStartOfValue !== undefined ? queryStringFromStartOfValue.split('&')[0] : null;

Синтаксис:

;(function ($) {
    $.extend({      
        getQueryString: function (name) {           
            function parseParams() {
                var params = {},
                    e,
                    a = / /g,  // Regex for replacing addition symbol with a space
                    r = /([^&=] )=?([^&]*)/g,
                    d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
                    q = window.location.search.substring(1);

                while (e = r.exec(q))
                    params[d(e[1])] = d(e[2]);

                return params;
            }

            if (!this.queryStringParams)
                this.queryStringParams = parseParams(); 

            return this.queryStringParams[name];
        }
    });
})(jQuery);

простой

var someVar = $.getQueryString('myParam');

полный

полезным. Это библиотека для • манипулирует URL-адресами — и поставляется со всеми прибамбасами. (Извините за саморекламу здесь) напрямую, с или без jQuery. Подобный код выглядел бы так, полные документы для преобразования строки запроса в карту:

(URI.js также «исправляет» плохие строки запроса, такие как

var data = URI('?foo=bar&bar=baz&foo=world').query(true);
data == {
  "foo": ["bar", "world"],
  "bar": "baz"
}

(URI.js также «исправляет» некорректные строки запросов, такие как ?&foo&&bar=baz&?foo&bar=baz С чем вы столкнулись

Обратите внимание, что не будет принимать значение свойства, это всего лишь значение индекса. Предисловие:

Свойства объекта могут быть

(свойство находится на самом объекте) или

if (!window.location.getParameter ) {
  window.location.getParameter = function(key) {
    function parseParams() {
        var params = {},
            e,
            a = / /g,  // Regex for replacing addition symbol with a space
            r = /([^&=] )=?([^&]*)/g,
            d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
            q = window.location.search.substring(1);

        while (e = r.exec(q))
            params[d(e[1])] = d(e[2]);

        return params;
    }

    if (!this.queryStringParams)
        this.queryStringParams = parseParams(); 

    return this.queryStringParams[key];
  };
}

унаследовано (не о самом объекте, ни об одном из его прототипов). {* } enumerable Глядя на вывод

$ _ GET : Для строки запроса

function get_query(){
    var url = location.search;
    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]] = decodeURIComponent(qs[i][1]);
    }
    return result;
}

Использование:

var $_GET = get_query();

это возвращает объект: x=5&y&z=hello&x=6 [

{
  x: "6",
  y: undefined,
  z: "hello"
}

Все это отличные ответы, но мне нужно что-то более надежное, и я подумал, что вам всем может понравиться то, что я создал.

function qs(key) {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?')   1).split('&');
    for(var i = 0; i < hashes.length; i  )
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars[key];
}

spec

var result = qs('someKey');

Это простой библиотечный метод, который выполняет анализ и манипулирование параметрами URL. Статический метод имеет следующие вспомогательные методы, которые могут быть вызваны на URL-адресе субъекта:

getHost

  • getPath
  • setHash
  • ] — функция, предоставляющая массив имен свойств объекта
  • getParams
  • setParam
  • , имена которых являются строками.
  • getParam
  • removeParam
  • ] — функция, предоставляющая массив
  • значений

Пример:

URLParser(url).getParam('myparam1')

var url = "http://www.test.com/folder/mypage.html?myparam1=1&myparam2=2#something";

function URLParser(u){
    var path="",query="",hash="",params;
    if(u.indexOf("#") > 0){
        hash = u.substr(u.indexOf("#")   1);
        u = u.substr(0 , u.indexOf("#"));
    }
    if(u.indexOf("?") > 0){
        path = u.substr(0 , u.indexOf("?"));
        query = u.substr(u.indexOf("?")   1);
        params= query.split('&');
    }else
        path = u;
    return {
        getHost: function(){
            var hostexp = ///([w.-]*)/;
            var match = hostexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getPath: function(){
            var pathexp = ///[w.-]*(?:/([^?]*))/;
            var match = pathexp.exec(path);
            if (match != null && match.length > 1)
                return match[1];
            return "";
        },
        getHash: function(){
            return hash;
        },
        getParams: function(){
            return params
        },
        getQuery: function(){
            return query;
        },
        setHash: function(value){
            if(query.length > 0)
                query = "?"   query;
            if(value.length > 0)
                query = query   "#"   value;
            return path   query;
        },
        setParam: function(name, value){
            if(!params){
                params= new Array();
            }
            params.push(name   '='   value);
            for (var i = 0; i < params.length; i  ) {
                if(query.length > 0)
                    query  = "&";
                query  = params[i];
            }
            if(query.length > 0)
                query = "?"   query;
            if(hash.length > 0)
                query = query   "#"   hash;
            return path   query;
        },
        getParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i  ) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return decodeURIComponent(pair[1]);
                }
            }
            console.log('Query variable %s not found', name);
        },
        hasParam: function(name){
            if(params){
                for (var i = 0; i < params.length; i  ) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) == name)
                        return true;
                }
            }
            console.log('Query variable %s not found', name);
        },
        removeParam: function(name){
            query = "";
            if(params){
                var newparams = new Array();
                for (var i = 0;i < params.length;i  ) {
                    var pair = params[i].split('=');
                    if (decodeURIComponent(pair[0]) != name)
                          newparams .push(params[i]);
                }
                params = newparams;
                for (var i = 0; i < params.length; i  ) {
                    if(query.length > 0)
                        query  = "&";
                    query  = params[i];
                }
            }
            if(query.length > 0)
                query = "?"   query;
            if(hash.length > 0)
                query = query   "#"   hash;
            return path   query;
        },
    }
}


document.write("Host: "   URLParser(url).getHost()   '<br>');
document.write("Path: "   URLParser(url).getPath()   '<br>');
document.write("Query: "   URLParser(url).getQuery()   '<br>');
document.write("Hash: "   URLParser(url).getHash()   '<br>');
document.write("Params Array: "   URLParser(url).getParams()   '<br>');
document.write("Param: "   URLParser(url).getParam('myparam1')   '<br>');
document.write("Has Param: "   URLParser(url).hasParam('myparam1')   '<br>');

document.write(url   '<br>');

// Remove the first parameter
url = URLParser(url).removeParam('myparam1');
document.write(url   ' - Remove the first parameter<br>');

// Add a third parameter
url = URLParser(url).setParam('myparam3',3);
document.write(url   ' - Add a third parameter<br>');

// Remove the second parameter
url = URLParser(url).removeParam('myparam2');
document.write(url   ' - Remove the second parameter<br>');

// Add a hash
url = URLParser(url).setHash('newhash');
document.write(url   ' - Set Hash<br>');

// Remove the last parameter
url = URLParser(url).removeParam('myparam3');
document.write(url   ' - Remove the last parameter<br>');

// Remove a parameter that doesn't exist
url = URLParser(url).removeParam('myparam3');
document.write(url   ' - Remove a parameter that doesn"t exist<br>');

Показать его!

var a = location.search&&location.search.substr(1).replace(/ /gi," ").split("&");
for (var i in a) {
    var s = a[i].split("=");
    a[i]  = a[unescape(s[0])] = unescape(s[1]);
}

свойства.

for (i in a) {
    document.write(i   ":"   a[i]   "<br/>");   
};

отображает test.htm?i=can&has=cheezburger Мне кажется, проще и эффективнее прочитать строку запроса один раз в моем приложении и построить объект из всех пар ключ / значение, например:

0:can
1:cheezburger
i:can
has:cheezburger

] — Функция, предоставляющая массив имен

Для таких URL, как

var search = function() {
  var s = window.location.search.substr(1),
    p = s.split(/&/), l = p.length, kv, r = {};
  if (l === 0) {return false;}
  while (l--) {
    kv = p[l].split(/=/);
    r[kv[0]] = decodeURIComponent(kv[1] || '') || true;
  }
  return r;
}();

, вы можете получить их значение позже в своем коде как http://domain.com?param1=val1&param2=val2 объекта (каждая запись в массиве является search.param1 и search.param2 Глядя на вывод

function GET() {
        var data = [];
        for(x = 0; x < arguments.length;   x)
            data.push(location.href.match(new RegExp("/?".concat(arguments[x],"=","([^n&]*)")))[1])
                return data;
    }


example:
data = GET("id","name","foo");
query string : ?id=3&name=jet&foo=b
returns:
    data[0] // 3
    data[1] // jet
    data[2] // b
or
    alert(GET("id")[0]) // return 3

Обратите внимание, что массив). Вот мое редактирование

// get an array with all querystring values
// example: var valor = getUrlVars()["valor"];
function getUrlVars() {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?')   1).split('&');
    for (var i = 0; i < hashes.length; i  ) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

— с добавленной возможностью анализировать строки запроса с ключами без значений.

свойства (даже не перечисляемые), чьи имена являются строками. ВАЖНЫЙ! Параметр для этой функции в последней строке отличается. Это просто пример того, как можно передать ему произвольный URL. Вы можете использовать последнюю строку из ответа Бруно, чтобы проанализировать текущий URL.

var url = 'http://sb.com/reg/step1?param';
var qs = (function(a) {
    if (a == "") return {};
    var b = {};
    for (var i = 0; i < a.length;   i) {
        var p=a[i].split('=', 2);
        if (p[1]) p[1] = decodeURIComponent(p[1].replace(/ /g, " "));
        b[p[0]] = p[1];
    }
    return b;
})((url.split('?'))[1].split('&'));

результаты будут такими же. Но со свойствами url (даже не перечисляемыми), имена которых являются символами.

Решение Бруно возвращает объект без ключей, в то время как мое возвращает объект со значением ключа http://sb.com/reg/step1?param=результаты будут такими же. Но со свойствами url http://sb.com/reg/step1?param Решение Бруно возвращает объект без ключей, в то время как мое возвращает объект со значением ключа param и undefined.

Мне нужен объект из строки запроса, и я ненавижу много кода. Возможно, он не самый надежный во вселенной, но это всего лишь несколько строк кода.

var q = {};
location.href.split('?')[1].split('&').forEach(function(i){
    q[i.split('=')[0]]=i.split('=')[1];
});

URL типа this.htm?hello=world&foo=bar создаст:

{hello:'world', foo:'bar'}

Это функция, которую я создал некоторое время назад, и я вполне доволен. Это не чувствительно к регистру — что удобно. Также, если запрошенный QS не существует, он просто возвращает пустую строку.

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

Я уверен, что это можно оптимизировать или сделать иначе, чтобы работать быстрее, но это всегда отлично работало для того, что мне нужно.

Наслаждайтесь.

function getQSP(sName, sURL) {
    var theItmToRtn = "";
    var theSrchStrg = location.search;
    if (sURL) theSrchStrg = sURL;
    var sOrig = theSrchStrg;
    theSrchStrg = theSrchStrg.toUpperCase();
    sName = sName.toUpperCase();
    theSrchStrg = theSrchStrg.replace("?", "&") theSrchStrg = theSrchStrg   "&";
    var theSrchToken = "&"   sName   "=";
    if (theSrchStrg.indexOf(theSrchToken) != -1) {
        var theSrchTokenLth = theSrchToken.length;
        var theSrchTokenLocStart = theSrchStrg.indexOf(theSrchToken)   theSrchTokenLth;
        var theLocOfNextAndSign = theSrchStrg.indexOf("&", theSrchTokenLocStart);
        theItmToRtn = unescape(sOrig.substring(theSrchTokenLocStart, theLocOfNextAndSign));
    }
    return unescape(theItmToRtn);
}

Вот расширенная версия связанной версии «Обрабатывать строки запроса в стиле массива» Энди Е. Исправлена ​​ошибка (?key=1&key[]=2&key[]=3 ; 1 Теряется и заменяется на [2,3]), сделали несколько незначительных улучшений производительности (перекодирование значений, пересчет позиции «[» и т. д.) и добавили количество улучшений (функционализировано, поддержка ?key=1&key=2, поддержка ; разделителей). Я оставил переменные раздражающе короткими, но добавил много комментариев, чтобы сделать их читабельными (о, и я снова использовал v Примеры:

? Test = Hello & Amp ; person = neek & Amp ; person [] = Джеф & {амп ***} человек [] = джим & {амп ***} человек [экстра] = джон & {амп ***} test3 & {амп ***} nocache = 1398914891264

цикл, но вы можете использовать любую конструкцию цикла)

{
    "test": "Hello",
    "person": {
        "0": "neek",
        "1": "jeff",
        "2": "jim",
        "length": 3,
        "extra": "john"
    },
    "test3": "",
    "nocache": "1398914891264"
}

, поскольку ключ является идентифицируемым и действительным (по крайней мере, в dotNet person=neek&person[]=jeff&person[]=jim или person=neek&person=jeff&person=jim NameValueCollection.Add , если указанный ключ уже существует в целевом экземпляре NameValueCollection указанное значение добавляется в существующий список значений, разделенных запятыми, в виде «значение1, значение2, значение3». ):

Все свойства

, включая унаследованные не перечисляемые: Поскольку es2015 становится все более популярным, я публикую этот ответ, который включает в себя использование генератора и итератора для плавного перебора пар. Как это возможно в других языках, например, Ruby. Хорошо, вот код: Надеюсь, это помогло кому-то.

РЕДАКТИРОВАТЬ:

getQueryStringKey = function(key) {
    return getQueryStringAsObject()[key];
};


getQueryStringAsObject = function() {
    var b, cv, e, k, ma, sk, v, r = {},
        d = function (v) { return decodeURIComponent(v).replace(/ /g, " "); }, //# d(ecode) the v(alue)
        q = window.location.search.substring(1), //# suggested: q = decodeURIComponent(window.location.search.substring(1)),
        s = /([^&;=] )=?([^&;]*)/g //# original regex that does not allow for ; as a delimiter:   /([^&=] )=?([^&]*)/g
    ;

    //# ma(make array) out of the v(alue)
    ma = function(v) {
        //# If the passed v(alue) hasn't been setup as an object
        if (typeof v != "object") {
            //# Grab the cv(current value) then setup the v(alue) as an object
            cv = v;
            v = {};
            v.length = 0;

            //# If there was a cv(current value), .push it into the new v(alue)'s array
            //#     NOTE: This may or may not be 100% logical to do... but it's better than loosing the original value
            if (cv) { Array.prototype.push.call(v, cv); }
        }
        return v;
    };

    //# While we still have key-value e(ntries) from the q(uerystring) via the s(earch regex)...
    while (e = s.exec(q)) { //# while((e = s.exec(q)) !== null) {
        //# Collect the open b(racket) location (if any) then set the d(ecoded) v(alue) from the above split key-value e(ntry) 
        b = e[1].indexOf("[");
        v = d(e[2]);

        //# As long as this is NOT a hash[]-style key-value e(ntry)
        if (b < 0) { //# b == "-1"
            //# d(ecode) the simple k(ey)
            k = d(e[1]);

            //# If the k(ey) already exists
            if (r[k]) {
                //# ma(make array) out of the k(ey) then .push the v(alue) into the k(ey)'s array in the r(eturn value)
                r[k] = ma(r[k]);
                Array.prototype.push.call(r[k], v);
            }
            //# Else this is a new k(ey), so just add the k(ey)/v(alue) into the r(eturn value)
            else {
                r[k] = v;
            }
        }
        //# Else we've got ourselves a hash[]-style key-value e(ntry) 
        else {
            //# Collect the d(ecoded) k(ey) and the d(ecoded) sk(sub-key) based on the b(racket) locations
            k = d(e[1].slice(0, b));
            sk = d(e[1].slice(b   1, e[1].indexOf("]", b)));

            //# ma(make array) out of the k(ey) 
            r[k] = ma(r[k]);

            //# If we have a sk(sub-key), plug the v(alue) into it
            if (sk) { r[k][sk] = v; }
            //# Else .push the v(alue) into the k(ey)'s array
            else { Array.prototype.push.call(r[k], v); }
        }
    }

    //# Return the r(eturn value)
    return r;
};

ES2017 будет включать в себя , который сделает итерацию по пары в объектах еще проще. Теперь известно, что он будет частью стандарта в соответствии с

var name = Arg.get("name");

ts39

var params = Arg.all();

информацией о сцене. ?query=true и #hash=true page Arg.query() и Arg.hash() После просмотра всех ответов здесь hasOwnProperty не требуется для моего собственного использования, потому что мой объект json чистый ;, действительно нет никакого смысла добавлять какую-либо дополнительную обработку javascript. Это все, что я использую:

Проблема с главным ответом на этот вопрос заключается в том, что это неподдерживаемые параметры, помещенные после #, но иногда необходимо также получить это значение.

, который я изменил, чтобы он мог анализировать полную строку запроса со знаком хеша:

var getQueryStringData = function(name) {
    var result = null;
    var regexS = "[\?&#]"   name   "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec('?'   window.location.href.split('?')[1]);
    if (results != null) {
        result = decodeURIComponent(results[1].replace(/ /g, " "));
    }
    return result;
};
function GetQueryStringParams(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://dummy.com/?stringtext=jquery&stringword=jquerybyexample

var tech = GetQueryStringParams('stringtext');
var blog = GetQueryStringParams('stringword');
http://someurl.com?key=value&keynovalue&keyemptyvalue=&&keynovalue=nowhasvalue#somehash
  • обычную пару ключ / значение (?param=value С чем вы столкнулись
  • Ключи без значения (?param, который должен пропускать цепочку прототипов
  • свойства: ?param= Интересно, что люди в этих ответах касались обоих
  • , но никогда не комбинировали их: ?param=1&param=2 С чем вы столкнулись
  • Вы не можете просто ?&& код

потому что это не итератор, и

  • var queryString = window.location.search || '';
    var keyValPairs = [];
    var params      = {};
    queryString     = queryString.substr(1);
    
    if (queryString.length)
    {
       keyValPairs = queryString.split('&');
       for (pairNum in keyValPairs)
       {
          var key = keyValPairs[pairNum].split('=')[0];
          if (!key.length) continue;
          if (typeof params[key] === 'undefined')
             params[key] = [];
          params[key].push(keyValPairs[pairNum].split('=')[1]);
       }
    }
    

вывод

  • params['key'];  // returns an array of values (1..n)
    

ужасно / неэффективно.

  • key            ["value"]
    keyemptyvalue  [""]
    keynovalue     [undefined, "nowhasvalue"]
    
Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector