2009-08-05 13 views
5

voglio memorizzare coppie chiave/valore in notazione URI del dopo l'hash per l'utilizzo sul lato client in questo modo:Memorizzazione di dati in URI Dopo Hash

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

C'è una soluzione pre-esistente che già fa questo o dovrei arrotolare il mio? Sto già usando JQuery, quindi una soluzione JQuery sarebbe particolarmente gradita.

La mia idea originale era di usare una regex, ma questo si complica, specialmente quando si aggiunge la necessità di sfuggire a entrambe le chiavi e valori.

EDIT: Vorrei chiarire. Voglio fare qualcosa di simile:

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

risposta

7

Per chiunque sia interessato, ecco la soluzione mi è venuta: JQuery Hashchange Plugin di

/** 
* 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

È possibile memorizzare i dati JSON dopo l'hash. Ho cercato di farlo - eviterebbe l'analisi, sebbene tu possa aprirti alla manipolazione.

+0

Questo è un po 'più pesante di quanto avrei voluto; le coppie chiave/valore sono tutto ciò che è necessario. In assenza di un'opzione più pulita, potrei andare avanti con questo, solo per il vantaggio di poter usare un'opzione preconfezionata. Vedremo. – Imagist

Problemi correlati