代码之家  ›  专栏  ›  技术社区  ›  D_N

你能在不影响历史的情况下使用哈希导航吗?

  •  90
  • D_N  · 技术社区  · 15 年前

    恐怕是的 impossible 但是有没有方法可以更改URL的哈希值 不在浏览器历史记录中留下条目 不重新加载 ?还是做同等的?

    就具体情况而言,我正在开发一些基本的哈希导航:

    //hash nav -- works with js-tabs
    var getHash = window.location.hash;
    var hashPref = "tab-";
    function useHash(newHash) {
        //set js-tab according to hash
        newHash = newHash.replace('#'+hashPref, '');
        $("#tabs li a[href='"+ newHash +"']").click();
    }
    function setHash(newHash) {
        //set hash according to js-tab
        window.location.hash = hashPref + newHash;
    
        //THIS IS WHERE I would like to REPLACE the location.hash
        //without a history entry
    
    }
        // ... a lot of irrelavent tabs js and then....
    
        //make tabs work
        $("#tabs.js-tabs a").live("click", function() {
            var showMe = $(this).attr("href");
            $(showMe).show();
            setHash(showMe);
            return false;
        });
        //hash nav on ready .. if hash exists, execute
        if ( getHash ){
            useHash(getHash);
        }
    

    显然,使用jquery。想法是 在这个特定的实例中 1)让用户返回每一个标签更改可以有效地“断开后退按钮”,通过堆积不必要的引用,以及2)不保留他们的标签 目前在 如果他们点击刷新是一种烦恼。

    5 回复  |  直到 5 年前
        1
  •  75
  •   Lucia    10 年前

    location.replace("#hash_value_here"); 在我发现iOS Chrome不起作用之前,我一直工作得很好。在这种情况下,使用:

    history.replaceState(undefined, undefined, "#hash_value")
    

    history.replaceState() 操作与history.pushstate()完全相同,只是replaceState()修改了当前的历史记录条目,而不是创建一个新条目。

    记住保持 # 否则,URL的最后一部分将被更改。

        2
  •  94
  •   Matt Miguel Pragier    13 年前
    location.replace("#hash_value_here"); 
    

    以上这些似乎都是你想要的。

        3
  •  6
  •   Community paulsm4    7 年前

    编辑: 几年前,浏览器已经进化了。

    @Luxiyalu的 answer 是去的路吗

    —— 旧答案 ——

    我也认为这是不可能的(此时)。但是,如果不使用哈希值,为什么需要更改它呢?

    我相信我们将散列值用作程序员的主要原因是让用户为我们的页面添加书签,或者在浏览器历史记录中保存一个状态。如果您不想这样做,那么只需将状态保存在一个变量中,然后从那里开始工作。

    我认为使用哈希的原因是使用我们无法控制的值。如果您不需要它,那么它可能意味着您可以控制所有的事情,所以只需将状态存储在一个变量中并使用它。(我喜欢重复)

    我希望这对你有帮助。也许你的问题有一个简单的解决办法。

    更新: 这个怎么样?

    1. 设置第一个哈希,并确保它保存在浏览器历史记录中。
    2. 选择新选项卡时,执行 window.history.back(1) ,这将使历史从第一个init散列返回。
    3. 现在您设置了新的哈希,因此tabbing将只在历史记录中创建一个条目。

    您可能需要使用一些标志,以知道是否可以通过返回来“删除”当前条目,或者您只是跳过第一步。 为了确保,当您强制 history.back .

        4
  •  -1
  •   Ayman Farhat    11 年前

    您始终可以创建一个事件侦听器来捕获超链接上的单击事件,并在回调函数put e.preventDefault()中,这将阻止浏览器将其插入历史记录。

        5
  •  -1
  •   Robert Mars_win    9 年前
    history.replaceState(undefined, undefined, "#profileInfo")
    

    在哪里? 纵横信息 是你的身份证。