如何通过jQuery实现仅在指定页面执行滚动逻辑,避免offset().top未定义错误
如何通过jQuery实现仅在指定页面执行滚动逻辑,避免offset().top未定义错误
我来给你捋捋,你遇到的问题核心是:在没有.restaurant/.mention这些元素的页面,代码还是硬去调用了offset().top,自然会触发“undefined”的报错。解决思路其实很简单——先判断元素或页面是否符合执行条件,再运行滚动逻辑,给你几个实用的方案:
方案1:先检查目标滚动元素是否存在(最基础的容错)
直接在代码里先获取目标元素,判断它是否存在,只有存在的时候才执行滚动逻辑,这样在没有元素的页面就不会触发报错了:
$(document).ready(function() { setTimeout(function() { // 先获取目标元素,存到变量里 var targetElements = $('.restaurant, .mention, .politique, .condition'); // 检查元素是否存在(length大于0表示存在) if (targetElements.length > 0) { var scroll = targetElements.offset().top; $('html, body').animate({ scrollTop: scroll }, 2000); } }, 2500); });
这个方案的好处是不用改页面结构,直接通过元素存在性判断就能避免报错,非常省心。
方案2:通过页面专属标识精准控制(更推荐,逻辑清晰)
如果想要更精准地指定哪些页面执行这个逻辑,比如只有包含.home-video的页面才执行,你可以先判断这个页面专属元素是否存在,再结合目标滚动元素的判断:
$(document).ready(function() { setTimeout(function() { // 先判断当前页面是否是需要执行的页面(通过专属元素.home-video) if ($('.home-video').length > 0) { var targetElements = $('.restaurant, .mention, .politique, .condition'); // 再双重检查滚动目标元素是否存在 if (targetElements.length > 0) { var scroll = targetElements.offset().top; $('html, body').animate({ scrollTop: scroll }, 2000); } } }, 2500); });
你也可以给需要执行滚动的页面的body标签加一个专属类,比如scroll-enabled,然后代码里判断这个类是否存在:
$(document).ready(function() { setTimeout(function() { if ($('body.scroll-enabled').length > 0) { var targetElements = $('.restaurant, .mention, .politique, .condition'); if (targetElements.length > 0) { var scroll = targetElements.offset().top; $('html, body').animate({ scrollTop: scroll }, 2000); } } }, 2500); });
这种方式的好处是逻辑更明确,你能一眼看出来哪些页面会执行这个逻辑,后期维护也方便。
为啥你之前的尝试没生效?
你之前用.not('.links-body')是搞错了这个方法的作用——它是从你选中的.restaurant等元素里,排除掉带有.links-body类的元素,而不是排除整个页面;另外你把animate的目标换成.home-video也不对,因为scrollTop是针对可滚动容器的,.home-video如果不是可滚动的容器(比如只是普通的视频元素),设置它的scrollTop根本不会触发页面滚动,而且你还是没加元素存在性判断,所以报错依然存在。
内容来源于stack exchange
相关产品推荐
相关产品推荐

