名站网址导航名站网址导航小编为爱好网页hTML5的朋友提供关于网页hTML5的相关知识。
- 本篇文章的具体介绍如下
一个浏览器至少存在三个线程:js引擎线程(处理js)、GUI渲染线程(渲染页面)、浏览器事件触发线程(控制交互)。
JavaScript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来然后加以处理,浏览器无论再什么时候都只有一个JS线程在运行JS程序。
GUI 渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。但需要注意 GUI渲染线程与JS引擎是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的具体代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。
了解了浏览器的内核处理方式就不难理解浏览器为什么会进入假死状态了,当一段JS脚本长时间占用着处理机就会挂起浏览器的GUI更新,而后面的事件响应 也被排在队列中得不到处理,从而造成了浏览器被锁定进入假死状态。另外JS脚本中进行了DOM操作,一旦JS相关调用结束就会马上进行一次GUI渲染,然后才 开始执行下一个任务,所依JS中大量的DOM操作也会导致事件响应缓慢甚至真正卡死浏览器,如在IE6下一次插入大量的网页hTML。而如果真的弹出了“脚本 运行时间过长“的提示框则说明您的JS脚本肯定有死循环或者进行过深的递归操作了。
现在如果遇到了这种情况,咱们可以做的不仅仅是优化 具体代码,html5的webWorkers提供了js的后台处理线程的API,它允许将复杂耗时的单纯js逻辑处理放在浏览器后台线程中进行处理,让js线 程不阻塞UI线程的渲染。这个线程不能和页面进行交互,如获取网页元素、alert等。多个线程间也是可以通过相同的实用具体的方法进行数据传递。
直接看具体代码:
例子:用户输入一个数字,进行加法运算( =)
以前的做法:
- <!DOCTYPE 网页hTML>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>webworkers--calculate</title></head>
- <body>
- <input id="num" name="num" type="text"/>
- <button onclick = "calculate()">计算</button><br />
- <div id="result" style="color:red;"></div>
- <div id="time" style="color:red;"></div>
- <script type="text/javascript" src="calculate.js"></script>
- <script type="text/javascript"> function calculate(){
- data1 = new Date().getTime();
- var num = document.getElementById("num").value;
- var val = parseInt(num,10);
- var result =0;
- for(var i =0; i<num;i ){
- result = i;
- }
- data2 = new Date().getTime();
- document.getElementById("result").inner网页hTML ="计算结果:" result;
- document.getElementById("time").inner网页hTML ="普通 耗时:" (data2 - data1) "ms";
- }
- </script>
- </body>
- </html>
使用webWorkers以后:
calculate.html
- <!DOCTYPE 网页hTML>
- <html lang="en"><head>
- <meta charset="UTF-8">
- <title>webworkers--calculate</title>
- </head>
- <body>
- <input id="num" name="num" type="text"/>
- <button onclick = "calculate()">计算</button><br />
- <div id="result" style="color:red;"></div>
- <div id="time" style="color:red;"></div>
- <script type="text/javascript" src="calculate.js"></script>
- <script type="text/javascript">
- var worker = new Worker("calculate.js");
- var data1 =0;
- var data2 =0;
- worker.onmessage = function(event){
- var data = event.data;
- data2 = new Date().getTime();
- document.getElementById("result").inner网页hTML ="计算结果:" data;
- document.getElementById("time").inner网页hTML ="workers 耗时:" (data2 - data1) "ms";
- };
- function calculate(){
- data1 = new Date().getTime();
- var num = document.getElementById("num").value;
- var val = parseInt(num,10);
- worker.postMessage(val);
- }
- </script>
- </body>
- </html>
calculate.js
- onmessage = function(event){
- var num = event.data;
- var result = 0;
- for(var i = 0; i<num;i ){
- result = i;
- }
- postMessage(result);
- };
webWorker需要将具体代码放入web服务器中, 如果使用的是localhost请用高版本的chrome浏览器打开,firefox浏览器在处理localhost的时候会出现“Could not get domain!”的错误,关于这个可以参考:https://bugzilla.mozilla.org/show_bug.cgi?id=682450 对比上面的两种实现方式,当计算值达到100亿的时候,普通做法耗时已经很长,且一般会卡死了。
webWorkers在Chrome15下的具体效果
更正:getTime()返回的应该是毫秒(ms),而不是秒(s)。
如下图所示:
普通实用具体的方法在Chrome15下的具体效果
可见webWorkers在未来的web应用中还是非常有价值的。
关于网页hTML5的相关知识就说到这里希望可以帮助朋友们。,网页hTML5教程中对id属性的定义与规定