HTML5系列四(WebWorker、地理定位)
WebWorker简单应用
先从一个简单例子说起,计算数值加法
<script>
var worker = new Worker('sumCalculate.js');
worker.onmessage = function (event) {
alert('The sum is ' + event.data);
}
function calculate() {
var num = parseInt(document.getElementById('num').value, 10);
worker.postMessage(num);
}
</script>
输入数值:<input type="text" id="num" />
<button onclick="calculate()">计算</button>
sumCalculate.js代码如下所示:
onmessage = function (event) {
var num = event.data;
var result = 0;
for (var i = 0; i <= num; i++) {
result += i;
}
postMessage(result);
}
这段代码很简单,事实上就是主线程将需要求和的值传给计算加法的js,然后js计算好之后再传回给主界面
再看一个稍微复杂一点的应用
<script>
var intArray = new Array(100);
var intStr = "";
for (var i = 0; i < 100; i++) {
intArray[i] = parseInt(Math.random() * 100);
if (i != 0) {
intStr += ";"
}
intStr += intArray[i];
}
var worker = new Worker('inter.js');
worker.postMessage(intStr);
worker.onmessage = function (event) {
if (event.data != '') {
var j, k, tr, td, intArray = event.data.split(";");
var table = document.getElementById('table');
for (var i = 0; i < intArray.length; i++) {
j = parseInt(i / 10, 10);
k = i % 10;
if (k == 0) {
tr = document.createElement('tr');
tr.id = 'tr' + j;
table.appendChild(tr);
} else {
tr = document.getElementById('tr' + j);
}
td = document.createElement('td');
tr.appendChild(td);
td.innerHTML = intArray[j * 10 + k];
td.style.backgroundColor = 'blue';
td.style.color = 'white';
td.width = '30';
}
}
}
</script>
<table id="table"></table>
上面例子中用到的inter.js代码如下所示:
onmessage = function (event) {
var data = event.data;
var returnStr = "";
var intArray = data.split(';');
returnStr += intArray[0];
for (var i = 1; i < intArray.length; i++) {
if (parseInt(intArray[i],10) % 3 == 0) {
returnStr += ";"
returnStr += intArray[i];
}
}
postMessage(returnStr);
}
产生的界面效果图如下所示:

事实上,上面的这个生成随机数的例子还可以使用嵌套线程的方式来实现,具体如下所示:
主界面代码如下所示:
<script>
var worker = new Worker('w1.js');
worker.postMessage('');
worker.onmessage = function (event) {
if (event.data != '') {
var j, k, tr, td, intArray = event.data.split(";");
var table = document.getElementById('table');
for (var i = 0; i < intArray.length; i++) {
j = parseInt(i / 10, 10);
k = i % 10;
if (k == 0) {
tr = document.createElement('tr');
tr.id = 'tr' + j;
table.appendChild(tr);
} else {
tr = document.getElementById('tr' + j);
}
td = document.createElement('td');
tr.appendChild(td);
td.innerHTML = intArray[j * 10 + k];
td.style.backgroundColor = 'blue';
td.style.color = 'white';
td.width = '30';
}
}
}
</script>
<table id="table"></table>
w1.js如下所示:
onmessage = function (event) {
var intArray = new Array(100);
var intStr = "";
for (var i = 0; i < 100; i++) {
intArray[i] = parseInt(Math.random() * 100);
}
var w = new Worker('w2.js');
w.postMessage(JSON.stringify(intArray));
w.onmessage=function (event) {
postMessage(event.data);
}
}
w2.js如下所示:
onmessage = function (event) {
var intArray = JSON.parse(event.data);
var returnStr = "";
returnStr += intArray[0];
for (var i = 1; i < intArray.length; i++) {
if (parseInt(intArray[i], 10) % 3 == 0) {
returnStr += ";"
returnStr += intArray[i];
}
}
postMessage(returnStr);
close();
}
在opera浏览器下运行正常,但在chrome下就报如下所示错误(可能chrome不允许次线程里面再创建线程吧)

要详细了解WebWorker,请看我的另外一篇博文 Web Worker
地理定位
地理定位其实很简单,就是利用navigator对象的一个属性geolocation
navigator.geolocation.getCurrentPosition(show_map);
//其中show_map是回调函数。加上判断浏览器是否支持:
function get_location() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(show_map);
} else {
alert("Your browser does not support geoLocation");
}
}
function show_map(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
showObject(position, 0);//把数据显示出来的函数
}
如果是在电脑上使用地理定位的话,浏览器会弹出如下所示提示信息

回调函数的参数position提供了一系列的参数供开发者使用

地理信息这东西,经常会出错,各种因素,例如信号不好等等。因此getCurrentPosition其实还有第二个参数,就是处理错误的,如下:
navigator.geolocation.getCurrentPosition(show_map,handle_error);
其中handle_error也是一个回调函数,提供一个err对象,包含code和message两个属性,使用方法较简单:
function handle_error(err){
switch(err.code){
case 1 :
alert("permission denied"); break;
case 2:
alert("the network is down or the position satellites can't be contacted"); break;
case 3:
alert("time out"); break;
default:
alert("unknown error"); break;
}
}
事实上,getCurrentPosition其实还有第三个参数,是一个对象,可以设置超时时间、缓存时间等,具体如下图所示:

