【问题标题】:Change hash without triggering a hashchange event在不触发 hashchange 事件的情况下更改哈希
【发布时间】:2010-11-05 14:17:31
【问题描述】:

我正在使用哈希来动态加载内容。为了使后退按钮起作用,我正在捕获哈希更改。但是有时我需要在不触发散列更改函数的情况下更改散列(例如,当页面被重定向到服务器端时,我需要在内容返回后更新散列。)

我想出的最佳解决方案是取消绑定 hashchange 事件,进行更改然后重新绑定它。但是,由于这种情况是异步发生的,我发现它重新绑定太快并且仍然捕获哈希更改。

我目前的解决方案很差:在 setTimeout 中重新绑定。有人有更好的主意吗?

    $(window).unbind( 'hashchange', hashChanged);
    window.location.hash  = "!" + url;
    setTimeout(function(){
        $(window).bind( 'hashchange', hashChanged);
    }, 100);


编辑:
Amir Raminfar 的建议促使我找到了一个不需要超时的解决方案。 我添加了一个类变量

_ignoreHashChange = false;

当我想静默更改哈希时,我会这样做:

_ignoreHashChange = true;
window.location.hash  = "!" + url;

哈希更改事件会这样做:

function hashChanged(event){
    if(_ignoreHashChange === false){
        url = window.location.hash.slice(2);
        fetchContent(url);
    }
    _ignoreHashChange = false;
}

【问题讨论】:

  • 你可能想看看 Cowboy 的 BBQ 库,它让你可以很好地控制 Back 和 Hashchange:benalman.com/code/projects/jquery-bbq/docs/files/…
  • 一个不错的简单解决方案,您应该将其作为答案
  • 唯一剩下的就是在设置_ignoreHashChange=true之前检查新的哈希值不等于旧的哈希值;
  • 你在哪里定义 hashChanged 事件?
  • 存储 _ignoreHashChange 的原始值并重置为该值可能会更好。例如var _ = _ignoreHashChange; [...]; _ignoreHashChange = _

标签: javascript jquery


【解决方案1】:

您可以使用 history.replaceState 并附加哈希值,以替换当前 URI 而不会触发 hashchange 事件:

var newHash = 'test';

history.replaceState(null, null, document.location.pathname + '#' + newHash);

JSFiddle example

【讨论】:

  • history.replaceState 也不会将 hashchange 推送到历史记录中,但是如果您愿意,可以使用 history.pushState ;)
【解决方案2】:

你可以有这样的功能:

function updateHash(newHash){
  ...
  oldHash = newHash
}

然后在你的 setTimeOut 中你需要做

function(){
  if(oldHash != currenHash){
    updateHash(currenHash);
  }
}

所以现在您可以手动调用更新哈希,它不会被事件触发。您还可以在 updateHash 中有更多参数来做其他事情。

顺便问一下,你看过 jquery 历史插件吗? http://tkyk.github.com/jquery-history-plugin/

【讨论】:

  • 这需要一个设定的时间间隔,但是是的,原则上这是可行的。谢谢。
  • 是的,我看过几个插件。对于我的需要,它们都过于臃肿或错误。
  • 您提示我找到一个不需要超时的更好解决方案。有关详细信息,请参阅我的主要帖子中的编辑。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多