You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Uncaught TypeError: 无法读取undefined的'offset'属性问题求助

解决Uncaught TypeError: Cannot read property 'offset' of undefined问题

嘿,咱们来看看你为啥会遇到这个错误哈!核心问题出在**变量作用域和未定义的$target**上:你代码里的$target只在else分支里声明了,而在if分支(也就是当hash不为空且路径匹配时),不管目标是不是#top,都没给$target赋值,后面动画代码直接调用$target.offset().top时,$target就是undefined,自然就抛出错误了。

另外,当目标是#top时,你也没处理滚动目标值的逻辑,同样会导致后续代码报错。咱们来修正这段代码:

修正后的完整代码

var ssSmoothScroll = function() {
    $('.smoothscroll').on('click', function (e) {
        // 先统一获取目标hash和对应的DOM元素,避免分支里重复定义
        var target = this.hash;
        var $target = $(target);
        
        if (this.hash !== "" && this.pathname === window.location.pathname) {
            e.preventDefault();
            e.stopPropagation();
            
            let scrollTopValue = 0; // #top默认滚动到页面顶部(值为0)
            if (target !== "#top") {
                // 先检查目标元素是否存在,防止找不到DOM元素的情况
                if ($target.length) {
                    scrollTopValue = $target.offset().top;
                } else {
                    console.warn(`找不到目标元素: ${target}`);
                    return; // 元素不存在时直接终止,避免后续报错
                }
            }
            
            // 执行平滑滚动动画
            $('html, body').stop().animate({
                'scrollTop': scrollTopValue
            }, cfg.scrollDuration, 'swing', function () {
                window.location.hash = target;
            });
        } else {
            e.preventDefault();
            e.stopPropagation();
            // 如果需要处理路径不匹配的情况,可以在这里添加逻辑
        }
    });
};

关键修改点解析

  • 统一声明$target:把$target的定义移到所有分支外面,确保整个点击事件回调里都能访问到这个变量,彻底解决undefined的问题。
  • 简化#top处理逻辑:直接把滚动目标值设为0,不需要去获取元素的offset,逻辑更清晰,也避免了不必要的DOM查询。
  • 增加元素存在性校验:用$target.length判断目标元素是否存在于页面中,要是找不到元素就打印警告并终止执行,防止后续调用offset()时出现新的错误。
  • 优化代码结构:把重复的e.preventDefault()和e.stopPropagation()合并到对应分支里,减少冗余代码,让逻辑更连贯。

这样修改后,你之前遇到的offset相关错误就会消失,同时还兼顾了目标元素不存在的边界情况,代码鲁棒性更强啦。

内容的提问来源于stack exchange,提问作者Himanshu Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:14:39