20160108小问题

1.children和childNodes的区别

childNodes是标准的,它返回的包括所有子节点,包括元素节点,属性节点,文本节点等,childNodes(i)在IE6/7/8/SF/Op/Chrome下支持,在IE9/FF下不支持。如果想取第一个HTML子节点,这里不能用firstChild,要用nodeType判断筛选下。

children是非标准的,它返回的是子元素集合,同样在FF下不支持children(i)取元素,想取第一个HTML子节点,可以用children[0]。

2.script标签放在body和head的区别

一般放在head里是当页面加载前就运行JS代码,被调用时执行,而且可以保证脚本在任何调用之前已经被加载。

一般放在body里是当页面加载后才运行JS代码,加载时被执行,它通常被用来生成页面的内容。

把引入的js文件放在head里,加载head里代码时就同时载入了js代码,这样在body区调用时就不需要载入代码了,速度就提高了,这种区别在小程序看不明显,在复杂的大程序里就显著了。

无论JS代码是内嵌还是在外链的文件中,页面的下载和渲染都必须停下来等待脚本执行完成。

引入外部文件的好处:易维护,易扩展,方便管理和重复利用。

浏览器在执行JS代码时,不能同时做其他的事情,即script标签每次出现都会让页面等待脚本的解析和执行,JS代码执行完后才能继续渲染页面,这便是JS的阻塞的特点。

3.按需装载

按需装载,脚本程序一般是下载后执行,如果脚本库非常庞大,一次性下载起来非常费时,传统解决方法是,按功能模块把脚本写在不同的文件中,页面上手动加入script标签装载指定内容,但有个缺点,类库的使用者需要知道每个脚本程序之间的关系,顺序等,但不是所有类库使用者都能把这些记清楚,容易出错。于是很多框架开始支持导入指令,想使用什么一个导入函数就完了,不必用一堆堆script文件,也不用关注他们之间的依赖关系。

按需装载可分三种模式:

即时同步按需装载(阻塞,JSI,JSVM,dojo)。最简单的按需装载实现,通过XMLHttpRequest同步装载脚本文件实现。但问题是浏览器使用这种方式同步获取资源时会导致浏览器阻塞:停止响应用户事件,停止页面重画操作。所以,这种虽然编程最为简单,但用户体验最差。

异步按需装载(无阻塞,JSI2.0+)。异步导入,用户体验好,但因为异步的特征处理起来比较麻烦。

延迟同步按需装载(无阻塞,JSI2.0+)。JSI通过动态预装载功能实现的一种同步获取资源的方法,虽然也是同步,但没有阻塞,可以算是兼顾易用性和用户体验方案。缺点是有一定延迟,当前脚本标签中不可用。

原文地址:https://www.cnblogs.com/sunshinegirl-7/p/5113867.html