这可能对你有用。试试看:
var counter = -1,
loadImage = function(onCase) {
return function(e) {
if (counter % 4 === onCase) {
$('body').css('background-image', 'url(' + this.src + ')');
}
};
};
$('body').on('mouseenter', '.calendar-day', function() {
counter++;
switch (counter % 4) {
case 0:
$('<img>').on('load', loadImage(0))
.attr('src', template_url + '/images/bg_2.jpg');
break;
case 1:
$('<img>').on('load', loadImage(1))
.attr('src', template_url + '/images/bg_3.jpg');
break;
case 2:
$('<img>').on('load', loadImage(2))
.attr('src', template_url + '/images/bg_4.jpg');
break;
case 3:
$('<img>').on('load', loadImage(3))
.attr('src', template_url + '/images/bg_1.jpg');
break;
}
});
onCase
旨在验证我们仍然想添加“这个”背景并且还没有移动到另一个,以防出现竞争情况。
编辑:更清洁的版本
var counter = -1,
loadImage = function(index, backgroundImages) {
$('<img>').on('load', function(e) {
if (counter % backgroundImages.length === index) {
$('body').css('background-image', 'url(' + this.src + ')');
}
}).attr('src', backgroundImages[index]);
},
backgroundImages = [
template_url + '/images/bg_2.jpg',
template_url + '/images/bg_3.jpg',
template_url + '/images/bg_4.jpg',
template_url + '/images/bg_1.jpg'
];
$('body').on('mouseenter', '.calendar-day', function() {
counter++;
loadImage(counter % backgroundImages.length, backgroundImages);
});
当元素mouseenter
触发(第一个悬停状态,第二个是mouseleave)事件.calendar-day
时,我们增加counter
并调用loadImage
. Usingcounter % backgroundImages.length
将返回我们当前的索引,一个介于 0 - backgroundImages.length 之间的数字(不包括 backgroundImages.length 本身的值)。如果您不知道模符号 ( %
),您可以在此处阅读。
loadImage
创建一个img
未附加到 dom 的元素,添加一个事件侦听器来捕获图像何时加载,然后将img
元素设置src
为我们当前的图像。一旦图像被加载,我们检查我们是否仍然想将该图像作为背景(或者我们是否已经移动到另一个图像),如果是这样,那么我们设置body
背景图像,确信它已经被加载。一旦图像被加载一次,它应该在我们的浏览器中捕获,所以下次我们附加一个事件侦听器以查看图像何时加载时,它应该立即触发。
希望我没有错过任何东西,如果有,请告诉我。