特别注意哦:enableHighAccuracy表示是否允许使用高精度,但这个参数在很多设备上设置了都没用,设备综合考虑电量、地理情况等,很多时候都是默认的由设备自身来调整。
maximumAge是指缓存的时间,例如maximumAge:120000(1分钟是60000)。那么如果10:00整的时候获取过一次地理信息,10:01的时候,再次调用navigator.geolocation.getCurrentPosition,返回的依然是10:00时候的数据(因为设置的缓存有效时间为2分钟),超过这个时间后缓存的地理位置信息被废弃,尝试重新获取地理位置信息,如果该值被指定为0,则无条件重新获取新的地理位置信息。
int watchCurrentPosition(onSuccess,onError,options)//持续监视当前地理位置的信息
void clearWatch(watchId);//停止获取当前用户的地理位置信息
HTML5系列四(WebWorker、地理定位)的更多相关文章
- HTML5系列四(特征检测、Modernizr.js的相关介绍)
Modernizr:一个HTML5特征检测库 Modernizr帮助我们检测浏览器是否实现了某个特征,如果实现了那么开发人员就可以充分利用这个特征做一些工作 Modernizr是自动运行的,无须调用诸 ...
- HTML5学习总结-03 地理定位
一 地理定位 HTML5 Geolocation(地理定位)用于定位用户的位置. 1 地理定位 地理位置 经度 : 南北极的连接线 纬度 : 东西连接的线 位置信息从何而来: IP地址 G ...
- 从零开始学 Web 之 HTML5(三)网络监听,全屏,文件读取,地理定位接口,应用程序缓存
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 基于浏览器的HTML5地理定位
基于浏览器的HTML5地理定位 地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML ...
- 小强的HTML5移动开发之路(18)——HTML5地理定位
来自:http://blog.csdn.net/dawanganban/article/details/18192091 在前面的<小强的HTML5移动开发之路(2)--HTML5的新特性> ...
- HTML5 Geolocation API地理定位整理(一)
HTML5 Geolocation API 用于获得用户的地理位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. 浏览器支持 Internet Explorer 9+, ...
- 用HTML5、地理定位API和Web服务来开发移动应用
HTML 5 是一项让人振奋的技术,这有着充分的理由.这将会是一次技术突破,因为它可以将桌面应用程序功能带入浏览器中.除了传统浏览器外,对于移动浏览器,其潜力甚至更大.不仅如此,最流行的移动浏览器甚至 ...
- HTML5地理定位,百度地图API,知识点熟悉
推断浏览器的兼容问题: IE9+支持地理定位,FF Chrome新版支持地理定位 if (navigator.geolocation) { alert('支持地理定位'); } e ...
- HTML5 总结-地理定位-6
HTML5 地理定位 定位用户的位置 HTML5 Geolocation API 用于获得用户的地理位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. 浏览器支持 Int ...
随机推荐
- Android手机截屏
刚开始打算做一个简单的截屏程序时,以为很轻松就能搞定. 在Activity上放一个按钮,点击完成截屏操作,并将数据以图片形式保存在手机中. 动手之前,自然是看书和网上各种查资料.结果发现了解的知识越多 ...
- LiveSDK初始化/登录时失败的解决办法
环境描述 Windows 8.1+VS 2013 Update3+Live SDK 5.6 Metro风格的程序,集成LIVE认证 问题描述 如下图,提示Null Reference的异常. 解决办法 ...
- SQL中的内连接与外连接
关于关系代数连接运算的介绍请查看下面链接 http://www.cnblogs.com/xidongyu/articles/5980407.html 连接运算格式 链接运算由两部分构成:连接类型和连接 ...
- 什么是smarty?
什么是smarty? Smarty是一个使用PHP写出来的模板PHP模板引擎,由PHP.net官方提供 ,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程 序员同美工分离,使用的程序员改 ...
- python环境搭建-Pycharm 调整字体大小
- javascript生成GUID的代码
<script type="text/javascript"> var Guid = function(){}; Guid.prototype = { S4:funct ...
- Sublime Text 3前端开发常用优秀插件介绍
. 首页 博客园 联系我 前言:关于Sublime Text 3. Package Control插件管理. Package Control使用方法/安装Emmet插件. Emmet插件. JsFor ...
- 让Windows新建UTF-8编码的文本文件
一直以来都是使用[右键->新建->文本文件]的方法来新建一个代码文件,但是存在一个问题新建的文件是大小为0字节的.对于大小为0字节的文件文件,文本编辑器一般都使用MBCS编码,而MBCS编 ...
- poj1523 求割点 tarjan
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7678 Accepted: 3489 Description C ...
- lucene-查询query->PrefixQuery使用前缀搜索
PrefixQuery就是使用前缀来进行查找的.通常情况下,首先定义一个词条Term.该词条包含要查找的字段名以及关键字的前缀,然后通过该词条构造一个PrefixQuery对象,就可以进行前缀查找了. ...