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

获取数组中div距窗口顶部距离时报错‘player.offset is not a function’求排查

问题原因分析

你之所以会遇到player.offset is not a function的错误,核心原因是原生DOM元素和jQuery对象的方法混用:

  • 你用Array.from(document.querySelectorAll('.js-player'))获取到的是原生DOM元素数组,这些是浏览器原生的对象,并没有jQuery提供的offset()方法;
  • 而offset()是jQuery封装的专属方法,只能在jQuery对象上调用。
三种解决办法

办法1:把原生DOM元素转为jQuery对象

在遍历的时候,把每个原生DOM元素用$()包裹,转换成jQuery对象后再调用offset():

const players = Array.from(document.querySelectorAll('.js-player'));
$(window).on('scroll', function () {
  let scrollTop = $(window).scrollTop();
  console.log(scrollTop)
  players.forEach(function(player) {
    // 把原生DOM转成jQuery对象
    let playerOffset = $(player).offset().top,
        distance = (playerOffset - scrollTop);
    console.log(distance);
  });
});

办法2:全程用jQuery获取元素集合

如果你本来就打算用jQuery来操作,直接用jQuery选择器获取元素,得到的就是jQuery对象集合,直接调用offset()即可:

// 直接用jQuery选择器获取元素
const players = $('.js-player');
$(window).on('scroll', function () {
  let scrollTop = $(window).scrollTop();
  console.log(scrollTop)
  // 用jQuery的each方法遍历集合
  players.each(function() {
    let playerOffset = $(this).offset().top,
        distance = (playerOffset - scrollTop);
    console.log(distance);
  });
});

办法3:用原生JS替代jQuery方法(无需依赖jQuery)

如果不想用jQuery,可以用原生JS的getBoundingClientRect()方法来获取元素位置:

const players = Array.from(document.querySelectorAll('.js-player'));
window.addEventListener('scroll', function () {
  const scrollTop = window.scrollY;
  console.log(scrollTop)
  players.forEach(function(player) {
    // 获取元素相对于视口的位置,再加上滚动距离得到文档顶部的距离
    const rect = player.getBoundingClientRect();
    const playerOffset = rect.top + scrollTop;
    const distance = playerOffset - scrollTop;
    // 其实这里distance等价于rect.top,因为playerOffset - scrollTop = (rect.top + scrollTop) - scrollTop = rect.top
    console.log(distance);
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:56:51