为何resize事件无法触发内部doso函数?技术咨询
问题分析与解决方案
核心问题
- doso的触发逻辑偏差:
doso是绑定在scroll事件上的回调函数,只有页面发生滚动时才会执行。resize触发upme仅完成了scroll事件的绑定操作,不会主动调用doso。 - 重复绑定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
相关产品推荐
相关产品推荐

