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

获取$('.example p')元素offset().top值报TypeError如何解决?

问题原因

$('.example p')返回的是jQuery封装的类数组元素集合,通过[1]这类方括号下标取值时,拿到的是原生DOM节点,并非jQuery实例对象。offset()是jQuery原型上挂载的方法,原生DOM上不存在这个方法,因此会抛出如下类型错误:

Uncaught TypeError: $(...)[1].offset is not a function

你去掉索引直接调用offset()能拿到值,是jQuery的默认设计:当jQuery集合包含多个元素时,调用offset()、css()这类取值方法,默认只会返回集合内第一个元素的计算结果,并不会遍历返回所有元素的对应值。

正确实现方式

获取指定索引元素的offsetTop

使用jQuery提供的.eq(index)方法,获取对应索引位置的jQuery包装对象,再调用offset()即可:

// 获取索引为1(即第二个匹配元素)的offset top值
console.log($('.example p').eq(1).offset().top)

遍历获取所有元素的offsetTop

方式1:使用jQuery自带的.each()遍历(推荐)

遍历过程中this指向当前遍历到的原生DOM节点,包装为jQuery对象后即可调用方法:

$('.example p').each(function(index) {
  const offsetTop = $(this).offset().top
  console.log(`第${index + 1}个p元素的offsetTop值:`, offsetTop)
})

方式2:原生for循环按下标取值

如果用原生for循环按下标取元素,需要把取到的原生DOM重新用$()包装为jQuery实例,再调用offset()方法:

const pList = $('.example p')
for (let i = 0; i < pList.length; i++) {
  const offsetTop = $(pList[i]).offset().top
  console.log(`第${i + 1}个p元素的offsetTop值:`, offsetTop)
}
注意事项
  • 通过方括号下标、原生forEach/for...of遍历jQuery集合拿到的元素都是原生DOM节点,没有挂载jQuery原型方法,必须用$()重新包装,或者使用jQuery提供的.eq()/.each()等方法拿到jQuery包装对象后,才能调用offset()这类jQuery实例方法
  • 不要直接对原生DOM节点调用jQuery提供的方法,会触发类型错误

内容的提问来源于stack exchange,提问作者Kenji Bailly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:18:17