1、javascript中事件中如果有alert,为什么是等所有的alert都执行完了,再改变p的颜色,而不是弹一个框改变一个颜色?
CSS如下:
HTML如下:
JAVASCRIPT如下:
var p1=document.getElementById('p1');
var p2=document.getElementById('p2');
var p3=document.getElementById('p3');
p1.addEventListener('click',function(){
alert(this.id);
this.style.borderColor='red';
var self=this.style;
setTimeout(function(){
self.borderColor='black';
},1000)
},false);
p2.addEventListener('click',function(){
alert(this.id);
this.style.borderColor='red';
var self=this.style;
setTimeout(function(){
self.borderColor='black';
},1000)
},false);
p3.addEventListener('click',function(){
alert(this.id);
this.style.borderColor='red';
var self=this.style;
setTimeout(function(){
self.borderColor='black';
},1000)
},false)
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
alert会阻塞所有线程,其中就包括GUI渲染线程(所以颜色不变)和主线程(所以setTimeout里面的任务只是在1秒后被添加到了任务队列里面,但是没有执行,需要你关闭了alert之后才会执行,但是你关闭第一个alert之后,马上又有同步任务了,所以那个第一个异步任务一直执行不了,必须等到所有同步任务执行完之后第一个异步任务才能执行, 后面两个异步任务同理)
我运行是弹一个框改变一个颜色,并没有出现所有alert再变色的情况
代码如下
应该事件冒泡了吧
第一是事件冒泡了,第二是setTimeout是异步编程,会把所有setTimeout的程序都放到执行的队尾,第三window.alert会阻塞程序。所以你点p3的流程是alert(3)->alert(2)->alert(1)-->color3-->color2-->color1