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

时间:2011-06-10 22:02:41

标签: javascript

我将一些状态信息存储在URL片段中(哈希,无论你怎么称呼它)。当我更改Chrome中的window.location.hash和Safari页面无法重新加载时 - 这就是我想要的行为。当我在Firefox中更改window.location.hash时,我会重新加载页面。我该如何防止这种情况?

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


解决方案:对于它的价值,在Firefox(仅限?)中,如果您完全删除包含“#”字符的哈希,页面将重新加载。我最后只是确保不删除整个哈希值。

5 个答案:

答案 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);
    }
}