HTML5通信和多线程详细教程及实例

HTML通信

跨文档消息传输

HTML5提供了在网页文档之间相互接收和发送信息的功能,使用这个功能,只要获取到网页所在窗口对象的实例,不仅同源(域+端口)的网页可以相互通信,甚至可以实现跨域通信。涉及到两个window的API,window的message事件

 代码如下 复制代码
window.addEventListener("message",function(ev){...},false)
//或
window.onmessage=function(ev){....}

其中ev是MessageEvent对象,它的其中几个属性:data:是消息内容,timeStamp:时间戳,origin:来源URL地址,source:来源窗口对象。
另一个就是window对象的postMessage方法了:

 代码如下 复制代码

otherWindow.postMessage(data,targetOrigin)

其中data是消息文本,targetOrigin是对象窗口的URL地址(如"http://10.9.146.113:8026/"),可以在URL使用通配符“*”。otherWindow是窗口对象,可以是windows.open返回的对象,或通过window.frames数组指定的序号(index)或名字获取的单个frame所属的窗口对象。

示例:主页面是“http://10.9.146.113:8098/mytest/index.html”,和嵌入它的frame页面“http://10.9.146.113:8026/index.html”进行通讯,前者HTML代码:

 代码如下 复制代码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>测试本地缓存</title>
</head>
 
<body>
<table>
<tr><td valign="top">
http://10.9.146.113:8098/mytest/index.html<br>
<textarea name="msg" cols="50" rows="5" id="msg">爱我中华,爱我中华</textarea><br>
<input type="button" name="button" id="button" onClick="sendMsg()" value="发送">
<div id="msginfo">接收到的信息:</div>
</td><td valign="top">
<iframe style="width:300px" height="300px" src="http://10.9.146.113:8026/index.html"></iframe>
</td>
</table>
</body>
</html>
<script type="text/javascript">
function sendMsg(){
var msg=document.getElementById("msg").value;
var iframe=window.frames[0];
iframe.postMessage(msg,"http://10.9.146.113:8026/");   
}
//也可以用监听的方式
window.onmessage=function(ev){
document.getElementById("msginfo").innerHTML+="<br>"+ev.data;
};
</script>

后者

 代码如下 复制代码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>通信API</title>
</head>
 
<body>
http://10.9.146.113:8026/index.html</p>
<div id="msginfo">接收到的信息:</div>
</body>
</html>
<script type="text/javascript">
window.addEventListener("message",function(ev){
document.getElementById("msginfo").innerHTML+="<br>"+ev.data;
ev.source.postMessage("已经收到",ev.origin);
});
</script>

 

效果

Web Socket通讯

请参考我的另一篇博客:http://www.oseye.net/user/kevin/blog/78,只是不用自己封装服务器了,现在很多web server都支持websocket了,如IIS7、Tomcat、Apache、Resin、Nginx等等。

多线程

创建线程

在HTML5中增加了一个Web Workers API,通过它可以实现Web平台的多线程,你可以将耗时过长的处理交给后台线程(HTML5中称为worker)运行,从而解决HTML5之前因为某个处理耗时过长而跳出一个提示,导致用户不得不结束或关闭浏览器的尴尬局面。

创建后台线程非常简单,只需要在Worker类构造器中奖需要在后台运行线程执行的脚本件的URL地址作为参数,然后创建Worker对象就可以了,如

 代码如下 复制代码
var worker=new Worker('worker.js');

后台线程是不能访问页面或窗口对象的,因此需要前台和后台互传数据,这有点类似上面的文档消息传输,接收通过onmessage事件,发送通过postMessage方法。

示例:后台脚本是worker.js,代码如下:

 代码如下 复制代码

onmessage=function(ev){
var num=ev.data;
var res=1;
for(var i=0;i<10;i++){
res*=num;
}
postMessage(res);   
}

前台是index.html页面,代码如下:

 代码如下 复制代码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>测试多线程</title>
</head>
 
<body>
<input type="text" id="num" value="0" size="5"> 的10次方=<span id="res">0</span>
<br>
<input type="button" name="button" id="button" value="计算" onClick="getRes()">
</body>
</html>
<script type="text/javascript">
function getRes(){
var worker=new Worker('worker.js');
var num=document.getElementById("num").value;
//发送数据的到后台
worker.postMessage(num);
//时间触发接受数据
worker.onmessage=function(ev){
document.getElementById("res").innerHTML=ev.data;
}
}
</script>

效果

线程中可使用的变量、函数与类

self:表示本线程范围内的作用域;
postMessage(message),向创建线程的源窗口发送消息;
onmessage,获取接收消息的事件处理函数;
importScripts(urls),导入其它javascript脚本文件,参数为该文件的url地址,可以导入多个脚本文件,导入的文件必须与使用该线程的文件在同一个域、同一个端口中,如

 代码如下 复制代码
importScripts('script1.js','js/script2.js')

