Javascript-客户端相关

一、JS程序的执行
1.当HTML解析器遇到<script>元素时,默认必须先执行脚本,然后再恢复文档的解析和渲染。这对于内联脚本没什么问题,但如果脚本源代码是一个由src属性指定的外部文件,这意味着脚本后面的文档部分在下载和执行脚本之前,都不会出现在浏览器中。(“不会出现在浏览器中”的含义:文档的文本内容已经载入,但是并未被浏览器引擎解析为DOM树,而DOM树的生成是受js代码执行的影响的,js代码会“阻塞”页面UI的渲染。)

2.脚本的执行只在默认情况下是同步和阻塞的。<script> 标签可以有 defer 和 async 属性,这可以改变脚本的执行方式。使用这两个属性使得浏览器可以在下载脚本时继续解析和渲染文档。

  • defer延迟属性:使得浏览器延迟脚本的执行,直到文档的载入和解析完成,并可以操作。
  • async异步属性:使得浏览器可以尽快地执行脚本,而不用在下载脚本时阻塞文档解析。
  • 同时有这两个属性:会遵从 async 属性并忽略 defer 属性。
    注意,延迟的脚本会按它们在文档里的出现顺序执行;异步脚本在它们载入后执行,可能会无序执行。

二、客户端JS时间线(一条理想的时间线)
1.web浏览器创建ducument对象,并开始解析web页面。document.readyState属性值为loading。

2.遇到没有async和defer属性的script标签元素时,把这些元素添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并在脚本下载和执行时解析器会暂停。

3.遇到有async属性的script标签元素时,开始下载脚本并继续解析文档。脚本会在它下载完成后尽快执行。

4.当文档完成解析,document.readyState=”interactive”。

5.遇到有defer属性的script标签元素时,会按出现顺序执行。延迟脚本能访问完整的文档树。

6.浏览器在document对象上触发DOMContentLoaded事件,标志着程序执行从同步脚本执行阶段转换到了异步事件驱动阶段。

7.文档已完全解析完成。浏览器等待其他内容(如图片)载入完成时,并且所有异步脚本完成载入和执行,document.readyState=”complete”,浏览器触发window对象上的load事件。

8.从此刻起,会调用异步事件,以异步响应用户输入事件、网络事件、计时器过期等。


三、客户端JS兼容性和交互性
1.三类问题
(1)演化
(2)未实现
(3)bug

2.解决方法
(1)选择支持的所有浏览器都普遍支持的特性
(2)使用类库
(3)使用JS框架,如jquery,定义了新的API并兼容所有浏览器


四、功能测试
1.用途:解决兼容性问题
2.示例:

if(element.addEventListener){...}//检测addEventListener是否可用
else if(element.attachEvent){...}//检测attachEvent是否可用
else{...}

五、同源策略
1.概念:是对JS代码能够操作哪些web内容的一条完整的安全限制。脚本只能读取与所属文档来源相同的窗口和文档的属性。

2.文档的来源:包含协议、主机,以及载入文档的URL端口。

  • 从不同web服务器载入的文档具有不同的来源。
  • 通过同一主机的不同端口载入的文档具有不同的来源。
  • 使用http:协议载入的文档和使用https:协议载入的文档具有不同的来源。即使它们来自同一个web服务器。

3.同源策略使用的地方
(1)窗口中对象的属性,包含另一个服务器中文档的窗口或窗体。
(2)应用于使用XMLHttpRequest生成的HTTP请求。

4.作用:防止脚本窃取似有的信息。如果没有同源策略的限制,恶意脚本可能会打开一个空的窗口,欺骗用户进入并使用这个窗口在内网上浏览文件,恶意脚本就能读取窗口内容并将其发送回自己的服务器。

5.不严格的同源策略
(1)使用document对象的domain属性。注意domain值中必须有一个点号,不能把它设置为”com”或其他顶级域名。
(2)跨域资源共享。用新的”Origin:”请求头和新的Access-Control-Allow-Origin响应头来扩展HTTP。它允许服务器用头信息显式地列出源,或使用通配符*来匹配所有的源,并允许由任何地址请求文件。
(3)跨文档消息。调用window对象的postMessage()方法,可以异步传递消息事件到窗口的文档里。


六、跨站脚本XSS
1.概念:表示一类安全问题,即攻击者向目标web站点注入HTML标签或者脚本。

2.为什么会受到XSS攻击:如果web页面动态地产生文档内容,并且这些文档内容是基于用户提交的数据的,而并没有通过从中移除任何嵌入的HTML标签来“消毒”的话,那么这个web页面很容易遭到跨站脚本攻击。

3.防止XSS攻击:

  • 移除<script> 标签两边的尖括号。通过把字符串中所有的尖括号替换成它们对应的HTML实体,也就是说将字符串中任意HTML标签进行转义和过滤删除处理。
  • HTML5的内容安全策略更进一步,它为<iframe> 元素定义了一个sandbox属性,允许显示不可信的内容,并自动禁用脚本。

——阅读《Javascript权威指南》第十三章

猜你喜欢

转载自blog.csdn.net/sinat_38783046/article/details/82493129
今日推荐