我在Javascript中有这个代码:https://pastebin.com/zgJdYhzN。当滚动功能到达某一点时,它应该淡入文本,虽然这确实有效,但是会有几个页面使用它,我想避免创建这个函数的几个实例。如果我可以创建一个函数并且对于具有“.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");
});
var pl = once(function() {
fadeInText(".pl");
});
var pl1 = once(function() {
fadeInText(".pl1");
});
var smallp = once(function() {
fadeInText(".smallp");
});
var smallp1 = once(function() {
fadeInText(".smallp1");
});
var smallp2 = once(function() {
fadeInText(".smallp2");
});
var smallp3 = once(function() {
fadeInText(".smallp3");
});
var head0 = once(function() {
fadeInText(".head0");
});
$(window).scroll(function() {
if( $(this).scrollTop() + $(window).height() > $(".split1").offset().top) {
split1();
}
if( $(this).scrollTop() + $(window).height() > $(".pl").offset().top) {
pl();
}
if( $(this).scrollTop() + $(window).height() > $(".pl1").offset().top) {
pl1();
}
if( $(this).scrollTop() + $(window).height() > $(".smallp").offset().top) {
smallp();
}
if( $(this).scrollTop() + $(window).height() > $(".smallp1").offset().top) {
smallp1();
}
if( $(this).scrollTop() + $(window).height() > $(".smallp2").offset().top) {
smallp2();
}
if( $(this).scrollTop() + $(window).height() > $(".smallp3").offset().top) {
smallp3();
}
if( $(this).scrollTop() + $(window).height() > $(".head0").offset().top) {
head0();
}
});
答案 0 :(得分:1)
不确定我是否错过了为什么需要once
方法。有没有理由你不能做这样的事情:
var selectors = ['.one', '.two', '.three'];
var elements = {};
selectors.forEach(function(selector){
elements[selector] = $(selector);
});
function elementOnScreen(selector) {
if(!elements[selector]){
return false;
}
return $(window).scrollTop() + $(window).height() > elements[selector].offset().top
}
$(window).scroll(function() {
selectors.forEach(function(selector) {
if(elementOnScreen(selector)){
fadeInText(selector);
delete elements[selector];
}
if(Object.keys(elements).length === 0){
$(window).off('scroll');
}
});
});
答案 1 :(得分:0)
使用循环生成所有元素的函数:
const handlers = [".split1", ".pl" /*...*/]
.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();
}
});
您还可以为类的所有元素生成处理程序:
const handlers = $(".split").toArray()
.map(s => ({ el: $(s), show: once(() => fadeInText(s)) }));