navigator对象,与window.navigator对象类似;
sessionStorage/localStorage,可以在线程中使用Web Storage;
XMLHttpRequest,可以在线程中处理Ajax;
Web Workers,可以在线程中嵌套线程;
setTimeout()/setInterval(),可以在线程中实现实时处理;
close(),结束本线程;
eval()、isNaN()、escape()可以使用js的核心函数;
object,可以穿件和使用本地对象;
WebSockets,可以使用WebSocket API向服务器发送和接收消息。

终止 Web Worker

当我们创建 web worker 对象后,它会继续监听消息(即使在外部脚本完成之后)直到其被终止为止。如需终止 web worker,并释放浏览器/计算机资源,请使用 terminate() 方法

 代码如下 复制代码

w.terminate();

 

时间: 2024-10-15 01:04:19

HTML5通信和多线程详细教程及实例的相关文章

windows7配置Nginx+php+mysql的详细教程_php实例

最近在学习php,想把自己的学习经历记录下来,并写一些经验,仅供参考交流.此文适合那些刚刚接触php,想要学习并想要自己搭建Nginx+php+mysql环境的同学. 当然,你也可以选择集成好的安装包,比如 wamp等,不过我推荐大家还是自己手动搭建一下环境比较好,这样能够更好的了解php及其运行流程.下面直接进入正题. 步骤: 1.准备安装包等 (1)nginx-1.10.1.zip,下载链接为http://nginx.org/en/download.html .我个人选择了稳定版. (2)p

PHP安装threads多线程扩展基础教程_php实例

一.下载pthreads扩展 下载地址:http://windows.php.net/downloads/pecl/releases/pthreads 二.判断PHP是ts还是nts版 通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版. 三.根据PHP ts\nts版选择对应pthreads的版本 本人php版本是5.4.17的所以下载php_pthreads-0.1.0-5.4-t

PHP在网页中动态生成PDF文件详细教程_php实例

本文详细介绍使用 PHP 动态构建 PDF 文件的整个过程.使用免费 PDF 库 (FPDF) 或 PDFLib-Lite 等开源工具进行实验,并使用 PHP 代码控制 PDF 内容格式. 有时您需要准确控制要打印的页面的呈现方式.在这种情况下,HTML 就不再是最佳选择了.PDF 文件使您能够完全控制页面的呈现方式,以及文本.图形和图像在页面上的呈现方式.遗憾的是,用来构建 PDF 文件的 API 不属于 PHP 工具包的标准部件.现在您需要提供一点帮助. 当您在网络上搜索,寻找对 PHP 的

Nginx实现Rewrite规则详细教程及实例讲解

语法 Nginx的Rewrite相比Apache的要好理解很多,主要使用指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令. rewrite  代码如下 复制代码 语法: rewrite regex replacement [flag]; 默认值: - 上下文: server, location, if 如果指定的正则表达式能匹配URI,此URI将被replacement参数定义的字符串改写.rewrite指令按其在配置文件中出现的顺序执行.flag

PHP远程采集图片详细教程_php实例

当我们需要采集网络上的某个网页内容时,如果目标网站上的图片做了防盗链的话,我们直接采集过来的图片在自己网站上是不可用的.那么我们使用程序将目标网站上的图片下载到我们网站服务器上,然后就可调用图片了. 本文将使用PHP实现采集远程图片功能.基本流程: 1.获取目标网站图片地址. 2.读取图片内容. 3.创建要保存图片的路径并命名图片名称. 4.写入图片内容. 5.完成. 我们通过写几个函数来实现这一过程. 函数make_dir()建立目录.判断要保存的图片文件目录是否存在,如果不存在则创建目录,并

mysql UNION 语法详细说明与实例教程

mysql教程 union 语法详细说明与实例教程 本文介绍如何在mysql中使用union来组合成一个单一的结果 union语法 select field1, field2 ...union [all | distinct]select field1, field2 ... 下面看一款查询三个表普通方法 select brand from car; select brand from computer; select brand from clothing; 我们利用union连接起来查询 s

[读后感]spring Mvc 教程框架实例以及系统演示下载

[读后感]spring Mvc 教程框架实例以及系统演示下载 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 不要好意思,昨晚写的,睡着忘发了,后附是篇好文,赶紧w分享一下. 感脚着,俺好像做了

自动化运维工具ansible的使用详细教程_服务器其它

一.ansible简介 1.ansible ansible是新出现的自动化运维工具,基于Python研发.糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行命令等功能.仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端.ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件.主要包括: (1).连接插件connection plugins:负责和被监控端实现通信: (2).host inventory:指定操

PHP教程.应用实例11

教程|应用实例 PHP应用提速面面观PHP最大的优点之一显然在于它的快速度.一般情况下PHP总是具有足够的速度支持Web内容动态生成,许多时候你甚至无法找出比它更快的方法.然而,当你不得不面对庞大的访问量.高负荷的应用.有限的带宽以及其他各种带来性能瓶颈的因素时,你可能会问问自己是否可以做点什么让网站运行得更好.或许只要加上一个很不起眼的免费模块,你的PHP应用性能以及Web服务器响应速度就会有显著的改善.本文讨论的就是如何进一步提高php应用的性能,给用户以更美妙的浏览感受.本文分三个方面(代