我有此功能
function toDiv() {
$(".wrap")))
$('.barfill').each(function(){
var width=$(this).data('width');
$(this).animate({ width: width }, 500);
var $perctext = $('<div>', {'class': 'perctext', text: width});
$perctext.appendTo(this);
$perctext.delay(500).each(function(a) {
$(this).delay(a * 250).animate({
'left': width
}, 1000);
});
});
else {}
}
在元素显示在窗格上之后运行。
function toView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
我想要运行ONCE ,当元素再次出现在窗格上时,该功能不会再次触发。
我将 .one()应用于父函数,因此它只运行一次,但没有做到这一点。
您可以查看Fiddle Demo以进一步澄清问题。
注意:为了清楚起见,我更新了这个问题,因为它似乎产生了一些误解。
答案 0 :(得分:5)
使用.unbind()
删除侦听器:
$(window).scroll(toDiv);
function toView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
function toDiv() {
if (toView(
$(".wrap"))) {
$('.barfill').each(function () {
var width = $(this).data('width');
$(this).animate({
width: width
}, 500);
var $perctext = $('<div>', {
'class': 'perctext',
text: width
});
$perctext.appendTo(this);
$perctext.delay(500).each(function (a) {
$(this).delay(a * 250).animate({
'left': width
}, 1000);
});
});
$(window).unbind('scroll');
}
}
答案 1 :(得分:1)
function highlander(fn) {
return function() [
if (fn) {
fn.apply(this, arguments);
fn = null;
}
}
}
var printHello = highlander(function() {
console.log('Hello');
});
printHello();
printHello();
printHello();
// will print hello only once!
答案 2 :(得分:0)
您的解决方案应该以原始的反原则原则找到。
// define a counter
var counter = 0;
$(window).scroll(toDiv);
function toView(elem) {
//check the counter value
if (counter > 0) return false;
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
function toDiv() {
if (toView(
$(".wrap")))
$('.barfill').each(function(){
// increase the counter value
counter++;
var width=$(this).data('width');
$(this).animate({ width: width }, 500);
var $perctext = $('<div>', {'class': 'perctext', text: width});
$perctext.appendTo(this);
$perctext.delay(500).each(function(a) {
$(this).delay(a * 250).animate({
'left': width
}, 1000);
});
});
else {
}
}
结帐DEMO