javascript - 如何仅在第一次调用函数 - JavaScript

标签 javascript

注意:我需要用纯 javascript 实现这个,我知道 jquery 中有一个 .one() 方法可以做到这一点,但我需要相同的输出在纯 JavaScript 中。

场景:当用户滚动并到达页面的 3/4 部分或更多部分时,我试图调用一个函数,但当用户到达该部分时,问题就出现了,我们都知道它们不可能是像素完美的,因此,在满足条件后,该函数会在每个像素滚动时执行。

我希望它只在满足条件时执行,然后在页面底部添加一个部分,然后用户应该再次到达底部并且函数应该只执行一次等等...

片段:

var colors = ['skyblue', 'powderblue', 'lightgreen', 'indigo', 'coral'];

var addPage = function() {
  var page = document.createElement('div');
  page.classList.add('page');
  page.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
  document.body.append(page);
  console.log('added a new page');
}

var scrollAndAdd = function() {
  if (window.scrollY < (window.innerHeight * (3 / 4))) {
    // execute addPage only once for each attempt; it's creating infinite pages
    addPage();
  }
}

window.addEventListener('scroll', scrollAndAdd);
* {
  margin: 0;
  padding: 0;
}

.page {
  height: 100vh;
}
<div class='page' style='background-color: lightgreen'></div>
<div class='page' style='background-color: skyblue'></div>

最佳答案

你真的不需要只运行一次函数的逻辑;相反,使用不同的表达式来确定是否添加页面。添加页面后,在完成更多滚动之前,相同的表达式不应再计算为真。

注意:我还稍微更改了随机选择逻辑。

var colors = ['powderblue', 'lightgreen', 'indigo', 'coral', 'skyblue'];

var addPage = function() {
  var page = document.createElement('div');
  page.classList.add('page');
  // Make sure the same color is not selected twice in sequence:
  var colorIndex = Math.floor(Math.random() * (colors.length-1));
  var color = colors.splice(colorIndex,1)[0];
  colors.push(color);
  page.style.backgroundColor = color;
  document.body.append(page);
}

var scrollAndAdd = function() {
  if (window.scrollY > document.body.clientHeight - window.innerHeight - 10) {
    addPage();
  }
}
window.addEventListener('scroll', scrollAndAdd);
* {
  margin: 0;
  padding: 0;
}

.page {
  height: 100vh;
}
<div class='page' style='background-color: lightgreen'></div>
<div class='page' style='background-color: skyblue'></div>

关于javascript - 如何仅在第一次调用函数 - JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53252562/

相关文章:

javascript - MYSQL多列总和差值

php - 使用 Web Html 表单创建 Javascript 数组

选择框的 javascript 函数不起作用

javascript - 修改子类实例中的变量

javascript - 如何创建一个具有多种状态的按钮?

javascript - 限制刷盒的最小和最大宽度

javascript - 在 JS 中使用 AJAX POST 请求保留文本格式

javascript - 大数字上的 JSON.Stringify() 会改变数值吗?

javascript - 页面加载时自动滚动图像,悬停时停止

javascript - 如何在点击时更改 CSS?