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
相关产品推荐
相关产品推荐

