强制页面刷新并跳转到#section

Jan*_*ich 5 javascript browser

似乎我必须遗漏一些完全基本的东西。我试图实现的目标看起来很常见,所以我想知道为什么没有直接的方法。

问题是我想从 JavaScript 刷新当前页面并同时登陆 #section。如果我简单地做:

document.location.href = document.location.href + "#section";
Run Code Online (Sandbox Code Playgroud)

我测试过的所有浏览器都只是滚动到那个#section(没有重新加载)。从某种意义上说,这是有道理的。只是为了完整性,如果我这样做

document.location.assign(document.location.href + "#section");
Run Code Online (Sandbox Code Playgroud)

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

document.location.assign(document.location.href + "#section");
document.location.reload();
Run Code Online (Sandbox Code Playgroud)

但这并不理想,因为您可能已经猜到了,它会滚动然后重新加载,这导致浏览器实际上最终滚动了三遍。

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

Jos*_*ola 1

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

location.hash = "#section";
Run Code Online (Sandbox Code Playgroud)

如果这不能始终如一地工作,您可能需要考虑使用scrollToElement函数...

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您绝对需要重新加载页面(不确定为什么会这样做),请尝试打开一个窗口本身......

window.open(location.href + '#section', '_top');
Run Code Online (Sandbox Code Playgroud)

或者尝试更换...

location.replace(location.href + '#section');
Run Code Online (Sandbox Code Playgroud)