2010-01-26 14 views
6

Tengo una aplicación web que hace un uso extensivo del identificador de fragmento para manejar el "estado".Identificador de fragmento de URL - simplificar la gestión de estado (javascript)

examplesite.com/#$mode=direct$aa;map=t;time=2003;vid=4;vid=7 

una serie de preguntas:

1) ¿Qué es una buena manera de asignar los diversos "location.hash nombre value-pairs" a las variables para realizar un seguimiento del estado?

1a) ¿Debo hacer un objeto que haga un seguimiento del estado en js o declare variables globales para cada par de valores de nombre?

1b) ¿Hay algún buen complemento jquery para simplificar esto?

1c) Si quiero hacer un seguimiento de algo llamado "color" - debe adjuntarse en todo momento al fragmento (#) y cuál es la forma correcta de verificar si está definido; ¿Se puede mejorar el código a continuación?

var color; 

var hashString = location.hash; 
var nvPairs = hashString.split(";"); 
var nvPair = new Array(); 

for (i = 0; i < nvPairs.length; i++) 
{ 
    var keyValuePair = nvPairs[i].split("="); 
    nvPair[keyValuePair[0]] = keyValuePair[1]; 
} 

if (nvPair['color']) color = nvPair['color'];  

1d) Como algunos nombres se utilizan dos veces ("vid" en el ejemplo anterior) - ¿cómo podría fácilmente almacenar ellos es las variables independientes?

2) Hay 4 diferentes "hashes" Quiero prestar especial atención a:

examplesite.com/ (sin hash)
examplesite.com/#example=5 (contiene "ejemplo")
examplesite.com/#time=2003;vid=4;vid=7;modified=5 (contiene "modificado")
examplesite.com/#time=2003;vid=4; vid = 7 (no contiene "modificado" o "ejemplo")

¿Cómo escribiría una estructura de control que extraiga variables del hash cuando la aplicación carga y comprueba las condiciones anteriores?

3) ¿Cómo se pueden almacenar los estados previos y cómo activar un cambio de estado cuando se presiona el botón de retroceso?

Respuesta

2

me acaba de utilizar un objeto que contiene las matrices, en lugar de una matriz. El código sería algo como:

var color; 

var keyValuePair, 
    hashString = location.hash, 
    nvPairs = hashString.split(";"), 
    nvPair = {}; 

for (var i = 0; i < nvPairs.length; ++i){ 
    keyValuePair = nvPairs[i].split("="); 
    if (keyValuePair[0] in nvPair) 
     nvPair[keyValuePair[0]].push(keyValuePair[1]); 
    else 
     nvPair[keyValuePair[0]] = [keyValuePair[1]]; 
} 

if ('color' in nvPair) color = nvPair['color'][0]; 
+0

Buena idea, gracias por su aporte, realmente útil. – dani

1

creo que la barbacoa de Ben Alman puede ayudarle a: http://benalman.com/projects/jquery-bbq-plugin/

+0

Gracias, comprobé esto, pero parece que no funciona con la cadena de hash de ejemplo dada ... – dani

+1

Actualización: funciona si ";" se reemplazan por "&" - ¡un gran complemento! – dani

+0

No hay problema. Entonces puedes cerrar esta pregunta. – jerone

Cuestiones relacionadas