我将一些状态信息存储在URL片段中(哈希,无论你怎么称呼它)。当我更改Chrome中的window.location.hash
和Safari页面无法重新加载时 - 这就是我想要的行为。当我在Firefox中更改window.location.hash
时,我会重新加载页面。我该如何防止这种情况?
注意:我在URL中存储状态的原因是userA可以将url发送到userB,userB也可以看到相同的页面(由AJAX加载)。
解决方案:对于它的价值,在Firefox(仅限?)中,如果您完全删除包含“#”字符的哈希,页面将重新加载。我最后只是确保不删除整个哈希值。
答案 0 :(得分:1)
有一个名为history
的jQuery插件可以做到这一点。我建议你看一下源代码(上次检查时它不是很大)。它也适用于IE的旧版本,但它真的很讨厌:P
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以在此处找到关于历史记录API的好文章:http://blog.webspecies.co.uk/2011-05-26/html5-history-api-dynamic-websites-like-never-before.html 这对我帮助很大。
答案 3 :(得分:1)
假设这是Firefox的行为(即使只更改哈希部分时重新加载页面)并且无法覆盖,也许您可以改为编写finds the (x,y) position of the anchor target并调用window.scroll(x,y)
的自定义解决方案
答案 4 :(得分:1)
在您提到的帖子上,这是设置hash
的代码:
function (hsh) {
hsh="#"+hsh;
this.current.hash=hsh;
document.location.hash=hsh;
}
以下是读取hash
的代码(例如来自其他网址):
function () {
if(document.location.hash.split("#").pop()==this.current.hash.split("#").pop()) { return; }//this hash was set by code!
var bl=-1;//-1 = none; otherwise, it's a block index.
var cp=-1;
if(document.location.hash.indexOf(Un.HASH_BLOCK_PREFIX)>-1) {
var blkhsh=document.location.hash.substring(Un.HASH_BLOCK_PREFIX.length+1);
var blknum=parseInt(blkhsh,16);
if(!isNaN(blknum)) {
for(bi in Un.BLOCKS.blFrom) {
if(Un.BLOCKS.blFrom[bi]==blkhsh) {
bl=bi; break;
}
}
}
else {
var blkspc=blkhsh.split(Un.HASH_BLOCK_SPACE).join(" ");
for(bi in Un.BLOCKS.blName) {
if(Un.BLOCKS.blName[bi]==blkspc) {
bl=bi; break;
}
}
}
}
else if(document.location.hash!="") {
var hexhsh=document.location.hash.split("#").pop().split(Un.HASH_CP_PREFIX).pop().split("x").pop(); //if the cp_prefix is missing, or if prefixed with x, this will still work :)
if(hexhsh.length==4 && !isNaN(parseInt(hexhsh,16))) {
cp=hexhsh;
for(bi in Un.BLOCKS.blFrom) {
if(Un.BLOCKS.blFrom[bi]>cp) {
bl=bi-1;
break;
}
}
}
}
if(bl>-1) {
Un.selectBlock(bl,(cp==-1 ? 0 : 1));
}
else {
Un.next(1);
Un.setMenuButton($("#BlockButton"),0);
}
if(cp!=-1) {
setTimeout("Un.cpOpen('"+cp+"')",100);
}
}