JavaScript: получить и установить параметры хеша URL?

Как вы получаете и задаете параметры хеша URL в чистом JavaScript?

Например, я хотел бы использовать такие параметры: myurl.com/#from=2012-01-05&to=2013-01-01

И я хотел бы быть в состоянии получить и установить from и to параметров выше.

Я счастлив использовать API истории HTML5, если это лучший способ сделать что-то.

Ответы

Ответ 1

Если вы хотите проанализировать URL-адрес хэша, это работает:

var hash = window.location.hash.substr(1);

var result = hash.split('&').reduce(function (result, item) {
    var parts = item.split('=');
    result[parts[0]] = parts[1];
    return result;
}, {});

http://example.com/#from=2012-01-05&to=2013-01-01

становится

{'from': '2012-01-05', 'to':'2013-01-01'}

Ответ 2

Вы можете установить хеш с помощью:

window.location.hash = "new value";

и (в новых браузерах) прослушивать изменения с помощью:

window.addEventListener("hashchange", function () {
});

Если вам нужна поддержка браузеров, которые не поддерживают "hashchange" вы захотите использовать код, написанный другими людьми, например, плагин jquery history.

Ответ 3

Другие ответы не решают проблему

У меня есть более простой подход:

Скопируйте текущие хеш-параметры в фиктивный URL как searchParameters. Теперь вы можете обрабатывать хеш-параметры как параметры поиска и затем копировать их обратно:

Простая функция

function setOrUpdateHashParameter( hashParameterName, hashParameterValue ) {
    let theURL              = new URL('https://dummy.com');             // create dummy url
    theURL.search           = window.location.hash.substring(1);        // copy current hash-parameters without the '#' AS search-parameters
    theURL.searchParams.set( hashParameterName, hashParameterValue );   // set or update value with the searchParams-API
    window.location.hash    = theURL.searchParams;                      // Write back as hashparameters
}

Ответ 4

Для нескольких параметров:

const href = window.location.href;
const params = href.split('?')[1];

// Be sure url params exist
if (params && params !== '') {
    const result = params.split('&').reduce(function (res, item) {
        const parts = item.split('=');
        res[parts[0]] = parts[1];
        return res;
    }, {});
}

Поэтому, когда href=https://www.example.net/page.html#/page1?foo=bar&token=123abc result оценивается как {foo: "bar", token: "123abc"}.

Эта структура требует, чтобы URL имел знак вопроса ? перед параметрами, знак равенства = между ключом и значением переменной и символ & между каждой парой ключ/значение.

Ответ 5

На основе ответа Maart здесь приведена версия, которая возвращает отредактированный URL-адрес, а не применяет изменение к текущему окну.

function setHashParam(url, name, value) {

    // Create URL objects for the url we want to change and a dummy url (requires a polyfill for IE)
    var urlObj = new URL(url);
    var dummyObj = new URL('https://dummy.com');

    // Copy current hash-parameters without the '#' as search-parameters
    dummyObj.search = urlObj.hash.substring(1);

    // Set or update value with the searchParams-API (requires a polyfill for IE)
    dummyObj.searchParams.set(name, value);

    // Write back as hashparameters
    urlObj.hash = dummyObj.searchParams;

    return urlObj.href;
}

Обратите внимание, что для того, чтобы этот ответ (и ответ Маарта) работали в IE, им необходимы полизаполнения для конструктора URL и API параметров поиска.

Ответ 6

Это моё решение

arr = location.search.replace('?', '').split('&').map(x => x.split('=')).map(x => {
    let keyName = x[0];
    let val = x[1];
    let object = {};
    object[keyName] = val;
    return object;
});

obj = {}

arr.forEach(function(x) {
    let key = Object.keys(x)[0];
    obj[key] = x[key];
});

console.log(obj);

В основном с помощью location.search мы получаем правую часть URL-адреса после пути (запрос соответствует параметру).

location.search также возвращает '?' символ, замените его пробелом, затем разделите символом '& amp;', отобразите и разделите символом '=', чтобы получить массив un наподобие

[['term', 'hello'], ['lang', 'es']]

Затем соберите объект так, как вы хотели

arr = "?safe=active&source=hp&ei=c4Q8XcOPFd3F5OUP7e242Ag&q=hola&oq=hola&gs_l=psy-ab.3..0l5j0i131j0l2j0i131j0.1324.1667..1798...1.0..0.264.744.1j3j1......0....1..gws-wiz.....10..35i39.-_FkFlX_Muw&ved=0ahUKEwiDlaTgytXjAhXdIrkGHe02DosQ4dUDCAU&uact=5".replace('?', '').split('&').map(x => x.split('=')).map(x => {
    let keyName = x[0];
    let val = x[1];
    let object = {};
    object[keyName] = val;
    return object;
});

obj = {}

arr.forEach(function(x) {
    let key = Object.keys(x)[0];
    obj[key] = x[key];
});

console.log(obj);