我希望当用户到达页面上的某个特定点时,更新window.location.hash值。例如,如果用户滚动到具有ID = 'about'的div,我希望URL更新。与单击自动滚动到页面锚点的链接相同,它会更新URL中的哈希值。
我设想通过检测元素是否可见来实现这一点,如果是,则更新window.location.hash = elementsID。欢迎其他建议。
我正在使用React并尝试避免JQuery,因此非常感谢使用vanilla JS的建议。谢谢。
编辑:
感谢建议。成功用纯JS编写了一个解决方案,并将其实现在React组件中。代码仍需要清理,但你已经了解了要领。
我设想通过检测元素是否可见来实现这一点,如果是,则更新window.location.hash = elementsID。欢迎其他建议。
我正在使用React并尝试避免JQuery,因此非常感谢使用vanilla JS的建议。谢谢。
编辑:
感谢建议。成功用纯JS编写了一个解决方案,并将其实现在React组件中。代码仍需要清理,但你已经了解了要领。
class HomeView extends React.Component{
constructor () {
super();
this.state = {
hash: '#'
}
this.elements = {}
}
componentDidMount(){
this.scrollListener();
}
componentDidUpdate(prevProps){
if(this.props.location.hash !== prevProps.location.hash){
this.scrollToHash(this.props.location.hash)
}
}
scrollListener(){
window.addEventListener('scroll', (event) => {
if(window.pageYOffset > 0 && window.pageYOffset < this.elements.about.offsetTop - 200){
const hash = '#';
this.setState({hash: hash}, () => {
history.pushState('', '', hash);
this.updateHashState(hash);
})
} else if(window.pageYOffset > this.elements.about.offsetTop - 200 && window.pageYOffset < this.elements.skills.offsetTop - 200) {
const hash = '#about';
this.setState({hash: hash}, () => {
history.pushState('', '', hash);
this.updateHashState(hash);
})
} else if(window.pageYOffset > this.elements.skills.offsetTop - 200 && window.pageYOffset < this.elements.contact.offsetTop - 200) {
const hash = '#skills';
this.setState({hash: hash}, () => {
history.pushState('', '', hash);
this.updateHashState(hash);
})
}else if(window.pageYOffset > this.elements.skills.offsetTop - 200) {
const hash = '#contact';
this.setState({hash: hash}, () => {
history.pushState('', '', hash);
this.updateHashState(hash);
})
}
})
}
updateHashState(hash) {
switch(hash){
case '#about':
this.setState({
forward: '#skills',
back: '#'
})
break;
case '#skills':
this.setState({
forward: '#contact',
back: '#about'
})
break;
case '#contact':
this.setState({
forward: '',
back: '#skills'
})
break;
default:
this.setState({
forward: '#about',
back: ''
})
break;
}
}
render(){
return(
...
)
}
}
export default HomeView