[英]loop through a javascript object
我有一個看起來像這樣的javascript對象,
var telephones = {
/*
"phone" : {
duration : time it takes to animate element in,
leftIn : position of element once on the incoming animation
leftOut : position of element on the outgoing animation
delay : delay between two animations
}
*/
"phone1": {
duration : 850,
leftIn : "408px",
leftOut : "9999px",
delay : 0,
},
"phone2" : {
duration : 600,
leftIn : "962px",
leftOut : "999px",
delay : setDelay(),
},
"phone3" : {
duration : 657,
leftIn : "753px",
leftOut : "9999px",
delay : 0,
},
"phone4" : {
duration : 900,
leftIn : "1000px",
leftOut : "9999px",
delay : setDelay(),
},
"phone5" : {
duration : 1200,
leftIn : "800px",
leftOut : "9999px",
delay : 0,
},
"phone6" : {
duration : 792,
leftIn : "900px",
leftOut : "9999px",
delay : setDelay(),
},
};
我正在使用上述對象嘗試對幻燈片中的單個元素進行動畫處理,該幻燈片已經通過jquery cycle插件進行了動畫處理。 我以以下方式使用代碼,
$('#slideshow').cycle({
fx: 'scrollHorz',
before : triggerParralex,
after : removeParralex,
easing : 'easeOutCubic',
speed : 2000
});
因此,上面的代碼啟動了循環插件。 然后,我使用的是之前和之后的回調運行2個功能,這些功能是這樣的,
function bgChange(curr, next, opts) {
var background = $(".current").attr('data-background');
$.backstretch(background, {target: "#backstrectch", centeredY: true, speed: 800});
}
function triggerParralex(curr, next, opts) {
//move any phones that are in the viewport
for (var key in telephones) {
var obj = telephones[key];
for (var prop in obj) {
if($(".current ." + key).length) { //does .custom .phone1/2/3/4/5/6 exist if it does we can carry on
setTimeout(function() {
$(".current ." + key).animate({
"left" : obj["leftOut"],
"opacity" : 0
}, obj["duration"]);
}, obj["delay"]);
}
}
}
//change the background
bgChange();
//remove the current class from the DIV
$(this).parent().find('section.current').removeClass('current');
}
function removeParralex(curr, next, opts) {
//give the slide a current class so that we can identify it.
$(this).addClass('current');
//animate in any phones that belong to the current slide
for (var key in telephones) {
var obj = telephones[key];
for (var prop in obj) {
console.log(obj["leftIn"])
if($(".current ." + key).length) { //does .custom .phone1/2/3/4/5/6 exist if it does we can carry on
setTimeout(function() {
$(".current .phone1").animate({
"left" : obj["leftIn"],
"opacity" : 1
}, obj["duration"]);
}, obj["delay"]);
}
}
}
}
我的問題如下
我正在嘗試為我的section元素中的圖像設置動畫,這些section元素已經通過cycle plugin滑動了,這對我來說就像是在以后阻止我的圖像動畫化?
第二個問題似乎是,雖然我的腳本會很高興地找到$(".current .phone1")
似乎只是從對象中添加了phone6的屬性,但我還是做了一個小提琴 。
正如您從小提琴中看到的那樣,帶有#slideshow
的部分正在循環#slideshow
,但是其中的圖像沒有動畫...為什么?
正如Felix Kling在評論中說的那樣,您遇到了一個經典的“內部循環封閉”問題。
這是一個(經典)解決方案:
for (var key in telephones) {
if($(".current ." + key).length) { //does .custom .phone1/2/3/4/5/6 exist if it does we can carry on
var obj = telephones[key];
(function(obj){
setTimeout(function() {
$(".current .phone1").animate({
"left" : obj["leftIn"],
"opacity" : 1
}, obj["duration"]);
}, obj["delay"]);
})(obj);
}
}
想法是將obj嵌入另一個閉包中,將其與循環隔離,從而防止更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.