2010-11-16 3 views
38

Ищете способ разбора пары ключей выхода из хэш/фрагмента URL в объект/ассоциативный массив с JavaScript/JQueryСинтаксический URL хэш-идентификатор/фрагмент с JavaScript

+0

Вы, вероятно, могли бы сделать это с довольно простым регулярным выражением. Какой «формат» являются парами ключ/значение в URL-адресе? – gnarf

+0

То же, что и в строке запроса - см. Мой ответ – Yarin

ответ

31

Отъезд: jQuery BBQ

JQuery барбекю предназначен для разбора вещей из URL (строка запроса или фрагмент), и идет немного дальше, чтобы упростить историю фрагментов на основе. Это плагин jQuery, который ищет Ярин, прежде чем он соединит решение pure js. В частности, функция deparam.fragment() выполняет эту работу. Взгляни!

(Сайт поддержки, над которым я работаю, использует асинхронный поиск, а потому, что барбекю делает тривиальным привязывать целые объекты к фрагменту, который я использую для «сохранения» моих параметров поиска. Это дает моим пользователям историю истории для их поиск, а также позволяет им создавать закладки полезные поиски Лучше всего, когда QA находит поиска дефекта они могут связать прямо на проблемные результаты)

+0

@ Hovis - это действительно потрясающий плагин, и на самом деле я переключился на его использование. Даю вам ответ, поскольку это намного лучший вариант, чем функция с нуля. – Yarin

+0

Я собираюсь начать использовать это. –

+3

Барбекю не работает с JQuery 1.9+ и выдает исключения при загрузке. Он не обновлялся более трех лет. Я не уверен, что BBQ по-прежнему является хорошей рекомендацией. Вы можете взломать его, чтобы заставить его работать, см. Это: https://github.com/cowboy/jquery-bbq/pull/41 – nostromo

3

Я использую jQuery URL Parser библиотеку.

+2

Это анализирует сам URL-адрес, а не элементы хэша. Полезно, но не то, о чем стоит исходный вопрос. –

46

Вот она, редактировался этого query string parser:

function getHashParams() { 

    var hashParams = {}; 
    var e, 
     a = /\+/g, // Regex for replacing addition symbol with a space 
     r = /([^&;=]+)=?([^&;]*)/g, 
     d = function (s) { return decodeURIComponent(s.replace(a, " ")); }, 
     q = window.location.hash.substring(1); 

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

    return hashParams; 
} 

Нет JQuery/плагин требуется

Update:

Я теперь рекомендовать jQuery BBQ plugin согласно ответу Hovis в , Он охватывает все проблемы синтаксического анализа.

+9

Можете ли вы подробно остановиться на «проблемах хеш-анализа»?У меня такая же потребность, и я не вижу ничего плохого в вашем ответе. – Christophe

+0

@ Кристоф - я честно не помню. Я уверен, что мой код работает нормально, но BBQ - это полный плагин с событиями hashchange, разбор строки запроса и т. Д., Поэтому, возможно, это то, что я имел в виду. – Yarin

+2

Для базовой обработки ваш скрипт является удивительным !! Слишком часто мы по умолчанию используем библиотеки jQuery для выполнения основных задач. Благодаря! – SomethingOn

0

Мой ответ this question должен делать то, что вы ищете:.!

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; 
}; 
-1

Возможно, вы захотите зарегистрироваться jsuri. Кажется, это хорошо работает для меня.

+1

Ссылка теперь мертва. –

0

Это JQuery API делает синтаксического анализа хэш-тегов: https://jhash.codeplex.com/

// get the "name" querystring value 
var n = jHash.val('name'); 

// get the "location" querystring value 
var l = jHash.val('location'); 

// set some querystring values 
jHash.val({ 
    name: 'Chris', 
    location: 'WI' 
}); 
+0

используйте ответ gatoatigrado, это лучше, чем тот, который я опубликовал – SomeoneElse

0

Я искал через кучу ответов на эту проблему и ликвидируется брусчатки их вместе, используя одну линию с reduce:

const hashObj = location.hash.replace('#', '').split('&').reduce((prev, item) => Object.assign({[item.split('=')[0]]: item.split('=')[1]}, prev), {}); 

В этой одной линии, очевидно, много чего происходит. Его можно переписать как это для clariry:

const hashObj = location.hash.replace('#', '').split('&').reduce((prev, item) => { 
    return Object.assign({[item.split('=')[0]]: item.split('=')[1]}, prev); 
}, {}); 
4

Делайте это в чистом Javascript:

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; 
}, {}); 
Смежные вопросы