15

ユーザーに動画広告を表示しています。ちなみに私はこれらの広告をホストしていません。他社からもらっています。

広告がクリックされるたびに、ユーザーのブラウザにCookieが残ります。10秒ごとにCookieの存在をチェックする関数を作成しました。

私がやりたいのは、この関数を実行できる回数または実行できる秒数を制限することです。

以下は機能です:

function checkCookie()
{
var cookie=getCookie("PBCBD2A0PBP3D31B");
  if (cookie!=null && cookie!="")
  {
  alert("You clicked on an ad" );
  }

setInterval("checkCookie()", 10000);

要約すると。setInterval("checkCookie()", 10000);実行できる反復回数を制限したい

4

5 に答える 5

25

を呼び出すとsetInterval、間隔IDが返されます。これを使用して、を呼び出すことで停止できますclearInterval。そのため、変数の反復をカウントする必要があります。特定のカウントに達したら、で指定clearIntervalされたIDで使用しますsetInterval

var iterations = 0;
var interval = setInterval(foo, 10000);
function foo() {
    iterations++;
    if (iterations >= 5)
        clearInterval(interval);
}

実例

于 2012-07-26T19:08:33.293 に答える
4

これはそれを行う必要があります:

function checkCookie() {
    var cookie = getCookie("PBCBD2A0PBP3D31B");
    if (cookie != null && cookie != "") {
        alert("You clicked on an ad");
    }
    if (counter > 10) clearInterval(clr);
    counter++;
    clr = setInterval(function(){checkCookie()}, 10000);​
}
var counter = 0;
checkCookie();
于 2012-07-26T19:09:03.260 に答える
1

WindowTimers.setInterval(func, delay[, param1, param2, ...])

3番目以降のsetIntervalパラメーターは、区間関数に渡すオプションのパラメーターです。これらのオプションの引数は、IE9以前ではサポートされていないことに注意してください。

グローバルスコープまたはスコープ外の使用を回避することで、これを有利に使用できます。以下に見られるように。間隔関数は、パラメーターを介してカウンターの制限と現在の増分を追跡しoptsます。

この関数は、タイマーのタスクが完了したかどうかを判断するためにブール値を返すrunTask必須の引数を取ります。fn以下の例で実行される2つのタックがあり、それぞれが実行される速度と満たされる条件が異なります。

最初の2つのタスクは終了しますが、最後のタスクは条件が満たされる前に試行が不足します。

function writeLine(el, text) {
  el.innerHTML += [].slice.call(arguments, 1).join(' ') + '\n';
}

function runTask(options, interval, limit) {
  var interval = setInterval(function(opts) {
    opts.incr = (opts.incr || 0) + 1;    
    if (opts.fn(opts)) {
      clearInterval(interval);
      writeLine(opts.el, '>> Task finished...');
    } else if (opts.incr > limit) {
      clearInterval(interval);
      writeLine(opts.el, '>> Exceeded limit of ' + limit);
    } else {
      writeLine(opts.el, '>> Attempt: ' + opts.incr + '/' + limit);
    }
  }, interval, options);
}

// 5 atttempts to reach 4 in 250ms.
runTask({
  fn : function(opts) { return opts.incr === 4; },
  el : document.querySelectorAll('div.col')[0]
}, 250, 5);

// 10 atttempts to reach 7 in 100ms.
runTask({
  fn : function(opts) { return opts.incr === 7; },
  el : document.querySelectorAll('div.col')[1]
}, 100, 10);

// 10 atttempts to reach 15 in 50ms.
runTask({
  fn : function(opts) { return opts.incr === 15; },
  el : document.querySelectorAll('div.col')[2]
}, 50, 10);
.col {
  display: inline-block;
  width: 175px;
  font-family: monospace;
  white-space: pre;
  border: thin solid black;
  vertical-align: top;
  padding: 4px;
}
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>

于 2015-04-03T19:01:27.700 に答える
0

追跡するには、ある種のグローバルカウンター変数が必要です。たとえば、次のコードは、ページの読み込みごとに最大20回Cookieチェックを実行するだけです。

var numChecks = 0;

function checkCookie()
{
    ...

    numChecks++;
    if (numChecks < 20) setTimeout("checkCookie()", 10000);
}

setTimeout("checkCookie()", 10000);
于 2012-07-26T19:08:00.307 に答える
0

コールバックを間隔関数に渡すと、グローバルスコープのカウンターが更新されます。

var countIntervals = 0,
    intervalFunc = function(_callback){

        console.log(countIntervals);

        if(countIntervals > 5) {            
            clearInterval(setIntervalVar);
        } else {
            // do stuff
            _callback();
        }
    };

setIntervalVar = setInterval(intervalFunc.bind(null, function(){
    countIntervals++;
}), 500);
于 2015-07-10T14:17:17.273 に答える