尝试解决此问题两天都没有成功。
我有一个主导航栏位于一个单一页面的网站。网站上有滚动动画。每当用户单击导航栏中的链接时,window.location.hash就会发生更改。
现在,问题是它曾经改变过。但同时,它也有闪烁问题(我无法用e.preventDefault()解决)。停止闪烁的唯一方法是将stop()添加到window.location.hash中。所以现在我没有闪烁,但window.location.hash不再改变,这不是一件好事。
这是代码
<html>
<body> <div class="nav">
<ul class="floatRight">
<li><a href="javascript: void(0); return false;" data-to="#home">Home</a></li>
<li><a href="javascript: void(0); return false;" data-to="#about">About</a></li>
<li><a href="javascript: void(0); return false;" data-to="#platform">Platform</a></li>
<li><a href="javascript: void(0); return false;" data-to="#investors">Investors</a></li>
<li><a href="javascript: void(0); return false;" data-to="#team">Team</a></li>
<li><a href="javascript: void(0); return false;" data-to="#newsPress">News & Press</a></li>
<li class="last"><a href="javascript: void(0); return false;" data-to="#explained">Startup Explained</a></li>
</ul>
</div>
<script type="text/javascript">
function gotoAndScroll(to){
if(typeof to == 'string') {
var diff = (to == '#newsPress')? 74 : 83;
$.scrollTo( {top: $(to).offset().top - diff}, 1500, {axis:'y',easing:'easeInOutCubic'});
}
else if(typeof to == 'number'){
$.scrollTo({top:Number(to), left:0},{duration:1500});
}
}
$('.nav a').click(function(e) {
if($(this).data('to') != '#home')
gotoAndScroll($(this).data('to'));
else
gotoAndScroll(0);
window.location.hash = $(this).data('to').stop();
});
$('a#logo').click(function(e) {
if($(this).data('to') != '#home')
gotoAndScroll($(this).data('to'));
else
gotoAndScroll(0);
window.location.hash = $(this).data('to').stop();
});
</script>
</body>
</html>
编辑:
当点击其中一个导航链接时,我会得到下一个错误:未捕获的类型错误:对象#about没有方法"stop"未捕获的SyntaxError:非法的返回语句
我意识到stop()不应该存在,但与所有逻辑相反,这是唯一修复闪烁的方法。
有人能告诉我我在这里做错了什么吗?:/提前谢谢。
您应该更新a
标记,因为它们会因为return false
而出现错误。因此,将它们从href="javascript: void(0); return false;"
更改为href="javascript: void(0);"
,这将起到相同的作用(不使用href
)。
进一步从点击功能中删除window.location.hash = $(this).data('to').stop();
,并将其添加到gotoAndScroll()
功能中,如下所示:
function gotoAndScroll(to){
if(typeof to == 'string') {
var diff = (to == '#newsPress')? 74 : 83;
$.scrollTo( {top: $(to).offset().top - diff}, 1500, {axis:'y',easing:'easeInOutCubic'});
// Added this line because you always call this function so you could have it in one place.
window.location.hash = to;
}
else if(typeof to == 'number'){
$.scrollTo({top:Number(to), left:0},{duration:1500});
}
}
我已经从$(this).data('to').stop()
中删除了stop()
,因为您不能在字符串上调用stop
(data('to')是一个字符串)。
希望这能有所帮助。
window.location.hash = to
仅在else范围内,该范围仅在(to=="#home")时运行
你必须对被动画化的元素调用stop(),说"$":
$('.nav a').click(function(e) {
if($(this).data('to') != '#home')
gotoAndScroll($(this).data('to'));
else
gotoAndScroll(0);
$.stop();
window.location.hash = $(this).data('to');
});
$('a#logo').click(function(e) {
if($(this).data('to') != '#home')
gotoAndScroll($(this).data('to'));
else
gotoAndScroll(0);
$.stop();
window.location.hash = $(this).data('to');
});