2010-11-16 28 views
38

Buscando una manera para analizar pares de claves fuera del hash/fragmento de un URL en un objeto/matriz asociativa con JavaScript/JQueryde análisis de URL hash con JavaScript

+0

Probablemente podría hacerlo con una bastante simple expresión regular. ¿Qué "formato" son los pares clave/valor en la URL? – gnarf

+0

Igual que en una cadena de consulta: vea mi respuesta – Yarin

Respuesta

31

Salida: jQuery BBQ

jQuery barbacoa está diseñado para analizar las cosas desde la dirección URL (cadena de consulta o fragmento), y va un poco más lejos de simplificar la historia basada en el fragmento. Este es el plugin de jQuery que Yarin estaba buscando antes de armar una solución de js pura. Específicamente, la función deparam.fragment() hace el trabajo. ¡Echar un vistazo!

(El sitio de soporte en el que estoy trabajando utiliza una búsqueda asincrónica, y porque BBQ hace que sea trivial meter objetos enteros en el fragmento, lo uso para 'persistir' mis parámetros de búsqueda. búsquedas, y también les permite marcar búsquedas útiles lo mejor de todo, cuando se encuentra un defecto de control de calidad de búsqueda que se pueden vincular directamente a los resultados problemáticos)

+0

@ Hovis: este es realmente un plugin impresionante, y de hecho también lo he usado. Le doy la respuesta, ya que es una opción mucho mejor que mi función de cero. – Yarin

+0

Voy a empezar a usar esto. –

+3

La barbacoa no funciona bien con Jquery 1.9+ y arroja excepciones en la carga. No ha sido actualizado en más de tres años. No estoy seguro de que la barbacoa todavía sea una buena recomendación. Es posible que pueda hackearlo para que funcione, consulte esto: https://github.com/cowboy/jquery-bbq/pull/41 – nostromo

3

estoy usando jQuery URL Parser biblioteca.

+2

Esto analiza la url en sí misma, no los elementos hash. Útil, pero no de lo que se trata la pregunta original. –

46

Aquí está, modificado de esta 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; 
} 

Sin jQuery/plug-in requerido

Actualización:

Ahora estoy recomendando el jQuery BBQ plugin según la respuesta de Hovis . Cubre todos los problemas de análisis hash.

+9

¿Podría dar más detalles sobre los "problemas de análisis hash"?Tengo la misma necesidad y no veo nada malo en tu respuesta. – Christophe

+0

@ Christophe- Honestamente, no puedo recordar. Estoy seguro de que mi código funciona bien, pero la barbacoa es un complemento total con eventos de intercambio, análisis de cadenas de consulta, etc., así que probablemente eso es lo que quise decir ... – Yarin

+2

¡Para el manejo básico, el script es increíble! Con demasiada frecuencia, utilizamos las bibliotecas jQuery de forma predeterminada para las tareas básicas. ¡Gracias! – SomethingOn

0

Mi respuesta a this question debe hacer lo que usted está buscando:.!

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

Es posible que desee comprobar jsuri. Parece que me funciona bien.

+1

El enlace ahora está muerto. –

0

Este jQuery API hace hash tags de análisis: 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

use la respuesta de gatoatigrado, es mejor que la que publiqué – SomeoneElse

0

que estaba buscando a través de un montón de respuestas para este problema y terminó improvisar juntos usando una línea con reduce:

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

Obviamente, hay muchas cosas sucediendo en esa línea. Se puede reescribirse como esto para clariry:

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

hacer esto en JavaScript puro:

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; 
}, {}); 
Cuestiones relacionadas