Подтвердить что ты не робот

Разделить и разобрать window.location.hash

Я столкнулся с проблемами с расщеплением и разбором window.location.hash правильно.

Прежде всего, мы получаем несколько параметров в хеш, ex:

#loc=austria&mr=1&min=10&max=89

Как вы наверняка видите, он был создан для поиска. Когда пользователь нажимает на страницу ссылок на страницы, перезагружается хешем. Пока все хорошо.

Я создал функцию initialise(), которая вызывает каждый раз, когда hash в URL-адресе:

if (window.location.hash) {
    var params = (window.location.hash.substr(1)).split("&");

    for (i = 0; i < params.length; i++)
    {
        var a = params[i].split("=");
        // Now every parameter from the hash is beind handled this way
        if (a[0] == "loc")
        {
            locationList(a[1]);
        }
    }
}

Everythig почти работает... Когда я выбираю все параметры поиска, хэш... режет. По неизвестной причине для меня. Я старался использовать if( params.indexOf('loc') ) вместо a[0] == "loc" без везения.

Не могли бы вы одолжить мне руку?

Edit
Конечно, я использовал var a =... в цикле, это была только ошибка копирования-вставки.

4b9b3361

Ответ 1

Вам не нужен цикл, если это только значение loc из хеша. Это также должно работать.

var lochash    = location.hash.substr(1),
    mylocation = lochash.substr(lochash.indexOf('loc='))
                  .split('&')[0]
                  .split('=')[1];
if (mylocation) {
   locationList(myLocation);
}

Относительно транслирования хэша после перезагрузки страницы: imho, который не связан с вашим циклом.

Изменить Более современный и более точный подход:

const result = document.querySelector("#result");
const hash2Obj = "loc=austria&mr=1&min=10&max=89"
      .split("&")
      .map( el => el.split("=") )
      .reduce( (pre, cur) => { pre[cur[0]] = cur[1]; return pre; }, {} );

result.textContent += `loc => ${hash2Obj.loc}
----
*hash2Obj (stringified):
${JSON.stringify(hash2Obj, null, ' ')}`;
<pre id="result"></pre>

Ответ 2

Это должен быть более простой способ чтения из location.hash:

    var hash = window.location.hash.substring(1);
    var params = {}
    hash.split('&').map(hk => { 
      let temp = hk.split('='); 
        params[temp[0]] = temp[1] 
    });
    console.log(params); //Here are the params to use

а затем вы можете использовать

params.access_token //access_token 
params.id //id 

и другие параметры, доступные внутри хэша

Ответ 3

Если вы используете jQuery, посмотрите плагин jQuery BBQ

Он "использует событие HTML5 hashchange", что в основном позволяет вам выполнить код JavaScript после изменения хэша.

Furthemore, он поставляется с мощной функцией depram ", которая позволяет вам" Разбирать строку запроса из URL-адреса или текущего окна .location, десериализация его в объект, необязательное принуждение чисел, булевых, нулевых и undefined значений. "

Ответ 4

params.indexOf('loc') не вернет значение, поскольку loc не существует в массиве params. Элемент, который вы ищете в представленном примере, loc=austria. Если вы выбираете только ключ, вам понадобится цикл для проверки каждой пары значений ключа.