当文件输入的“选择文件”对话框窗口打开时,Internet Explorer(11)似乎阻止了触发setTimeout / setInterval回调。在对话框打开时是否有可靠的方法触发重复事件(例如心跳)?
答案 0 :(得分:3)
除了可能使用网络工作者之外,没有。
JavaScript是单线程和本机弹出窗口,例如alert
,confirm
,文件对话框窗口阻止主线程上的所有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);