有没有像javascript窗口onidle事件这样的事情

时间:2018-05-22 21:08:45

标签: javascript events

function init() {
    //$.ajax({url: blah-blah-blah...});
    window.myTimer = setTimeout(init, 1000);
    return;
}

我的init();循环正在运行,我希望在我的窗口对象被更改(调整大小,移动等等)时清除它。

当我完成此操作时,我希望能够调用类似的内容:window.addEventListener('idle', function() { if (!window.myTimer) { init(); } });

我认为通过以下方式恢复是安全的:

window.addEventListener('mouseup', function() { if (!window.myTimer) { init(); });

然而,这个甚至没有像我预期的那样工作,它忽略了滚动方面。我也尝试了onchange事件,当事情发生变化时,事件就会发生。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

所以在快速阅读之后,花点时间对它进行全面测试;这是我对df函数(MDN Reference)的解释的基础知识。

requestIdleCallback
/* Global Variable Declarations */
window.myTimer = null;
window.counter = 0;
/* END Global Variable Declarations */

function init() {
	/* My Custom checking code here */
        document.getElementById('counter').innerHTML = window.counter+"";
	console.log(window.counter);
	window.counter += 1;
	/* End My Custom checking code */
	
	/* Non-Blocking Loop */
	window.myTimer = setTimeout(init, 50);
	/* End Non-Blocking Loop */
}

/* Event Listener Declarations */
window.addEventListener("change", function() { clearInterval(window.myTimer); window.myTimer = null; });
window.requestIdleCallback(function() { if (!window.myTimer) { init(); } });
/* END Event Listener Declarations */

我在Chrome中测试了发布的代码以及我的jQuery ajax代码,这一切似乎都运行良好。

与试图捕获所有其他可能的事件状态相比,这是非常紧张的前进!

我在Edge中测试了以下解释,它看起来效果很好:

<div id="counter"></div>
function msDiff(timeStamp) {
	var a = timeStamp;
	var oMS = (a.getHours()*60*60*1000) + (a.getMinutes()*60*1000) + (a.getSeconds()*1000) + a.getMilliseconds();
	var b = new Date();
	var nMS = (b.getHours()*60*60*1000) + (b.getMinutes()*60*1000) + (b.getSeconds()*1000) + b.getMilliseconds();
	return nMS - oMS;
}

/* Global Variable Declarations */
window.myTimer = null;
window.myPause = new Date();
window.counter = 0;
/* END Global Variable Declarations */

function init() {
	/* My Custom checking code here */
        document.getElementById('counter').innerHTML = window.counter+"";
	console.log(window.counter);
	window.counter += 1;
	/* End My Custom checking code */
	
	/* Non-Blocking Loop */
	window.myTimer = setTimeout(init, 50);
	/* End Non-Blocking Loop */
}

function myPauseLoop() {
	if (msDiff(window.myPause) > 500) {
		init();
		return;
	} else {
		setTimeout(myPauseLoop, 500);
	}
}

/* Event Listener Declarations */
window.addEventListener("change", function() { 
	clearInterval(window.myTimer); 
	window.myTimer = null; 
	window.myPause = new Date();
});
/* End Event Listener Declarations */

init();