Разделить и разобрать window.location.hash - PullRequest
19 голосов
/ 13 апреля 2011

У меня проблемы с разбивкой и синтаксическим анализом window.location.hash.

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

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

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

Я создал функцию initialise (), которая вызывает каждый раз, когда в 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]);
        }
    }
}

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

Не могли бы вы мне помочь?

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

Ответы [ 4 ]

37 голосов
/ 13 апреля 2011

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

var lochash    = location.hash.substr(1),
    mylocation = lochash.substr(lochash.search(/(?<=^|&)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(v => v.split("="))
      .reduce( (pre, [key, value]) => ({ ...pre, [key]: value }), {} );
          

result.textContent += `loc => ${hash2Obj.loc}
----
*hash2Obj (stringified):
${JSON.stringify(hash2Obj, null, ' ')}`;
9 голосов
/ 04 декабря 2017

Это должен быть более простой способ чтения из 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 

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

2 голосов
/ 13 апреля 2011

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

Он «использует событие хеширования HTML5», которое в основном позволяет выполнять код JavaScript после хешированияизменен.

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

0 голосов
/ 13 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...