preventDefault在滚动偏移量脚本中未定义

时间:2019-01-04 12:55:58

标签: javascript jquery scroll offset preventdefault

我正在使用此脚本滚动到锚点:

something_aef34a4x

但是,单击链接(动画完成)后,两次出现以下错误:$( document ).ready(function(e) { var $root = $('html, body'); $('a').click(function(e) { e.preventDefault(); var href = $.attr(this, 'href'); if(href!=='javascript:void(0)' && href!=='javascript:void(0);'){ $root.animate({ scrollTop: $(href).offset().top-100 }, 1000, function (e) { e.preventDefault(); window.location.hash = href; }); return false; } }); });

我不明白为什么。我试图将Uncaught TypeError: Cannot read property 'preventDefault' of undefined添加到函数中,但它仍然给出错误。有人可以提供一些背景信息吗?

1 个答案:

答案 0 :(得分:4)

问题是...

$( document ).ready(function(e) 
{
    var $root = $('html, body');
    $('a').click(function(e) {
        e.preventDefault();
        var href = $.attr(this, 'href');

        if(href!=='javascript:void(0)' && href!=='javascript:void(0);'){
            $root.animate({
                scrollTop: $(href).offset().top-100
            }, 1000, function (e) {
//                             ^−−−−−−−−−−−−−−−−−−−−−− here
                e.preventDefault();             // <−− and/or (arguably) here
                window.location.hash = href;
            });
            return false;
        }
    });

});

animate回调没有收到事件对象。

目前尚不清楚您要阻止的内容,因为您已经阻止了发生的默认事件(点击)。只需删除上面指示的e以及e.preventDefault()回调中的animate调用即可。


在您添加的评论中:

  

问题是,因为滚动到元素的偏移量为-100,所以页面在更新URL后跳了一点。我想防止这种情况,所以这就是为什么我有这个e.preventDefault();的原因。在动画回调中。如果我删除它,它仍然会使这个怪异的跳跃。

调用没有跳转的唯一原因是调用引发错误,因此下一行永远不会运行,因此也不会设置URL。

如果您想在不更改页面或滚动位置的情况下设置URL,请改用history.replaceState

history.replaceState(null, "", href);