Javascript 强制页面刷新并跳转到#节

Javascript 强制页面刷新并跳转到#节,javascript,browser,Javascript,Browser,看来我一定错过了一些基本的东西。我试图实现的目标看起来很常见,因此我想知道为什么没有直接的方法 问题是,我想从JavaScript刷新当前页面,同时进入#部分。如果我只是: document.location.href = document.location.href + "#section"; 我测试的所有浏览器都只需滚动到#部分(无需重新加载)。这在某种程度上是有道理的。只是为了完整,如果我这样做的话 document.location.assign(document.location.h

看来我一定错过了一些基本的东西。我试图实现的目标看起来很常见,因此我想知道为什么没有直接的方法

问题是,我想从JavaScript刷新当前页面,同时进入#部分。如果我只是:

document.location.href = document.location.href + "#section";
我测试的所有浏览器都只需滚动到#部分(无需重新加载)。这在某种程度上是有道理的。只是为了完整,如果我这样做的话

document.location.assign(document.location.href + "#section");
它做同样的事情(毫不奇怪;它在内部归结为同一个函数)。最后,
document
对象似乎还有
document.reload()
函数,该函数采用可选的布尔参数,指定是否强制重新加载,但显然,它不允许指定#部分。我能找到的唯一方法(使用这些方法)是以下组合:

document.location.assign(document.location.href + "#section");
document.location.reload();
但这并不理想,因为正如您可能猜到的,它会滚动然后重新加载,这会导致浏览器最终实际滚动三次

我知道有很多解决方法:服务器端重定向或添加一些唯一的随机查询字符串参数,但奇怪的是没有简单的方法。

这是location对象的“哈希”值。你需要这样设置它

location.hash = "#section";

如果不一致工作,您可能需要考虑使用ScReltoType函数…

function scrollToElement(elem) {
    if(typeof elem == 'string') elem = document.getElementById(elemId);
    var top = 0;

    if(elem) {
        if(elem.offsetParent) {
            top = elem.offsetTop;

            while(elem = elem.offsetParent) {
                top += elem.offsetTop;
            }
        }

        window.scrollTo(0, top);
    }

}
如果你确实需要重新加载页面(不知道为什么),试着打开一个窗口本身

window.open(location.href + '#section', '_top');
或者尝试替换

location.replace(location.href + '#section');

有一个简单得多的解决方案:

if (document.location.href.match(/[?]/))
  document.location.href = document.location.href + '&fake_param=' + Math.random() + '#section'  ;
else    
  document.location.href = document.location.href + '?fake_param=' + Math.random() + '#section'  ;

一个显而易见的问题是:究竟为什么页面需要重新加载?谢谢。我没有想到window.open(),但我只是测试了它,如果我没有弄错的话,它的行为也是一样的。它只是滚动,不会触发完全重新加载。我知道它可能听起来有点可疑(强制重新加载),可能是这样,我稍后会更改它。但这是我正在开发的应用程序的第一个版本,优先考虑的是有一些完整的工作版本,然后完善细节。但无论如何,我很惊讶,我期望用JavaScript轻松完成的事情毕竟不是那么容易。