Javascript 如何在不重新加载页面的情况下更改Firefox window.location.hash?

Javascript 如何在不重新加载页面的情况下更改Firefox window.location.hash?,javascript,Javascript,我将一些状态信息存储在URL片段中(散列,不管你怎么称呼它)。当我在Chrome中更改窗口.location.hash时,Safari页面不会重新加载-这是我想要的行为。当我在Firefox中更改window.location.hash时,我会重新加载页面。我如何防止这种情况 注意:我将状态存储在URL中的原因是,userA可以将URL发送给userB,userB可以看到相同的页面(由AJAX加载) 解决方案:无论如何,在Firefox(仅?)中,如果完全删除包含“#”字符的散列,页面将重新加

我将一些状态信息存储在URL片段中(散列,不管你怎么称呼它)。当我在Chrome中更改
窗口.location.hash
时,Safari页面不会重新加载-这是我想要的行为。当我在Firefox中更改
window.location.hash
时,我会重新加载页面。我如何防止这种情况

注意:我将状态存储在URL中的原因是,userA可以将URL发送给userB,userB可以看到相同的页面(由AJAX加载)



解决方案:无论如何,在Firefox(仅?)中,如果完全删除包含“#”字符的散列,页面将重新加载。我最后只是确保不删除整个散列。

有一个名为
history
的jQuery插件可以做到这一点。我建议您看看源代码(上次我检查时它不是很大)。它也适用于IE的旧版本,但它真的很糟糕:P

你可以在这里找到一篇关于历史API的好文章:


这对我帮助很大。

假设这是Firefox的行为(即使只更改散列部分,也会重新加载页面),并且它无法被覆盖,也许你可以编写一个自定义解决方案,然后调用。

在你提到的帖子中,下面是设置散列的代码:

function (hsh) {
    hsh="#"+hsh;
    this.current.hash=hsh;
    document.location.hash=hsh;
}
下面是读取
哈希值的代码(例如,从另一个URL):


使用
preventDefault
?我建议找到另一种存储/缓存状态信息的方法,而不是使用
window.location
方法,例如在cookie或javascript
var
中。您可能需要提供更多信息和测试页面。我从未在Firefox中见过这种行为。例如,使用FF转到并单击任意字符——您应该看到哈希更改,但不会重新加载页面(至少,在我测试过的所有机器上都会发生这种情况,使用FF 4和FF 3.6)。这将使用document.location.hash来更改哈希。@pixelboby请参阅上面帖子中的注释是的,这是一个非常酷的效果。我明白你想做什么;它或多或少是书签。我在chrome调试器中检查了代码。我会在下面贴个帖子。
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);
    }
}