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)
但这并不理想,因为您可能已经猜到了,它会滚动然后重新加载,这导致浏览器实际上最终滚动了三遍。
我知道有一些方法可以解决它:服务器端重定向或添加一些独特的随机查询字符串参数,但是没有简单的方法似乎很奇怪。
这是位置对象的“哈希”值。你需要这样设置...
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)