如何将函数应用于类的所有元素

时间:2018-03-20 17:05:39

标签: javascript jquery function animation

我有一个函数,我想应用于同一个类的几个元素。它是一个滚动页面功能,我需要它只执行一次。所以我把它放在一个包装器里。它有效,但我希望能够只为一个元素添加一个类,并让它对该元素起作用。我尝试迭代元素并使用addClass添加一个唯一的类,并将其各自的索引添加到结尾,但这不起作用。我现在所拥有的只是第一个元素与" split"类。

//EXECUTES ONLY ONCE
function once(fn, context) { 
    var result;
    return function() { 
        if(fn) {
            result = fn.apply(context || this, arguments);
            fn = null;
        }
        return result;
    };
}
// Usage
//var split1 = once(function() {
//  fadeInText(".split1");
//});
const handlers = $(".split").toArray()
   .map(s => ({ el: $(s), show: once(() => fadeInText(s)) }));

$(window).scroll(function() {
    for(const {el, show} of handlers) {
    if( $(this).scrollTop() + $(window).height() > el.offset().top) 
       show();
  }
});

//SPLITTEXT
var f = ".split",
fadeInText(f);
function fadeInText(l) {
var el = document.querySelector(l);
var split = el.dataset.split;
var text = new SplitText(el, { type: split });
var tl = new TimelineMax({ paused: false });
var splitEls = text[split];
var wrapEls = function wrapEls(els) {
    return els.map(function (el) {
        return '<span style="display: inline-block">' + el.innerText + '</span>';
    });
};
var wrapped = wrapEls(splitEls);

splitEls.forEach(function (el, i) {
    el.style.overflow = 'hidden';
    el.innerHTML = wrapped[i];
});

var masks = splitEls.map(function (el) {
    return el.querySelector('span');
});

tl.staggerFrom(masks, 1.25, { skewY: 4, y: '200%', ease: Expo.easeOut, delay: 0.9 }, 0.1, 'in');
    return l;
}

2 个答案:

答案 0 :(得分:0)

$('.class').each(function(){ /* 'this' means the element */})

在函数内部,this的范围限定为迭代中的元素。

答案 1 :(得分:0)

如果你想要一个纯粹的js应用程序,试试这个:

elements = document.querySelectorAll('.class');

elements.forEach((element, key) => {
        //your code
})