js最小化timer不准确

JavaScript018

js最小化timer不准确,第1张

不准的原因是,setTimeout 是一个异步任务,在执行到 setTimeout 的时候,js 引擎不会立刻把定时任务放到事件循环的任务队列中,而是等待时间到了,再放进事件循环的队列中。

注意,是时间到了才加入队列,那么如果队列中已经有了其他的任务要执行,这个新加的定时器任务自然要等待前面的任务结束,所以时间会延后。

我们只能尽量调整延后的时间偏差,不能修正到完全精确,代码如下

// performance.now 比 Date.now 更精确

let startTime = performance.now()

// count表示定时器被调用的次数,次数需要是全局变量

let count = 0

function myTimeout(){

let runTime = performance.now()

// 先增加次数

++count

// diffTime 就是已经延后的时间

let diffTime = (runTime - (startTime + count * 1000))

// 既然已经延后了,就需要时间间隔,减去已经拖延的时间,提前开始

setTimeout(myTimeout, 1000 - diffTime)

}

let t = setTimeout(myTimeout , 1000)

js中setTimeout定时器不准的原因,以及修正的办法

可以用js控制最小化的浏览器窗口桔黄闪动提示新信息,控制title文字就行。具体如下:

//取title

var title = document.getElementsByTagName('title')[0]

//需要修改的时候,直接给innerHTML复制

var title.innerHTML = '这里在闪'。

真的不行,换句话,没有办法的。

<!DOCTYPE HTML>

<html>

<head>

<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8">

<title>无标题文档</title>

<script type="text/javascript">

function isMinStatus() {

var isMin = false

if (window.outerWidth != undefined) {

isMin = window.outerWidth <= 160 &&window.outerHeight <= 27

}

else {

isMin = window.screenTop <-30000 &&window.screenLeft <-30000

}

return isMin

alert(111)

}

function notifyTeacher(){

alert('document.body.offsetTop:'+document.body.offsetTop+',document.body.offsetWidth:'+document.body.offsetWidth+',screen.availWidth:'+screen.availWidth+',top.screenTop:'+top.screenTop)

alert('window.screen.width:'+window.screen.width+',window.screen.height:'+window.screen.height+',window.screen.availWidth:'+window.screen.availWidth+',window.screen.availHeight:'+window.screen.availHeight)

alert(top.name)

alert(top.screenTop+'|'+top.screenLeft)

if(isMinStatus()){

window.focus()

}else{

document.focus()

}

}

</script>

</head>

<body onLoad="notifyTeacher()">

</body>

</html>