我有一段代码
var wsr = $('#work-sample-row');
for (var i = 0, n = newRows.length; i < n; ++i)
{
var thisBox = box.clone();
var thisNewRow = newRows[i];
thisBox.find('.work-item-preview-outer').css('background-image', 'url(' + thisNewRow['imageurl'] + ')');
thisBox.find('.work-title').text(thisNewRow['title']);
thisBox.find('.work-descr-short').text(thisNewRow['sumsmall']);
thisBox.find('.work-link-wrap').attr('href', siteUrl + '/our-work/ ' + workUrlPiece + '?id=' + thisNewRow['id']);
wsr.append(thisBox);
setTimeout(function(){thisBox.css('opacity','1');}, i * 300);
}
用于将n
子项添加到div
并通过显示opacity
(以及 CSS3 transition
(来制作其外观动画,每个子项之间间隔 300 毫秒开始出现。但是由于某种原因,它仅适用于添加的最后一个。因此,我将代码的末尾更改为
//setTimeout(function(){thisBox.css('opacity','1');}, i * 300);
}
k = 1;
wsr.children().each(function(){
var that = $(this);
setTimeout(function(){that.css('opacity','1');}, (k++) * 300);
});
这奏效了,但这当然是不优雅的,因为我每个人都要再次迭代元素。如何使第一种方式起作用?
这是因为当执行setTimeout
回调时,thisBox
变量引用最后一个克隆的对象。JavaScript(不是 ECMAScript 2015(不支持块作用域功能。
您可以使用立即调用的函数,该函数类似于each
回调创建一个新范围。
for (var i = 0, n = newRows.length; i < n; ++i) {
var thisBox = box.clone();
// ...
(function(box, index) {
setTimeout(function(){ box.css('opacity','1');}, index * 300);
})(thisBox, i);
}