为什么事件侦听器没有应用于内部函数?

Why Event Listener not getting applied to the inside function?

提问人:Soumya Roy 提问时间:2/5/2023 最后编辑:BarmarSoumya Roy 更新时间:2/5/2023 访问量:99

问:

我有一些函数,其中一个函数具有调整大小事件侦听器,而该函数内部还有另一个函数。但是由于外部函数具有 resize 功能,我希望内部函数也会在 resize 事件中被调用。但是内部函数不适用于调整大小。这里有什么问题?

JAVASCRIPT的

function chekon() {
  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;

    window.addEventListener('scroll', doso, false);

    function doso() {
      lopp = document.getElementById("Web_1920__1");
      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();

那么,为什么在调整窗口大小时,resize 事件侦听器没有应用于内部 doso 函数呢?doso 函数位于 upme 函数内部。我是否需要在这两个函数上应用调整大小事件侦听器,即使 doso 函数在 upme 中。

JavaScript 函数 事件 侦听器

评论

0赞 Barmar 2/5/2023
在另一个事件侦听器中添加事件侦听器通常是错误的。每次发生第二个事件时,都会为第一个事件添加另一个侦听器。
0赞 Barmar 2/5/2023
这应该做什么?它计算一堆值,但从不对它们做任何事情。
0赞 Soumya Roy 2/5/2023
你能帮我解决这个问题吗?我需要优化它。是的,它会计算一些东西。完整版在这里 --> stackoverflow.com/questions/75158545/... <-- 我有一种紧张的滞后体验。在 mac、windows elomymelo.com/soundcore-motion-boom-plus.html 上检查的网页
0赞 Soumya Roy 2/5/2023
@Barmar 在我的代码中,我是否搞砸了事情或模拟固定的位置,就像浏览器限制一样紧张?这里描述的体验 stackoverflow.com/questions/75315278/... 关于如何优化它有什么帮助吗?

答:

0赞 Udit kumar Mahato 2/5/2023 #1

问题是window.addEventListener('scroll', doso, false);在首次调用 UPME 函数时,UPME 函数内部仅执行一次。在后续调用 upme 时,window.addEventListener('scroll', doso, false);line 将不会再次执行,并且 doso 函数不会注册为滚动事件侦听器。要使在每个 resize 事件上调用 doso 函数,您需要移动 window.addEventListener('scroll', doso, false);在 UPME 函数之外,因此每次调用 UPME 时都可以执行它。

评论

0赞 Barmar 2/5/2023
为什么它不会在后续调用中执行?
0赞 Community 2/7/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 Md Afzaal Khan 2/5/2023 #2

问题是您在“upme”函数中添加了“scroll”事件侦听器。这意味着 “doso” 函数只会在首次调用 “upme” 函数时注册为 “scroll” 事件侦听器一次。

若要解决此问题,应将“scroll”事件侦听器移到“upme”函数之外,以便每次调用“upme”函数时都会注册它,包括由于“resize”事件而调用它时。

下面是代码的更正版本:

function chekon() {


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

  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;
  }

  function doso() {
    lopp = document.getElementById("Web_1920__1");
    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();

评论

0赞 Barmar 2/5/2023
由于 而首次加载页面时调用该函数。upme()document.addEventListener('DOMContentLoaded', upme);
0赞 Barmar 2/5/2023
我认为代码是正确的,但您的解释似乎不正确。
0赞 Soumya Roy 2/5/2023
@Md Afzaal Khan 中,您完全将 doso 函数移出了 upme 函数。现在,调整大小将如何在这两个功能上工作。它们现在是单独的功能。
0赞 Md Afzaal Khan 2/6/2023
@SoumyaRoy “resize”事件将同时适用于这两个函数,因为它们都附加到窗口上的“resize”事件侦听器。当窗口调整大小时,将调用“upme”和“doso”函数。