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

为何resize事件无法触发内部doso函数?技术咨询

问题分析与解决方案

核心问题

  1. doso的触发逻辑偏差:doso是绑定在scroll事件上的回调函数,只有页面发生滚动时才会执行。resize触发upme仅完成了scroll事件的绑定操作,不会主动调用doso。
  2. 重复绑定scroll事件:每次resize都会触发upme,每次upme都会给window新增一次scroll监听器,导致滚动时doso被多次执行,存在内存泄漏风险。

解决方案

如果希望resize时也执行doso的逻辑,同时修复重复绑定问题,可以按以下方式修改代码:

function chekon() {
  let scrollBound = false;

  document.addEventListener('DOMContentLoaded', upme);
  window.addEventListener('resize', upme);

  function upme() {
    var rome = document.getElementById("out-cmnt");
    var rect = rome.getBoundingClientRect();
    var poss = rect.top + window.scrollY;
    var iwwr = window.innerWidth;
    var koss = rect.bottom + window.scrollY;
    var loss = koss - poss;

    // 确保scroll事件仅绑定一次
    if (!scrollBound) {
      window.addEventListener('scroll', doso, false);
      scrollBound = true;
    }

    // resize时主动执行doso的逻辑
    doso();

    function doso() {
      // 声明变量避免全局污染
      let lopp = document.getElementById("Web_1920__1");
      let hope = lopp.clientHeight;
      const meme = document.body.scrollHeight;
      const keke = hope / meme;
      const scsc = window.scrollY;
      var scmx = document.documentElement.scrollHeight - document.documentElement.clientHeight;
      var innr = window.innerHeight;
      console.log("innr inner-height = ", innr);
    }
  }
}
chekon();

修改说明

  • 新增scrollBound标记变量,避免每次resize都重复绑定scroll事件,消除滚动时多次执行doso的问题。
  • 在upme函数末尾主动调用doso(),让resize触发时立即执行目标逻辑,和滚动时的行为保持一致。
  • 给doso内的lopp、hope添加let声明,避免变量泄露到全局作用域。

如果仅需要resize时单独执行doso逻辑,也可以直接给window的resize事件绑定doso,但需注意调整作用域确保doso能访问到所需变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:25:22