我目前正在使用JavaScript创建画廊。我想创建一个自定义历史记录条目,以便最终用户可以单击历史记录以关闭大图片叠加层。
我的window.onpopstate看起来像这样:
function stateChange(event){
let state = event.state;
console.log(state);
if(state !== null){
if(state.show){
showOverlay(state.obj);
}else{
hideOverlay();
}
}else{
hideOverlay();
}
}
还有我的图片事件监听器:
let state = {show: true, obj: itemLinks[i].dataset.file};
history.pushState(state, '');
问题是,单击图片后,我的控制台会触发 one null。但是,当我回到历史记录中时,它显示了状态对象。如果再回去,我会得到一个空的起始位置。
-编辑-
更多我的代码:
for (let i = 0, len = itemLinks.length; i < len; i++) {
itemLinks[i].addEventListener('click', function(){
let state = {show: true, obj: itemLinks[i].dataset.file};
history.pushState(state, '');
});
}
overlay.addEventListener('click', clickOverlay)
window.onpopstate = stateChange;
并且:
let itemLinks = document.getElementsByClassName('item-link');
let overlay = document.getElementById('gallery-overlay');
let overlayImg = document.getElementById('gallery-overlay-img');
function showOverlay(src){
overlayImg.src = src;
overlay.classList.add('gallery-overlay__show');
}
function hideOverlay(){
overlay.classList.remove('gallery-overlay__show');
}
function clickOverlay(){
history.back();
}
答案 0 :(得分:1)
问题在于,单击要触发导航的元素是<a>
标签,如果单击它们并设置了href
属性,它们将触发导航事件。
为避免这种情况,您可以将元素从<a>
标记更改为<span>
或内联<div>
之类的内容,但是如果您的页面需要无需鼠标即可导航。一种更可靠的解决方案是使用event.preventDefault()
来防止click事件引起导航:
let itemLinks = document.getElementsByClassName('item-link');
for (let link of itemLinks) {
link.addEventListener('click', function(event){
// Keep the <a> tag from triggering the default navigation
event.preventDefault();
// Push our own state navigation
let state = {show: true, obj: link.dataset.file};
history.pushState(state, '');
});
}
通过这种方式,您仍然可以保留<a>
标签的所有有益行为,而不会产生讨厌的额外导航事件。