以编程方式更新哈希而不触发 hashchange 事件?

发布于 2024-11-29 15:40:52 字数 504 浏览 1 评论 0原文

我正在使用 jQuery BBQ 插件将状态推送到 location.hash。

为了防止反馈循环,我想在以编程方式设置状态时暂时禁用 hashchange 侦听器。

我见过这个解决方案: 更改哈希值而不触发 hashchange 事件

不幸的是,这似乎并不存在完全健壮,因为即使我这样做,它有时也会触发:

updateURL(obj){
  $(window).unbind( 'hashchange');
  $.bbq.pushState(obj);
  setTimeout( function() { bindHashChange()}, 500);
}

现在有更好的方法以编程方式推送状态吗?也许另一个 JS 库?

I'm using the jQuery BBQ plugin to push states to the location.hash.

To prevent a feedback loop, I'd like to disable the hashchange listener temporarily while setting the state programmatically.

I've seen this solution:
Change hash without triggering a hashchange event

Unfortunately, it doesn't seem to be perfectly robust as it sometimes triggers even though I do this:

updateURL(obj){
  $(window).unbind( 'hashchange');
  $.bbq.pushState(obj);
  setTimeout( function() { bindHashChange()}, 500);
}

Is there now a better approach to push states programmatically? Perhaps another JS library?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空城旧梦 2024-12-06 15:40:52

超时执行此操作不会可靠地工作。链接答案的重要部分是设置一个您的处理程序知道的标志。请参阅更新的代码问题。

或者,将临时处理程序绑定到负责重新建立处理程序的事件:

function updateState(state, handler) {
    var win = $(window);

    function temporaryHandler() {
        win.unbind('hashchange', temporaryHandler);
        win.bind('hashchange', handler);
    };

    win.unbind('hashchange', handler);
    win.bind('hashchange', temporaryHandler);

    $.bbq.pushState(state);
}

Doing this with a timeout will not work reliably. The important part of the linked answer is setting a flag that your handler knows about. See the updated question for code.

Alternatively, bind a temporary handler to the event that is in charge of reestablishing your handler:

function updateState(state, handler) {
    var win = $(window);

    function temporaryHandler() {
        win.unbind('hashchange', temporaryHandler);
        win.bind('hashchange', handler);
    };

    win.unbind('hashchange', handler);
    win.bind('hashchange', temporaryHandler);

    $.bbq.pushState(state);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文