Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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 我可以在不滚动网页的情况下更新window.location.hash吗?_Javascript_Browser History_Back Button_Deep Linking - Fatal编程技术网

Javascript 我可以在不滚动网页的情况下更新window.location.hash吗?

Javascript 我可以在不滚动网页的情况下更新window.location.hash吗?,javascript,browser-history,back-button,deep-linking,Javascript,Browser History,Back Button,Deep Linking,使用JavaScript,有没有一种方法可以在不滚动网页的情况下更新window.location.hash 我有可点击的标题元素,可以直接在它们下面切换div的可见性。我希望在单击标题时在历史记录中显示/foo#栏,但不希望页面滚动。因此,当导航离开/foo#bar时,我将能够使用“后退”按钮,并使ID位于window.location.hash中的div在返回时可见 这种行为可能吗?这种行为非常可能。您应该查看一些为提供此功能而开发的库 非常简单的历史: SWFAddress:您可以尝试的另

使用JavaScript,有没有一种方法可以在不滚动网页的情况下更新window.location.hash

我有可点击的标题元素,可以直接在它们下面切换div的可见性。我希望在单击标题时在历史记录中显示/foo#栏,但不希望页面滚动。因此,当导航离开/foo#bar时,我将能够使用“后退”按钮,并使ID位于window.location.hash中的div在返回时可见


这种行为可能吗?

这种行为非常可能。您应该查看一些为提供此功能而开发的库

非常简单的历史:
SWFAddress:

您可以尝试的另一件事是临时更改散列点所在元素的id。为我工作

function changeHashWithoutScrolling(hash) {
  var id = hash.replace(/^.*#/, ''),
      elem = document.getElementById(id)
  elem.id = id+'-tmp'
  window.location.hash = hash
  elem.id = id
}
很容易

var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);

要在不重新加载/滚动页面的情况下更改哈希,现在只需使用html5
history.pushState

history.pushState(null,null,'#hashexample');
所有主要浏览器都支持它:

MDN:


还要注意,我们在这里使用的最后一个url参数可以是任何url,因此它不限于散列。

想在Catherines答案中添加注释,但我还没有代表-

很好的解决方案,但是它在Chrome中作为$('html')不起作用。scrollTop()总是返回0-一个小的编辑就解决了这个问题:

scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);

根据Sunny的回答,我制作了这个函数,它也避免了未定义和空值:

    function changeHashWithoutScrolling(hash) {
        var id;
        var elem;

        id = hash.replace(/^.*#/, '');

        if (id) {
            elem = document.getElementById(id);

            if (elem) {
                elem.id = id + '-tmp';
                window.location.hash = hash;
                elem.id = id;
            }
        }
    }

伟大的除了RSH的现有文档外,这些看起来不错。我认为这件连衣裙看起来是目前最好的选择。我觉得缺少RSH的文档。我使用SWFAddress,到目前为止,它工作得很好。对于这样一个简单的任务来说,这是非常过分的。与添加新的库和依赖项相比,几行代码更可取。@shruggernaut在'09年编写此答案时,这比自己编写更可取。浏览器支持非常分散,该库允许您专注于创建产品,而不是自己创建库(实现此功能时需要创建库)。也就是说,我认为Stackoverflow在某种程度上应该超过答案。特别是对于快速移动的平台,比如浏览器,这真是太棒了。很好用。我想你指的是
document.getElementById(id)谢谢@AlienWebguy,修复了评论中的函数。非常有效。谢谢我认为第一行应该是“var scrollmem=$('html,body').scrollTop();”以匹配第三行。否则,它在firefox中对我不起作用。@Anthony是对的,他不在firefox中工作Sunny function works wellSee和/或我提供了一个基本脚本来解决这个问题。谢谢。我已经检查了这个问题和你的自定义脚本。哦,我希望我能拥抱你。
replaceState
可能是更好的方式。区别在于
pushState
向您的历史记录中添加了一个项目,而
replaceState
没有。完成此操作后,请使用
window.location.hash
验证它是否有效