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

如何在ResizeObserver中获取Telegram网页联系人列表的scrollHeight新值

问题描述

这是我的HTML代码:

<div class="scrollable scrollable-y" id="scroll">
<ul class="chatlist contacts-container" id="contacts" data-autonomous="1">
  <a class="chatlist-chat rp" data-peer-id="100201777">
  <a class="chatlist-chat rp" data-peer-id="100201778">
  <a class="chatlist-chat rp" data-peer-id="100201779">
</ul>
<div>

id为“scroll”的div是可滚动容器,属于Telegram网页版联系人模块。每个<a>元素代表一个联系人,滚动该div时会从服务器动态加载更多<a>元素。我使用以下脚本时发现,ul子元素的scrollHeight(滚动容器的scrollHeight)会增加:

const container = $("#scroll");
const observer = new ResizeObserver(function() {
console.log('New scrollHeight', container[0].scrollHeight);});

container.children().each(function(index, child) {
observer.observe(child);})

我的问题是:如何获取scrollHeight的新值?希望有类似如下的调用方式:

observer.container[0].scrollHeight.get();
解决方案

你不需要通过observer对象直接获取scrollHeight,ResizeObserver的回调本身就是在元素尺寸变化(包括子元素新增导致scrollHeight变化)时触发的,你可以在回调里直接读取并存储最新值,或者封装成符合你需求的调用形式:

  • 直接存储最新值
    定义变量保存最新的scrollHeight,回调中更新它,后续随时可以调用这个变量获取值:
const container = $("#scroll");
let latestScrollHeight = container[0].scrollHeight; // 初始化初始值

const observer = new ResizeObserver(() => {
  latestScrollHeight = container[0].scrollHeight;
  console.log('更新后的scrollHeight', latestScrollHeight);
});

container.children().each((index, child) => {
  observer.observe(child);
});

// 需要获取新值时直接调用变量
// console.log(latestScrollHeight);
  • 封装成自定义调用方法
    如果想要接近你期望的调用形式,可以把逻辑封装成一个自执行对象:
const scrollHeightTracker = (function() {
  const container = $("#scroll")[0];
  let latestScrollHeight = container.scrollHeight;
  
  const observer = new ResizeObserver(() => {
    latestScrollHeight = container.scrollHeight;
  });
  
  // 监听容器下的子元素
  Array.from(container.children).forEach(child => {
    observer.observe(child);
  });
  
  return {
    getScrollHeight: () => latestScrollHeight
  };
})();

// 调用方式,和你期望的形式类似
// console.log(scrollHeightTracker.getScrollHeight());
  • 优化方案:直接监听容器本身
    其实无需逐个监听子元素,直接监听#scroll容器即可——子元素新增会导致容器的scrollHeight变化,ResizeObserver同样能捕捉到这种变化:
const container = $("#scroll")[0];
let latestScrollHeight = container.scrollHeight;

const observer = new ResizeObserver(() => {
  latestScrollHeight = container.scrollHeight;
  console.log('新的scrollHeight', latestScrollHeight);
});

// 指定监听内容盒尺寸变化
observer.observe(container, { box: 'content-box' });

// 获取值直接调用 latestScrollHeight

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:10:26