1

我有一个带有子菜单的简单导航菜单。当在同一页面上单击子菜单中的链接时,窗口会使用 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 调用的需要?请记住,每个子菜单链接对应一个不同的锚点。

4

3 回答 3

2

假设您希望所有带有哈希的锚#滚动到具有相同 ID 的相应锚,您可以遍历所有锚,解析出哈希并滚动到相同的 ID:

$('a').each(function() {
    if ( this.hash ) {
        $(this).click(function(e) {
            $('html,body').animate({ scrollTop: $(this.hash).offset().top }, 1000);
            e.preventDefault();
        });
     }
});

http://jsfiddle.net/nGfW5/

如果您想将此功能限制为某些锚点,请添加一个类并将其插入选择器 f.ex$('a.hashlink').each(

于 2012-08-22T07:45:33.700 回答
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);;
}());
于 2012-08-22T07:46:24.760 回答
0

试试这个:

$('li a').each (function () {
    $(this).click(function () {
        $('html, body').stop().animate({
           scrollTop: $(this.hash).offset().top
        }, 1000);
    });
});
于 2012-08-22T07:44:32.217 回答