【问题标题】:Declaring scroll position variables with a scroll event listener使用滚动事件侦听器声明滚动位置变量
【发布时间】:2018-06-11 00:06:37
【问题描述】:

我在使用滚动事件侦听器的视差效果以及各种类型的淡入淡出和调整大小动画方面获得了很多乐趣,有点像这样:

window.addEventListener('scroll', function() {

  var i = window.pageYOffset;
  var w = window.innerWidth;
  var h = window.innerHeight;

  //a bunch of various functions
  //making things move on the page

});

我所做的所有事情几乎都依赖于跟踪这三个值,而我对滚动事件调用的每个函数所做的就是在函数中重新声明这些变量。我理解为什么(排序,只是现在不要让我解释它:P)但我想知道是否有办法重写代码,这样这些变量只需要声明一次,不同的函数就可以拥有无需告诉函数进行自我更新即可访问该数据……这很有意义,对吧?

编辑:更具体地说明我目前的设置方式:

function someFunction() {
  var i = window.pageYOffset;
  var w = window.innerWidth;
  var h = window.innerHeight;

  //things happen
}

function someOtherFunction() {
  var i = window.pageYOffset;
  var w = window.innerWidth;
  var h = window.innerHeight;

  //more things happen
}

window.addEventListener('scroll', function() {
  var i = window.pageYOffset;
  var w = window.innerWidth;
  var h = window.innerHeight;

  someFunction();
  someOtherFunction();
});

当我开始添加所有这些事件时,我最初确实拥有函数所做的所有事情事件侦听器函数中,在这种情况下我不需要重新声明任何东西,但是随后我到了添加@media 查询的地步,一切都崩溃了。我想出的最佳解决方法是使用一系列 if/else if 语句来根据屏幕大小更改滚动功能的行为。这使得整个过程极度重复,因此,我现在有了上面的代码。在这种情况下,我收到“未引用”错误,因为 iwh 在事件侦听器调用的函数范围之外声明。

注意:我刚刚尝试过——可能是第四次,但我完全支持三重和四重检查——将这些变量放在顶部,everything 之外也不行。只有当我为每个需要使用的实例重新声明变量时,它才有效。

【问题讨论】:

  • 我不完全按照您所说的“需要告诉函数更新自身”的意思 - 每次滚动发生时这些变量不会更新吗?究竟是什么问题?
  • 您的代码正是这样做的。上述三个变量只需声明一次,之后的任何函数都可以使用。
  • @AndrewL 你会这么认为吗?我当然做到了,但事实证明并非如此。当我在事件侦听器 inside 中设置函数时,它确实/确实以这种方式工作,但是由于我做了很多不同的事情,我决定在事件侦听器,只需调用函数...我将编辑帖子以澄清..
  • @panrosmithe 您的编辑说得很清楚。只需在事件处理程序之外声明您的变量声明。有关详细信息,请参阅variable scope

标签: javascript scroll scope global-variables addeventlistener


【解决方案1】:

将变量声明移到函数外,使其成为全局变量。否则,您只能在您声明它们的函数中访问它们。

// variables global now -- yay
// declaring variables here means that they exist past the scroll event handler
var i, w, h;

function someFunction() {
  //things work
}

function someOtherFunction() {
  //more things work
}

window.addEventListener('scroll', function() {
  i = window.pageYOffset;
  w = window.innerWidth;
  h = window.innerHeight;

  someFunction();
  someOtherFunction();
});

【讨论】:

  • 哦哦,我明白了。看,当我尝试在全球范围内声明它们时,我也在全球范围内初始化它们,但这不起作用。好吧,现在我得调整一下我对如何使用变量的理解了……谢谢!!
  • @panrosmithe 很高兴你现在明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多