Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在不触发hashchange事件的情况下更改哈希_Javascript_Jquery - Fatal编程技术网

Javascript 在不触发hashchange事件的情况下更改哈希

Javascript 在不触发hashchange事件的情况下更改哈希,javascript,jquery,Javascript,Jquery,我正在使用哈希动态加载内容。为了使后退按钮工作,我正在捕获哈希更改。然而,有时我需要在不触发hash changed函数的情况下更改hash(例如,当页面被重定向到服务器端时,我需要在内容返回后更新hash) 我提出的最佳解决方案是解除hashchange事件的绑定,进行更改,然后重新绑定它。但是,由于这种情况是异步发生的,我发现它重新绑定的速度太快,仍然捕获哈希更改 目前我的解决方案非常糟糕:在setTimeout中重新绑定。有人有更好的主意吗 $(window).unbind( 'h

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

我提出的最佳解决方案是解除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;
}

您可以使用如下函数:

function updateHash(newHash){
  ...
  oldHash = newHash
}
然后在setTimeOut中,您需要执行以下操作

function(){
  if(oldHash != currenHash){
    updateHash(currenHash);
  }
}
因此,现在您可以手动调用updatehash,它不会被事件触发。您还可以在updateHash中使用更多参数来执行其他操作


顺便问一下,你看过jquery历史插件了吗

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

var newHash = 'test';

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

需要设定一个时间间隔,但原则上这是可行的。谢谢。是的,我看过几个插件。对于我的需求来说,它们都太臃肿或太多了。你促使我找到了一个不需要暂停的更好的解决方案。有关详细信息,请参见我的主要帖子中的编辑。感谢您的帮助您可能想查看Cowboy的BBQ库,它可以让您很好地控制所有返回的内容和Hashchange:一个好的、简单的解决方案,您应该将其作为一个答案唯一剩下的事情是在设置_ignoreHashChange=true之前检查新的哈希是否与旧的哈希不相等;您在哪里定义hashChanged事件?最好存储_ignoreHashChange的原始值并重置为该值。e、 g.
var=ignoreHashChange;[...]; _ignoreHashChange=.
history.replaceState
也不会将hashchange推送到历史记录中,但如果需要,可以使用
history.pushState
;)