为了账号安全,请及时绑定邮箱和手机立即绑定

window.onload的疑问?

window.onload的疑问?

啊啊啊啊123 2017-02-08 15:46:22
<!doctype html> <html> <head> <meta charset="UTF-8"> <title></title> <style>     *{     padding: 0;     margin: 0;     } </style> </head> <body> <div id="box">     <img src="http://map1.zw3e.com:8080/zw_news_map/550/2016012/1452849946878113001.png" alt=""> </div> <script type="text/javascript">     var box = document.getElementById('box');      var imgs = box.getElementsByTagName('img');     var imgWidth = imgs[0].offsetWidth;     console.log(imgWidth); </script> </body> </html>为什么js部分已经在最后了却依旧不能得到结果,而放入 window.onload = function () {}里就可以?
查看完整描述

4 回答

已采纳
?
Caballarii

TA贡献1123条经验 获得超629个赞

image没加载完显然算不了offsetWidth啊

imgs[0].onload=function(){    
    var imgWidth = imgs[0].offsetWidth;
    console.log(imgWidth);
}


查看完整回答
1 反对 回复 2017-02-08
  • 啊啊啊啊123
    啊啊啊啊123
    js放到最后不是相当于html里的加载完毕再执行js里的吗
  • Caballarii
    Caballarii
    img标签会加载,但标签里的图片是异步加载的,js执行的时候并没有加载完,如果在chrome里,你可以明显看到图片是从上到下慢慢加载完成的,就是图片加载的过程。 所以把获取图片宽度的代码放到img的onload里才能拿到正确的高度
  • 啊啊啊啊123
    啊啊啊啊123
    那为了不出现这种情况,js文件不论放前方后不都要写onload?
点击展开后面1
?
留白未来

TA贡献2条经验 获得超1个赞

这问题你得分清两个问题,一个是DOM加载完成和一个是页面元素加载完成.

顺序执行这一点你是明白的,所以考虑到把JS放在了后面.但代码执行的顺序中,它只是按逐序去读取标签,而不会等待标签内的元素是否加载完成.用图片来举例,从上到下执行到img的时候,它读到img标签后发送一个获取图片的动作后就懒得再管了,它不会管图片是否加载完成,它会直接去读下一个标签.

因为标签读取的几乎就是一瞬间,所以很快就读到了下面的JS段并开始执行JS代码,而这个时候img中的图片还没显示完成.

所以就出现了一个问题,JS代码中需要获取的那个img,是有的,但如果JS要获取的是图片属性,图片都没加载完,去哪找属性?

所以,此时JS是得不到IMG的offsetWidth的.   而且从这段代码来讲,获取offsetWidth;只执行了一次,除非撞大运,缓存里有这张图,否则就根本获取不了.

所以才要加上window.onload(),这是告诉浏览器,这段JS不要急着执行,等你把所有页面元素(包括图片)都加载完成了之后,我再执行.这个时候获取offsetWidth就没问题了.

查看完整回答
1 反对 回复 2017-02-09
?
KevenHuang

TA贡献280条经验 获得超233个赞

都没有问题,都是打印0,我在本地测试过了。

查看完整回答
1 反对 回复 2017-02-08
  • 啊啊啊啊123
    啊啊啊啊123
    你把js放到这里面window.onload = function () {}还是0 ?
  • KevenHuang
    KevenHuang
    是的,一样都是打印0
  • 啊啊啊啊123
    啊啊啊啊123
    我就啊 怎么可能 我的就不是0 window.onload = function () { var box = document.getElementById('box'); var imgs = box.getElementsByTagName('img'); var imgWidth = imgs[0].offsetWidth; console.log(imgWidth); }
点击展开后面2
?
牛奶老哥哥

TA贡献204条经验 获得超92个赞

只能说还没完全渲染完页面吧,元素是都获取到了,比如让你在样式标签那给图片设置width,最后是可以console出来宽度的,这种渲染机制问题不用太深入了...望采纳

查看完整回答
反对 回复 2017-02-08
  • 4 回答
  • 0 关注
  • 2223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信