6

我有一个 Web 应用程序,它广泛使用片段标识符来处理“状态”。

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

几个问题:

1) 将各种“location.hash 名称值对”分配给变量以跟踪状态的好方法是什么?

1a) 我应该创建一个对象来跟踪 js 中的状态还是为每个名称值对声明全局变量?

1b)是否有任何好的 jquery 插件来简化这个?

1c)如果我想跟踪称为“颜色”的东西 - 是否应该始终将其附加到片段(#)以及检查它是否已定义的正确方法是什么;下面的代码可以改进吗?

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)由于某些名称被使用了两次(上例中的“vid”) - 我怎样才能轻松地将它们存储为单独的变量?

2)我要特别注意4种不同的“哈希”:

examplesite.com/ (无哈希)
examplesite.com/#example=5 (包含“示例”)
examplesite.com/#time=2003;vid=4;vid=7;modified=5 (包含“修改”)
示例站点。 com/#time=2003;vid=4;vid=7 (不包含“修改”或“示例”)

当应用程序加载并检查上述条件时,您将如何编写一个从哈希中提取变量的控制结构?

3)如何存储先前的状态以及按下后退按钮时如何触发状态更改?

4

3 回答 3

2

我只会使用包含数组的对象,而不是数组。代码看起来像:

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];
于 2010-01-30T17:44:18.303 回答
1

我相信 Ben Alman 的 BBQ 可以帮到你:http ://benalman.com/projects/jquery-bbq-plugin/

于 2010-01-26T13:21:01.723 回答
0

这有点晚了,但是 jQuery 1.9 导致 Ben 的插件($.browser)出现问题

可以在这里找到一个分叉的更正版本:
https

://github.com/georgekosmidis/jquery-hashchange 和一个帮助处理哈希更改的插件:
https ://github.com/georgekosmidis/jquery-hashhandle

更多信息在这里: http:
//mycodepad.wordpress.com/2013/12/19/jquery-making-ajax-applications-crawlable/

于 2013-11-29T15:48:18.110 回答