在IE中打开文件选择对话框时的setTimeout / setInterval

时间:2014-08-22 16:23:21

标签: javascript internet-explorer

当文件输入的“选择文件”对话框窗口打开时,Internet Explorer(11)似乎阻止了触发setTimeout / setInterval回调。在对话框打开时是否有可靠的方法触发重复事件(例如心跳)?

2 个答案:

答案 0 :(得分:3)

除了可能使用网络工作者之外,没有。

JavaScript是单线程和本机弹出窗口,例如alertconfirm,文件对话框窗口阻止主线程上的所有JavaScript执行,直到它们关闭

答案 1 :(得分:0)

一种相对昂贵但可靠的方法是滥用requestAnimationFrame,当“选择文件”对话框打开时,它似乎会触发。

var setRequestAnimationFrameTimeout = function(callback, length) {
  var reqId;
  var startTime = new Date();

  var step = function() {
    if ((new Date() - startTime) >= length) {
      callback();
    } else {
      reqId = window.requestAnimationFrame(step);
    }
  };

  step();

  return {
    cancel: function() {
      if (reqId !== undefined) {
        window.cancelAnimationFrame(reqId);
      }
    }

  }
};

var setRequestAnimationFrameInterval = function(callback, length) {
  var reqId;
  var startTime = new Date();
  var nextCall = 0;

  var step = function() {
    var diff = new Date() - startTime;

    if (Math.floor(diff / length) === nextCall) {
      nextCall += 1;
      callback();
    }

    reqId = window.requestAnimationFrame(step);
  };

  step();

  return {
    cancel: function() {
      if (reqId !== undefined) {
        window.cancelAnimationFrame(reqId);
      }
    }
  }

};

setRequestAnimationFrameTimeout(function() { console.log('timer'); }, 1000);

var i = 0;
setRequestAnimationFrameInterval(function() { console.log('interval', i++); }, 1000);

请注意only IE 10 and 11 support requestAnimationFrame