6

重複の可能性:
setTimeout Internet Explorer

ここで何かが足りないのsetTimeoutでしょうか、それとも同じ関数の呼び出しに関数パラメーターを渡すときに Internet Explorer に問題がありますか?

これは、Internet Explorer で永久に実行されます。

function myFunction(myParam, tries){
  if (typeof tries == "undefined"){
    tries = 0;
  }
  tries++;
  if (tries < 2){
    setTimeout(myFunction, 50, myParam, tries);
  }
}
myFunction("something");

その問題を回避する方法はありますか?

http://fiddle.jshell.net/rH3gx/

4

3 に答える 3

15

説明と解決策はMDN にあります。

コールバック関数に引数を渡す必要があるが、(setTimeout() または setInterval() で) 追加パラメーターの送信をサポートしていない Internet Explorer で動作させる必要がある場合は、この IE 固有の互換性コードを含めることができます。スクリプトの先頭に挿入するだけで、両方のタイマーに対してそのブラウザーで HTML5 標準パラメーター通過機能が有効になります。

if (document.all && !window.setTimeout.isPolyfill) {
  var __nativeST__ = window.setTimeout;
  window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
    var aArgs = Array.prototype.slice.call(arguments, 2);
    return __nativeST__(vCallback instanceof Function ? function () {
      vCallback.apply(null, aArgs);
    } : vCallback, nDelay);
  };
  window.setTimeout.isPolyfill = true;
}

if (document.all && !window.setInterval.isPolyfill) {
  var __nativeSI__ = window.setInterval;
  window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
    var aArgs = Array.prototype.slice.call(arguments, 2);
    return __nativeSI__(vCallback instanceof Function ? function () {
      vCallback.apply(null, aArgs);
    } : vCallback, nDelay);
  };
  window.setInterval.isPolyfill = true;
}
于 2012-09-13T10:49:25.787 に答える
8

http://fiddle.jshell.net/rH3gx/2/

引数を必要としない関数で関数をラップする必要があります。

function myFunction(myParam, tries){
  if (typeof tries == "undefined"){
    tries = 0;
  }
  tries++;
  if (tries < 2){
    setTimeout(function() {
         myFunction(myParam, tries);
    }, 50);

  }
}

myFunction("something");
于 2012-09-13T10:52:32.957 に答える
1
setTimeout(function(){myFunction(myParam, tries);}, 50);

http://fiddle.jshell.net/rH3gx/1/

于 2012-09-13T10:53:44.693 に答える