2017-07-20 4 views
0

jQueryスライディングアニメーションを適用するページの要素のリストがあります。しかし、アニメーションが順番に連鎖するようにしたい、つまり、前のアニメーションが終了したときにのみ要素がアニメーションを開始するようにしたい。Javascriptを使用するeval():コードセキュリティ/脆弱性について疑問に思う

リストの長さは可変なので、私は動的な解決策を見つける必要があります。 私はこの思い付いた:上記のコードでは

function closeYear(year, speed, complete) { 
    $(year).next().slideUp(speed, complete); 
} 

function closeYears(years, speed, complete) { 
    if ($(years).length == 1) { 
    closeYear($(years).first(), speed, complete); 
    } else if ($(years).length > 1) { 
    var codeStr = "" 
    $(years).slice(0, $(years).length - 1).each(function(k) { 
     codeStr = codeStr + "closeYear($(years)[" + k + "],'" + speed + "',"; 
    }); 
    codeStr = codeStr + "closeYear($(years).last(),'" + speed + "',complete)" + Array($(years).length).join(")") + ";"; 

    eval(codeStr); 
    } 
} 

、私はときにすべて実行されるアニメーションの速さだけでなく、complete関数を指定することができることを含め、私が欲しいものを達成することができますよ

closeYears($(".year"), "slow", function() {console.log("done!");}) 

私の質問はeval()機能の使用に関するされていますので、同様に、処理されました。私はセキュリティ上の問題に関してはあまり精通していないので、自分のコード、書かれた方法、または自分の望むことをやるためのより良い/より安全な方法があれば心配していますか? ...

コメントがありますか?

+0

その安全な、しかし非常に非常に遅いです。 –

+0

[JavaScriptのeval()が悪い場合](https://stackoverflow.com/questions/197769/when-is-javascripts-eval-not-evil) – Nope

+0

ほとんどの場合、使用する必要がありますeval()あなたは何か間違っている。あなたのコードを見ると、実際にはそれを使う必要はありません。 – epascarello

答えて

1

あなたはおそらく擬似再帰関数が必要になります。

function closeYears(years, speed, complete) { 
    (function close(i){ 
    if(!years[i]) return complete(); 
    closeYear(years[i],speed,function(){ 
     close(i+1);   
     }); 
})(0); 
} 
+0

美しく動作します。前と同じようなことをしようとしましたが、どこかで何か間違ったことをしているに違いないでしょう。ありがとうございました@Jonas w – Vasco

+0

@vasco youreようこそ;) –

関連する問題