停止滚动到每个单击的链接一个接一个,滚动到第一个单击的链接

时间:2015-02-25 20:27:05

标签: javascript jquery html scroll

我需要修复我的代码。如果我在菜单中单击多个html href链接,我的脚本将滚动到每个单击的链接一个接一个单击链接。我只需要滚动到第一个单击的链接,滚动功能期间另一个单击的链接将被忽略。

jQuery(window).bind("load", function () {
var hash = window.location.hash;

hash = hash.replace("#", "");

var elem = jQuery(".pb-line-css-group-" + hash);

menu_scroll_to(elem);
});

jQuery(document).ready(function () {

jQuery(".menu-item A").click(function () {
    var hash = jQuery(this).attr('href');

    hash = hash.replace("#", "");
    hash = hash.replace("/", "");

    var elem = jQuery(".pb-line-css-group-" + hash);

    menu_scroll_to(elem);
});
});

function menu_scroll_to(elem) {

if (elem) {
    jQuery('html, body').animate({
        scrollTop: elem.offset().top - 70
    }, 2000, "easeOutQuint");
}

}

1 个答案:

答案 0 :(得分:1)

你可以设置一个去抖功能,这样你只需要在一段时间内多次点击menu_scroll_to()。

以下是应该有效的去抖功能的链接。

Debounce function

将该函数添加到JS并替换以下行:

menu_scroll_to(elem);

with:

debounce(function() {
    menu_scroll_to(elem);
}, 250);

其中250是以毫秒为单位的时间。

最终代码一起将是这样的:

jQuery(window).bind("load", function () {
        var hash = window.location.hash;

        hash = hash.replace("#", "");

        var elem = jQuery(".pb-line-css-group-" + hash);

        menu_scroll_to(elem);
});

jQuery(document).ready(function () {

        jQuery(".menu-item A").click(function () {
                var hash = jQuery(this).attr('href');

                hash = hash.replace("#", "");
                hash = hash.replace("/", "");

                var elem = jQuery(".pb-line-css-group-" + hash);

                debounce(function () {
                    menu_scroll_to(elem);
                }, 250);
        });
});

function menu_scroll_to(elem) {
    if (elem) {
            jQuery('html, body').animate({
                    scrollTop: elem.offset().top - 70
            }, 2000, "easeOutQuint");
    }
};

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};