2009-08-05 12 views
5

Quiero almacenar pares clave/valor en el URI de después de que el hash para su uso en el lado del cliente, así:almacenamiento de datos en los URI Después de Hash

http://www.foo.com/index.html#foo=bar&baz=quux 

¿Hay una solución pre-existente que ya hace esto o ¿Debería lanzar el mío? Ya estoy usando JQuery, por lo que una solución JQuery sería especialmente bienvenida.

Mi idea original era usar una expresión regular, pero eso se complica, especialmente cuando se agrega la necesidad de escapar de las claves y los valores.

EDIT: Déjenme aclarar. Quiero hacer algo como esto:

foo = hash.get('foo'); 
hash.set('bar','baz'); 

Respuesta

7

Para todos los interesados, aquí está la solución que se me ocurrió: de

/** 
* Copyright 2009 by David Kerkeslager 
* Released under the BSD License (http://davidkerkeslager.com/license.txt). 
* 
* This library defines an object-literal which allows one to store key/value pairs after the hash (#) in the URI. 
* The syntax of the storage is modeled after the way that GET variables are stored after the question mark (?) in 
* the URI. 
* 
* Example URI: "http://www.foo.com/index.html#foo=bar&baz=quux" 
* 
* Note: it should be obvious that this should not be used for storing private data of any kind. 
*/ 

var URIHash = 
{ 
    /** 
    * Dump the contents of the URI hash into an associative array. If the hash is invalid, the method returns 
    * undefined. 
    */ 
    dump : function() 
    { 
     var hash = document.location.hash; 
     var dump = new Array(); 

     if(hash.length == 0) return dump; 

     hash = hash.substring(1).split('&'); 

     for(var key in hash) 
     { 
      var pair = hash[key].split('='); 

      if(pair.length != 2 || pair[0] in dump) 
       return undefined; 

      // escape for storage 
      dump[unescape(pair[0])] = unescape(pair[1]); 
     } 

     return dump; 
    }, 

    /** 
    * Takes an associative array and stores it in the URI as a hash after the # prefix, replacing any pre- 
    * existing hash. 
    */ 
    load : function(array) 
    { 
     var first = true; 
     var hash = ''; 

     for(var key in array) 
     { 
      if(!first) hash += '&'; 
      hash += escape(key) + '=' + escape(array[key]); 
     } 

     document.location.hash = hash; 
    }, 

    /** 
    * Get the value of a key from the hash. If the hash does not contain the key or the hash is invalid, 
    * the function returns undefined. 
    */ 
    get : function(key) 
    { 
     return this.dump()[key]; 
    }, 

    /** 
    * Set the value of a key in the hash. If the key does not exist, the key/value pair is added. 
    */ 
    set : function(key,value) 
    { 
     var dump = this.dump(); 
     dump[key] = value; 

     var hash = new Array(); 

     for(var key in dump) 
      hash.push(escape(key) + '=' + escape(dump[key])); 

     document.location.hash = hash.join('&'); 
    } 
} 
1

Puede almacenar datos JSON después del hash. Estuve investigando eso, evitaría el análisis sintáctico, aunque podrías abrirte a la manipulación.

+0

Eso es un poco más pesado de lo que quería; pares clave/valor son todo lo que es necesario. Sin embargo, a falta de una opción más limpia, podría ir con esto, solo por el beneficio de poder usar una opción preempaquetada. Ya veremos. – Imagist

Cuestiones relacionadas