我想用js写一个闪烁效果
思路是在一个方法里面循环几次,每次循环改变dom的一些属性,然后写了个死循环(第二层循环)拖时间,再进行下一个循环(第一层循环)
核心代码如下:
// 单线程暂停time毫秒
function wait(time) {
var currentTime = new Date().getTime();
do {
} while (new Date().getTime() - currentTime < time)
}
// 单个方块闪烁(无延迟)
function alertSingle(x, y) {
if (getGird(x, y).attr("class").indexOf("gird alert") > -1) {
getGird(x, y).attr("class", "gird on");
} else {
getGird(x, y).attr("class", "gird alert");
}
}
// 一些方块闪烁(有延迟)
function alertAll(array, frequency, times) {
for (var i = 0; i < times; i++) {
for (var j = 0; j < array.length; j++) {
alertSingle(array[j][0], array[j][1]);
}
wait(frequency);
}
}
然后我发现浏览器会在这些代码执行完毕之后再进行页面的渲染,也就是说这个方法是无效的。
有什么办法可以写出一个闪烁效果(或者任何通过改变dom结构/属性来达成的效果),使得在执行这个效果的中途页面正常渲染,而此时无法执行其他任何js代码(即这个代码是全局同步的,我个人不知道怎么实现,用死循环实现的)?
反正用setTimeout之类的方法是可以实现页面正常渲染,但是这个方法本身并不是同步的,调用这个方法之后瞬间就会继续执行往下的代码,我不希望这样
谢谢大家
思路是在一个方法里面循环几次,每次循环改变dom的一些属性,然后写了个死循环(第二层循环)拖时间,再进行下一个循环(第一层循环)
核心代码如下:
// 单线程暂停time毫秒
function wait(time) {
var currentTime = new Date().getTime();
do {
} while (new Date().getTime() - currentTime < time)
}
// 单个方块闪烁(无延迟)
function alertSingle(x, y) {
if (getGird(x, y).attr("class").indexOf("gird alert") > -1) {
getGird(x, y).attr("class", "gird on");
} else {
getGird(x, y).attr("class", "gird alert");
}
}
// 一些方块闪烁(有延迟)
function alertAll(array, frequency, times) {
for (var i = 0; i < times; i++) {
for (var j = 0; j < array.length; j++) {
alertSingle(array[j][0], array[j][1]);
}
wait(frequency);
}
}
然后我发现浏览器会在这些代码执行完毕之后再进行页面的渲染,也就是说这个方法是无效的。
有什么办法可以写出一个闪烁效果(或者任何通过改变dom结构/属性来达成的效果),使得在执行这个效果的中途页面正常渲染,而此时无法执行其他任何js代码(即这个代码是全局同步的,我个人不知道怎么实现,用死循环实现的)?
反正用setTimeout之类的方法是可以实现页面正常渲染,但是这个方法本身并不是同步的,调用这个方法之后瞬间就会继续执行往下的代码,我不希望这样
谢谢大家
不能用同步。那会让浏览器假死,期间无法渲染页面。要用setTimeout()加回调函数来做。把要在后续执行的代码放到回调函数中,在用setTimeout()进行完闪烁效果之后再执行这个回调函数
我能想到的解决方案就是自行编写一个全局的setInterval方法(使用很小的time gap),然后在其中就能自己控制每个代码的执行顺序了。而且每次一个代码段执行完毕之后都会退出出setInterval绑定的方法,这样一来每次执行setInterval绑定的方法之后页面都会重新渲染一次。
伪代码如下:
setInterval(function(){
switch(当前的操作类型){
case '操作类型A':
// 执行闪烁操作
break;
case '操作类型B':
// 执行其他操作
break;
}
},5);
这样我控制一个变量就能决定接下来处理什么代码,可以接近“全局同步”这样的感觉。
这样是否可行?
至少功能上应该是可行的,就是不知道会不会影响性能?
我能想到的解决方案就是自行编写一个全局的setInterval方法(使用很小的time gap),然后在其中就能自己控制每个代码的执行顺序了。而且每次一个代码段执行完毕之后都会退出出setInterval绑定的方法,这样一来每次执行setInterval绑定的方法之后页面都会重新渲染一次。
伪代码如下:
setInterval(function(){
switch(当前的操作类型){
case '操作类型A':
// 执行闪烁操作
break;
case '操作类型B':
// 执行其他操作
break;
}
},5);
这样我控制一个变量就能决定接下来处理什么代码,可以接近“全局同步”这样的感觉。
这样是否可行?方法可行,但不如用回调函数方便
//回调函数伪代码如下:
function flash(callback) {
function p() {
//闪烁操作
if (操作完成) {
callback();
} else {
setTimeout(p, 100);
}
}
p();
}flash(function(){
//后续执行的代码
});