2016-05-15 29 views
1

私は現在取り組んでいるプロジェクトを持っており、ウェブサイト上で実行したい特定のアクション(この場合、特定の時間の後に多くのボタンをクリックする)の問題を処理する最短のコードを作成しています。 これまでの私の結果は次のとおりです。javascriptの単一ループ内で多くを変換するにはどうすればよいですか?

あなたはそこに多くのクラスが同じ名前で存在している、と私は減速するのsetTimeoutを使用してい気づくことができるようにするので、私は、それのためにループを使用することができた場合素晴らしいだろう
if (myvar == i) { 
     setTimeout(function() { 
     $('.class.' + i).children('.BUTTON').click(); 
     }, time * i); 
    } 

プロセスを停止してサイトが理解できるようにボタンの「クリック」しています 今のところ、「i」の代わりに数字を使用している多くの人がうまく動作しますが、そこにはもっと良い方法があります。私が何らかのループを実装すると、スクリプトが壊れる;(提案?

+0

他のコードは、> =私は明確にすること、それは最後の1つになっています。 – TweakFix

+0

"そこには同じ名前のクラスがたくさんあることに気が付いているから" ...あなたはhtmlや例へのリンクを投稿していないので、どうやって気付くことができますか? [mcve]を読む – yezzz

答えて

2

私は正しく推測している場合は、これはおそらく試したものです:

for (var i = 0; i < 100; i++) { 

    setTimeout(function() { 

     $('.class.' + i).children('.BUTTON').click(); 

    }, time * i); 

} 

は、それが原因で非同期性のjavascriptの原因の動作しませんでしたdoesnのsetTimeoutのコールバック」すぐに実行されません。これは目的には適していますが、setTimeoutと呼び出すたびに、そのコールバックは実際には同じイテレータilexical-scopingのため)を参照しています。コールバックが実行さ実際をしているとき、各コールバックは今同じiので、(同じ値)とを参照するように

、すべてのボタンを同時にクリックします。

この問題は、JavaScriptがよりlexical-scopingの優先度に起因する可能性があります。しかし、私たちは、javascriptのfunctionもブロックスコープのコンストラクタとして動作することを知っています(実際には、javascriptでブロックスコープの唯一のものです)。だから我々はこのようにそれを使用します:私はここにいた何

for (var i = 0; i < 100; i++) { 

    (function(i) { // IIFE starts 

     setTimeout(function() { 

      $('.class.' + i).children('.BUTTON').click(); 

     }, time * i); 

    })(i); // <-------IIFE ends 

} 

IIFE(すぐに呼び出される関数式)と呼ばれています。 IIFEは、プログラムコントロールが到達すると直ちに実行される関数式です。また、関数がjavascriptでブロックスコープになっているため、変数iが渡される(値渡しのため)スコープのメンバーになり、もはや外部ループのiに依存しなくなります。

基本的には、IIFE内に新しいiを作成しました。そして、それぞれIIFEの場合、iの値が異なります。生命維持WITH

:ここ


は簡単な例です

for (var i = 0; i < 100; i++) { 

    (function(i) { // IIFE starts 

     setTimeout(function() { 

      console.log(i); // <----- simply printing the iterator i 

     }, 500); 

    })(i); // <-------IIFE ends 

} 

OUTPUT:生命維持WITHOUT

0 
1 
2 
3 
... (upto 99) 

for (var i = 0; i < 100; i++) { 

     setTimeout(function() { 

      console.log(i); // <----- simply printing the iterator i 

     }, 500); 

} 

OUTPUT:それはinexistantボタンを検索しないように

100 
100 
100 
... (100 times) 
関連する問題