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

Некоторые из опубликованных ecmascript здесь решений неэффективны. Повторять plugins поиск по регулярному выражению plugin каждый раз, когда скрипту vanilla-js требуется доступ к параметру, совершенно plugins не нужно, достаточно одной javascript-dom единственной функции для query-string разделения параметров на js объект стиля ассоциативного plugin массива. Если вы не работаете vanilla-js с API истории HTML 5, это url необходимо только один раз js при загрузке страницы. Другие urls предложения здесь также не query-string могут правильно декодировать javascript-execution 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%20&empty

Результат:

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

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

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

Это query-string можно легко улучшить для plugins обработки строк запроса в vanilla-js стиле массива. Примером этого vanilla-javascript является here, но поскольку параметры plugin стиля массива не определены url в RFC 3986, я не буду засорять этот javascript-execution ответ исходным кодом. For those interested in a "polluted" version, look at campbeln's answer below.

Кроме javascript-library того, как указано в комментариях, ; является plugins допустимым разделителем для url пар key=value. Потребовалось бы более urls сложное регулярное выражение vanillajs для обработки ; или &, что, я query-string думаю, не нужно, потому что javascript-dom ; используется редко, и я javascript-execution бы сказал, что даже маловероятно, что url будут использоваться оба. Если js вам нужно поддерживать ; вместо urls &, просто поменяйте их местами vanilla-js в регулярном выражении.


Если вы используете язык предварительной обработки на стороне сервера, вы можете использовать его собственные функции JSON, чтобы сделать за вас тяжелую работу. Например, в PHP вы можете написать:

Намного javascript-library проще!

ОБНОВЛЕНО

Новой возможностью js будет получение повторяющихся javascript параметров, как показано javascript-library ниже myparam=1&myparam=2. спецификации не существует, однако vanilla-js большинство текущих подходов javascript следуют за созданием массива.

myparam = ["1", "2"]

Итак, вот javascript способ управления этим:

let urlParams = {};
(window.onpopstate = function () {
    let 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)) {
        if (decode(match[1]) in urlParams) {
            if (!Array.isArray(urlParams[decode(match[1])])) {
                urlParams[decode(match[1])] = [urlParams[decode(match[1])]];
            }
            urlParams[decode(match[1])].push(decode(match[2]));
        } else {
            urlParams[decode(match[1])] = decode(match[2]);
        }
    }
})();

javascript

url

plugins

query-string

2022-11-21T17:27:36+00:00