我有一个带子菜单的简单导航菜单。当在同一页面上单击子菜单中的链接时,窗口将使用jQuery滚动到相应的锚点。
以下是子菜单列表项的示例:
<li><a href="page.html#some-anchor" onclick="clickScroll('#some-anchor');"><span>foo</span></a></li>
相应的锚如下所示:
<a class="hidden-anchor" id="some-anchor" name="some-anchor"></a>
JavaScript函数:
function clickScroll(dest) {
$('html, body').stop().animate({
scrollTop: $(dest).offset().top
}, 1000);
}
一切都运行得很好,但像我之前的许多人一样,我一直在阅读内联事件处理程序这些日子都是不好的做法。
如何修改功能以消除任何onclick调用的需要?请记住,每个子菜单链接对应一个不同的锚点。
答案 0 :(得分:2)
假设您希望所有具有哈希#
的锚点滚动到具有相同ID的相应锚点,您可以遍历所有锚点,解析哈希值并滚动到相同的ID:
$('a').each(function() {
if ( this.hash ) {
$(this).click(function(e) {
$('html,body').animate({ scrollTop: $(this.hash).offset().top }, 1000);
e.preventDefault();
});
}
});
如果要将此功能限制为某些锚点,请添加一个类并将其插入选择器f.ex $('a.hashlink').each(
答案 1 :(得分:1)
使用事件处理程序:http://api.jquery.com/on/
<li><a id="some-scroll-source" href="page.html#some-anchor"><span>foo</span></a></li>
<a class="hidden-anchor" id="some-anchor" name="some-anchor"></a>
(function () {
function clickScroll() {
var dest = $('#' + ($(this).attr('href').split('#')[1]));
$('html, body').stop().animate({
scrollTop: $(dest).offset().top
}, 1000);
}
$('#some-scroll-source').on('click', clickScroll);;
}());
答案 2 :(得分:0)
试试这个:
$('li a').each (function () {
$(this).click(function () {
$('html, body').stop().animate({
scrollTop: $(this.hash).offset().top
}, 1000);
});
});