2011-04-13 25 views
12

Tengo problemas para dividir y analizar window.location.hash correctamente.Dividir y analizar window.location.hash

En primer lugar, obtenemos unos parámetros en picadillo, ex:

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

Como seguramente ve que ha sido creado para la búsqueda. Cuando el usuario hace clic en la página de enlace de paginación se vuelve a cargar con el hash. Hasta aquí todo bien.

creé la función de inicialización() que está llamando cada vez que hay de hash en la 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 está trabajando casi ... Cuando elijo toda búsqueda de hash params está siendo ... corte. Por una razón desconocida para mí. Traté de usar if(params.indexOf('loc')) en lugar de a[0] == "loc" sin ningún tipo de suerte.

¿Podrías echarme una mano?

Editar
Por supuesto, yo estaba usando var a = ... en el bucle, fue sólo copiar y pegar error.

+0

* Cuando elijo toda búsqueda de hash params está siendo ... corte *. No entiendo esta oración ... –

+0

Cuando tengo hash como este '# loc = austria & mr = 1 & min = 10 & max = 89' después de cargar la página es' # loc = austria & mr = 1'. – user948438237

+0

¿Has probado 'if (params [i] .indexOf ('loc'))' ?? –

Respuesta

25

No necesita un bucle, si solo es el valor de loc del hash que está buscando. Esto también debería funcionar.

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

En cuanto a la trunctating del hash después de una recarga de la página: mi humilde opinión que no está relacionado con su bucle.

Editar Un enfoque más moderno y más preciso:

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>

+0

Tienes razón. Ahora me di cuenta de que tengo un error lógico (llamando a la función buildRequestHash() incluso si existe el hash). Gracias. – user948438237

+0

Técnicamente, tiene un error menor si '=' se utiliza sin guardar en una cadena de valores ... piense en el caso "# key1 = foo = bar, alloc = true & loc = ...". No es un gran problema, solo algo en lo que me topé. ¡Aclamaciones! –

+0

También coincide con '# bloc = thing' – Hugo

0

params.indexOf('loc') no devolverá un valor ya que loc no existe dentro de la matriz params. El artículo que está buscando en el ejemplo proporcionado es loc=austria. Si solo está seleccionando con la tecla, entonces necesitaría algún bucle para examinar cada par clave-valor.

1

Si estás usando jQuery, echa un vistazo a la jQuery BBQ plugin

Es "aprovecha el evento HTML5 hashchange ", que básicamente te permite ejecutar el código JavaScript una vez que se ha cambiado el hash.

Además, viene con una poderosa función "depram", que le permite "Analizar la cadena de consulta desde una URL o la ventana.locación actual, deserializarla en un objeto, opcionalmente forzar números, booleanos, nulos e indefinidos valores."

2

Esta debería ser una forma bastante simple de leer desde la ubicación.picadillo:

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 

y luego, podría utilizar

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

y otros parametros que están disponibles dentro de la almohadilla

Cuestiones relacionadas