javascript - js事件中有alert执行顺序的问题
迷茫
迷茫 2017-04-11 12:54:15
[JavaScript讨论组]

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)
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(4)
怪我咯

alert会阻塞所有线程,其中就包括GUI渲染线程(所以颜色不变)和主线程(所以setTimeout里面的任务只是在1秒后被添加到了任务队列里面,但是没有执行,需要你关闭了alert之后才会执行,但是你关闭第一个alert之后,马上又有同步任务了,所以那个第一个异步任务一直执行不了,必须等到所有同步任务执行完之后第一个异步任务才能执行, 后面两个异步任务同理)

PHP中文网

我运行是弹一个框改变一个颜色,并没有出现所有alert再变色的情况

代码如下

<!doctype html>
<html><head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
        <style>
        #p1{
            width:300px;
            height:300px;
            border:1px solid black;
        }
        #p2{
            margin:50px auto;
            width:200px;
            height:200px;
            border:1px solid black;
        }
        #p3{
            margin:50px auto;
            width:100px;
            height:100px;
            border:1px solid black;
        }
    </style>
</head> 
<body>
    
    
        <p id="p1">
        <p id="p2">
            <p id="p3">

            </p>
        </p>
    </p>

<script>
    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)
 
</script>
</body> 
</html>
 
黄舟

应该事件冒泡了吧

PHP中文网

第一是事件冒泡了,第二是setTimeout是异步编程,会把所有setTimeout的程序都放到执行的队尾,第三window.alert会阻塞程序。所以你点p3的流程是alert(3)->alert(2)->alert(1)-->color3-->color2-->color1

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号