javascript - 将参数传递给 forEach.call 中的函数

标签 javascript object foreach ecmascript-6

我想了解如何将参数传递给 forEach.call 中的函数。我基本上将我的代码转换为对象字面量,并将函数拆分为更枯燥的内容,以便稍后添加更多动画。

问题是,它在加载时记录元素,但之后不再记录,我猜这是因为在第一个记录之后变量不再存在。我该如何让它发挥作用,或者这种方法完全错误且毫无意义?

工作示例: https://codepen.io/HendrikEng/pen/aEKPmM?editors=1010

我失败的尝试: https://codepen.io/HendrikEng/pen/XVBpPV?editors=0011

const who = {
  trigger: [...document.getElementsByClassName('slide')],

  init: () => {
    console.log('init');
    who.trigger.forEach.call(who.trigger, (el) => {
      el.addEventListener('mouseover', who.animateOver(el), false);
    });
    who.trigger.forEach.call(who.trigger, (el) => {
      el.addEventListener('mouseout', who.animateOut(el), false);
    });
  },

  animateOver: (el) => {
    console.log('animateOver');
    console.log(el);
    // animate image
    const image = el.getElementsByClassName("img")[0];

    TweenMax.to(image, 0.25, {
      yPercent: 35,
      ease: Power1.easeOut,
    });
  },

  animateOut: (el) => {
    console.log(el);
    console.log('animateOut');
    const image = el.getElementsByClassName('img')[0];
    TweenMax.to(image, 0.75, {
      yPercent: 0,
      ease: Bounce.easeOut,
    });
  },

  debug: () => {
    console.log('debug');
  },

  destroy() {
    console.log('destroy');
  },
};

who.init();

最佳答案

Question 中的代码调用了 .addEventListener() 中设置的函数而不是在调度事件时引用要调用的函数。此外,该事件附加到 <img>元素,.getElementsByClassName()不需要调用

const who = {
  trigger: [...document.getElementsByClassName('slide')],

  init: () => {
    console.log('init');
    who.trigger.forEach.call(who.trigger, (el) => {
      el.addEventListener('mouseover', who.animateOver, false);
    });
    who.trigger.forEach.call(who.trigger, (el) => {
      el.addEventListener('mouseout', who.animateOut, false);
    });
  },

  animateOver: (el) => {
    console.log('animateOver');
    console.log(el);
    // animate image
    const image = el.target;
    console.log(image);
    TweenMax.to(image, 0.25, {
      transformStyle: 'preserve-3d',
      yPercent: 35,
      ease: Power1.easeOut,
    });
  },

  animateOut: (el) => {
    console.log(el);
    console.log('animateOut');
    const image = el.target;
    TweenMax.to(image, 0.75, {
      yPercent: 0,
      ease: Bounce.easeOut,
    });
  },

  debug: () => {
    console.log('debug');
  },

  destroy() {
    console.log('destroy');
  },
};

onload = () => who.init();

关于javascript - 将参数传递给 forEach.call 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253873/

相关文章:

javascript - jQuery - 正在应用但未生效的 CSS 类

javascript - Javascript 如何将值从 "super class"传递到 "child class"

javascript - 如何在reactjs/javascript中按值对对象数组进行分组

javascript/DOM - 如何访问对象的属性

javascript - 如何在一个框架中创建多个对象? (创意编码)

php foreach里面for语句问题

c# - 如何在选择中没有计数器的情况下计数?

javascript - 浏览器在添加版本控制后也没有选择最新代码?

javascript - 在 chromium/puppeteer 中获取按列数拆分的 div 边界框

javascript - JSON 解析 JavaScript