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

如何检测用户滚动到<embed>元素底部?现有代码失效求助

如何检测用户滚动到元素内PDF的底部?

你的问题出在直接监听标签的scroll事件是无效的——因为浏览器渲染PDF时,会在内部创建独立的文档上下文,真正的滚动容器是这个内部文档的窗口或元素,而不是本身。下面是可行的解决方案:

方法1:监听内部文档窗口的滚动事件(通用方案)

首先要等加载完成(确保PDF渲染完毕),再获取它内部的文档窗口,在这个窗口上监听scroll事件:

原生JS版本

// 获取embed元素
const contractPDF = document.getElementById('contractPDF');

// 等待PDF加载完成
contractPDF.addEventListener('load', function() {
  // 获取内部文档的窗口对象
  const embedWindow = this.contentWindow;
  
  // 监听内部窗口的滚动事件
  embedWindow.addEventListener('scroll', function() {
    // 计算滚动位置
    const scrollTop = embedWindow.scrollY;
    const viewportHeight = embedWindow.innerHeight;
    const totalHeight = embedWindow.document.body.scrollHeight;
    
    // 判断是否到达底部(可以加一点容差,比如>= totalHeight - 10,避免因精度问题误判)
    if (scrollTop + viewportHeight >= totalHeight) {
      alert("已滚动到PDF底部!");
    }
  });
});

jQuery版本

$('#contractPDF').on('load', function() {
  const embedWindow = this.contentWindow;
  
  $(embedWindow).on('scroll', function() {
    const scrollTop = this.scrollY;
    const viewportHeight = this.innerHeight;
    const totalHeight = this.document.body.scrollHeight;
    
    if (scrollTop + viewportHeight >= totalHeight) {
      alert("已滚动到PDF底部!");
    }
  });
});

方法2:针对特定浏览器的DOM结构监听(不推荐,兼容性差)

部分浏览器(比如Chrome)会把PDF渲染在内部的特定DOM元素中(例如#viewerContainer),你也可以直接监听这个元素的滚动事件,但这种方式依赖浏览器的渲染实现,版本更新后可能失效:

contractPDF.addEventListener('load', function() {
  const viewerContainer = this.contentDocument.getElementById('viewerContainer');
  if (viewerContainer) {
    viewerContainer.addEventListener('scroll', function() {
      if (this.scrollTop + this.clientHeight >= this.scrollHeight) {
        alert("已滚动到PDF底部!");
      }
    });
  }
});

注意事项

  • 同源策略限制:如果你的PDF来自跨域地址,浏览器会阻止你访问<embed>的contentWindow或contentDocument,这种情况下上述方法都会失效。此时建议使用第三方PDF渲染库(如pdf.js)来自行渲染PDF,这样可以完全控制滚动逻辑。
  • 加载时机:必须等待<embed>的load事件触发后再绑定滚动监听,否则内部文档还未渲染,无法获取到滚动容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:45:04