javascript - DOM重新被解析
天蓬老师
天蓬老师 2017-04-11 11:12:06
[JavaScript讨论组]

当点击触发function a的时候,发现一开始控制台打印的是空,然后才是document文档
如下图所示:

发现浏览器重新解析了dom,我想问,在点击之前,dom不是已经被解析了吗,为什么当执行函数的时候,dom重新被解析和渲染?

附上代码:

//css
    <style>
        .box1{
            color:red;
            }
    </style>
//html
  <body>
    <p class="box1" onclick="a()">啊啊啊啊啊啊啊啊啊啊啊</p>
      <p class="box1">啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
      <p class="box1">啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
      <p class="box1">啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>   
  </body>
//js
  <script type="text/javascript">
    function a(argument){
      console.log(document);
      var time = +new Date();
      while(true){
        if(+new Date()-time>3000){
          break;
        }
      }
    }
  </script>
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(3)
伊谢尔伦

webkit内核对console.log()会延迟执行,惰性求值,换成alert就可以看到是立即显示dom的。
参考链接

高洛峰

贴测试代码,和测试方法与原因猜测。

  <body>
    <p class="box1">p p</p>
  </body>

  <script type="text/javascript">
    var doc = document.querySelectorAll('.box1')[0];
    //var doc = document.getElementsByClassName('box1')[0];
    console.log(doc,doc.innerHTML);
    doc.innerHTML = 'test';
    for(var a=0;a<4000;a++){
        console.log(1)
    }
  </script>

测试方法:先注释掉 doc.innerHTML = 'test',正常打开网页,打开控制台,去掉注释,刷新页面。

结果:
1.第一行:“ ,p p”;
2.for循环开始输出‘1’;
3.for循环未走完页面上p p变为‘test’;
4.循环走完,第一行变为“p.box1,p p”;

说明:本来以为querySelectorAllgetElementsByClassName前者为静态接口,后者为动态接口,是动态接口引起的,测试发现不是。

猜测:可以看到js未走完没有正确输出“p.box1,p p”,所以猜测与异步有关,可能是控制台的数据显示是异步或者选择器有相关的异步模块?但是控制台为正常输出时,页面内容已经发生了变化,说明正确dom在js未走完时已经被正确查找了。所以猜测可能是浏览器多线程和模块引起的。如果能找到相关资料再来补充。

PHPz

我目前也不知道是为什么但是感觉应该跟你写的那个while有关
我试了一下:

console.log(document);
 function a(argument){
      console.log(document);
      var time = +new Date();
      while(true){
        if(+new Date()-time>3000){
          break;
        }
      }
    }

我打印了一下document在 function之前
打印出来是渲染好的document

然后在点击 会空一下再出来document

然后我将代码改了

console.log(document);
 function a(argument){
      console.log(document);
      // var time = +new Date();
      // while(true){
      //   if(+new Date()-time>3000){
      //     break;
      //   }
      // }
      var a=1;
      console.log(a++);
    }

这次后两个是直接出来的

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

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