1

200ミリ秒間隔ですべてのアイテムをクリックしようとしています。次のスクリプトを作成しましたが、Forループに問題があるようです。誰かがあなたがそれで間違っていると思うことを教えてください。

function clickLink(elm) {
    var evt = document.createEvent('MouseEvents');
    evt.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    elm.dispatchEvent(evt);
}

function sel() {
    elms = document.getElementsByClassName('uItem');
    var inputs= elms;
    var howbig= elms.length;
    console.log(howbig);

    for (var i=250;i<elms.length;i++)
    {
        setTimeout(clickLink(inputs[i]),200)
    };

このページには1400個のuItemがあります。

4

7 に答える 7

4

最もクリーンな解決策は、関数にclickLink関数を返させることです。

function clickLink(elm) {
    return function() {
        var evt = document.createEvent('MouseEvents');
        evt.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        elm.dispatchEvent(evt);
    };
}

次に、間隔が必要な場合はタイマーをずらします。

var start = 250
for (var i=start;i<elms.length;i++) {
    setTimeout(clickLink(elms[i]), 200 * (i - start))
}

または、ループを破棄して、次を使用しますsetInterval

var i = 250,
    len = inputs.length;
var itvl = setInterval(function() {
    clickLink(elms[i++]);
    if (i >= len)
        clearInterval(itvl);
}, 200);

clickLinkそして、元の機能に戻る

于 2012-11-10T15:16:57.403 に答える
2

このコードは200ミリ秒待機し、コールバックを実行して、200ミリ秒後に実行される新しいコールバックを準備します。2番目のコールバックは、の呼び出しの400ms後に実行さselれます。

    var callback = function(i) {
        return function() {
            if (i < elms.length) {
                clickLink(inputs[i]);
                setTimeout(callback(i + 1), 200);
            }
        };
    };
    setTimeout(callback(250), 200);
于 2012-11-10T15:30:20.893 に答える
2

適度に最近のバージョンのJavaScriptを使用している場合、最も簡単な方法はbindを使用することです。bindこれにより、後でではなく、が呼び出されたときに計算される引数がバインドされた単一の関数オブジェクトが作成されます。したがって、必要な行は次のとおりです。

setTimeout( clickLink.bind( null, inputs[i] ),  /* delay expression here */ )

バインドされた関数を明示的に作成することはできますが、それは醜いので、古いJavaScriptインタープリターをサポートするという強い要件がある場合にのみ作成する必要があります。

于 2012-11-10T14:58:52.030 に答える
2

の範囲、200ミリ秒の間隔を持つためにìそれに応じて増分する必要がある遅延、および引数としての関数を期待するという事実の問題があります。isetTimeout

    for (var i=250;i<elms.length;i++)
    {
        setTimeout((function() {
            var j = i // keep i as j in this closure
            return function() { // return the right function
                clickLink(inputs[j])
            }
        })(),200 * i) // set the delay depending on i
    };
于 2012-11-10T14:59:56.890 に答える
2
function sel() {
  var elems = document.getElementsByClassName('uItem');
  for (var i = 0; i < elems.length; i += 1) {
    setTimeout(function (el) {
      return function () {
        clickLink(el);
      };
    }(elems[i]), i * 1000);   
  };
}

デモ: http: //jsfiddle.net/4hYWy/


ちょっとした注意:私はこれらの構成が好きではありません(例のように遅延を計算します)。しかし、それは元のコードに非常に近く、私の選択したソリューションはおそらくそれを複雑にしすぎたでしょう。

于 2012-11-10T15:13:53.263 に答える
1

スコープの問題や正しい間隔の計算はありません。

function sel() {
    var elms = document.getElementsByClassName('uItem'),
        i = -1,
        I = elms.length,

        rec = function () {
            if ( i++ < I ) {
                clickLinks(elms[i]);
                setTimeout(rec, 200);
            }
        };

    rec();
}

http://jsfiddle.net/joplomacedo/cqfxH/

于 2012-11-10T15:29:46.097 に答える
1

これを行うと200ミリ秒ごとに1回のクリックが得られない方法で、すべてのクリックをほぼ同時に登録します(ループが最後に1000アイテムを反復する時間)ので、基本的に1000以上の約値を取得します。クリックイベントはほぼ同時に発生しますが、問題が発生する可能性があると思いますので、200msに1回程度実行してください。これを行う:

window.i=250;
for (var i=250;i<elms.length;i++)
{
setTimeout(function() {
   clickLink(inputs[window.i]);
   window.i++;
},200 * (i-249)); //Here we make sure events are spaciated 200ms each approx.
};

更新: コメントに記載されているクロージャの問題を回避するために渡すようにanonymouse関数を更新しました。i

更新2 :スコープの問題window.iを回避するために匿名関数内に追加されましたi

更新3:上記のコードを更新して、各クリックイベントが発生する間隔を修正しました。これは使用していましたが、これはゼロから始まる200 * i場合にのみ正しいです。ここでは250から始まるため、正しい形式は次のようになります。i200 * (i-249)

いくつかのコメントにもかかわらず、iスコープの問題はそれを使用して解決されました。window.iここでテストを参照してくださいhttps://tinker.io/98fd4/1

于 2012-11-10T14:54:26.717 に答える