HTML5 API 中篇

14-2 Geolocation (扩展内容)

HTML5 Geolocation API是H TML5新增的地理位置应用程序接口,它提供了一个可以准确感知浏 览器用户当前位置的方法。如果浏览器支持,且设备具有定位功能,就能够直接使用这组API 获取当前位置的信息。该Geolocation API可以应用于移动设备中的地理定位。允许用户在Web 用程序中共享位置信息,使其能够享受位置感知的服务。

HTML5的Geolocation API的使用方法也非常简单。请求一个位置信息,如果用户同意,浏览器 就会返回相应的位置信息,该位置信息是通过支持H TML5地理定位功能的底层设备来提供的,例 如笔记本电脑或者手机。位置信息由纬度,经度坐标和一些其他元数据组成。有了这些位置信息 我们就可以构建位置感知类的应用程序。

14-2-1为什么要学习Geolocation

设想这样一个场景:有一个Web应用程序,它可以向用户提供附近不远处某商店运动鞋的打折优 惠信息。使用H TML5 Geolocation API,就可以请求其他用户共享他们的位置,如果他们同意, 应用程序就可以提供相关信息,告诉用户去附近哪家商店可以挑选到打折的鞋子。

HTML5 Geolocatio n技术另一个应用场景就是构建计算行走(跑步)路程的应用程序。我们可以在 开始跑步时通过手机浏览器启动应用程序的记录功能。在用户移动过程中,应用程序会记录已跑 过的距离,还可以把跑步过程对应的坐标显示在地图上,甚至可以显示出海拔信息。如果用户正 在和其他选手一起参加跑步比赛,那么应用程序还可以显示其对手的位置。

诸如此类的应用,现在已经很多很多了。

14-2-2位置信息的表示方式

位置信息主要由一对纬度和经度坐标组成,例如:

Latitude:39.17222,Longitude:-120.13778

在这里,纬度(距离赤道以北或以南的数值表示)是39.17222,经度(距离英国格林威治以东或以西 的数值表示)是120.13778,经纬度坐标的表示可以使用以下两种方式

・十进制格式,如120.13778

・DMS角度格式,如39度20分

HTML5 Geolocation API返回坐标的格式为十进制格式。除了经纬度的坐标,HTML5

Geolocatio n还提供位置坐标的准确度,并提供其他一些元数据,具体情况取决于浏览器所在的
硬件设备。这些元数据包括海拔,海拔准确度,行驶方向和速度等。如果这些元数据不存在则返 null。

14-2-3 使用 Geolocation API

geolocation navigator 对象的一^ 属性。这个属性有一^ 方法 getCurrentPosition(), 该方法会返回一个positio n对象给指定的回调函数。

传给youAreHereO函数的position对象有一^ coords属性,该属性又有latitude和longitude属性, 二者一起给出了设备的坐标。这些坐标随后可以与其他应用程序或者Web服务(比如地图服务)结 合使用,以获取用户的准确位置。示例如下:

<body>

<script>

let youAreHere = function(position){

console.log('纬度为:${position.coords.latitude}'); console.log('经度为:${position.coords.longitude}');

}

navigator.geolocation.getCurrentPosition(youAreHere); </script>

</body>

positio n对象还有几个其他的属性,可以用来查找设备的位置和移动信息:

  • position.speed属性:返回设备的地面速度(米/)
  • position.altitude属性:返回设备的海拔估算值
  • position.heading属性:返回设备正在移动的方向
  • position.timestamp属性:返回位置信息被记录的时间

position对象还有计算测量精度的属性。例如position.accurac y属性以米为单位返回经度和纬度 的精确度。返回值越低,测量结果的精确度就越高,position.altitudeAccuracy属性就是这种情 况,将返回以米为单位的海拔属性的精度。

此外,geolocation对象还有一^? watchPosition()方法,该方法在每次设备的位置更新时, 会调用一个回调函数。这个方法返回一个ID,这个ID可以用于引用被观察的位置:

let id = navigator.geolocation.watchPosition(youAreHere);

clea rWatch()方法可以用于阻止调用回调,使用作为观察用的id来作为参数

navigator.geolocation.clearWatch(id);
HTML5 Geolocation API为网站或者应用程序添加基于位置的信息提供了有用的接口,但是大部 分接口都需要谷歌地图来提供服务支持。由于国内特殊的环境,所以更多时候是利用百度地图提 供的API来获取位置信息。所以Geolocation作为一个了解即可。

 
   

14-3 Web Worker (扩展)

在运行大型,复杂的J avaScript脚本的时候经常会出现浏览器假死的现象,那么能不能让这些代 码在后台运行,或者让JavaScript函数在多个进程中同时运行呢? HTML5的Web Worker正是为 了解决这个问题而出现的。HTML5的Web Worker可以让Web应用程序具备后台的处理能力。它 支持多线程处理功能,因此可以充分利用多核CPU带来的优势,将耗时长的任务分配给H TML5 的Web Worker运行,从而避免了有时页面反应迟缓,甚至假死的现象。

14-3-1 Web Worker 介绍

  1. Web Worker 概述

在Web应用程序中,Web Worker是一项后台处理技术。在此之前,JavaScript创建的Web应用程 序中,因为所有的处理都是在单线程内执行的,所以如果脚本所需运行时间太长,程序界面就会 长时间处于停止状态,甚至当等待时间超出一定的限度,浏览器就会提示脚本运行时间过长需要 中断正在执行的处理。

为了解决这个问题,HTML5新增加了一个Web Worker API。使用这个API,用户可以很容易的创 建在后台运行的线程,这个线程被称之为Worker。如果将可能耗费较长时间的处理交给后台来执 行,则对用户在前台页面中执行的操作没有影响。

Web Worker的优点如下:

•加载一个JavaScript文件,进行大量的复杂计算,而不挂起主进程,并通

postMessage onMessage 进行通行。

•可以在Worker中通过importScripts(url)方法来加载JavaScript脚本文件。

  • 可以使用 setTimeout() , clearTimeout() , setInterval()禾口 clearInterval()。

•可以使用XMLHttpRequest进行异步请求。

•可以访问navigator的部分属性。

•可以使用J avaScript核心对象。

除了上述的优点,Web Worker本身也是具有一定局限性的,具体如下:

•不能跨域加载JavaScript

  • Worker内代码不能访问DOM

・各个浏览器对Worker的实现还没有完全支持,不是每个浏览器都支持所有的新特性。

・使用Web Worker加载数据没有JSONP和Ajax加载数据高效。

  1. 浏览器支持情况
    各个浏览器对Web Worker的支持情况不太一样,代表列出了目前主流浏览器对Web Worke啲支 持情况:

浏览器

描述

IE

不支持

Firefox

3.5及以上的版本支持

Opera

10.6及以上的版本支持

Chrome

3.0及以上的版本支持

Safari

4.0及以上的版本支持

在调用Web Worker API之前,应该确认一下当前的浏览器是否支持Web Worker。如果不支持, 可以提供一些备用信息,提醒用户使用最新的浏览器。例如,可以使用下面的代码来检测浏览器 的支持情况:

<body>

<script>

if(window.Worker){ console.log("您的浏览器支持 Web Wo rke r");

}

</script>

</body>

如果所使用的浏览器支持Web Worker,则Worker将会作为window对象的一个属性存在,所以我 们只需要检测window.Worker是否存在即可判断支持情况。

  1. Web Worker 成员

在开始使用Web Worker之前,我们先来看一下使用Worker时会遇到的属性和方法,如下:

・self: self关键值用来表示本线程范围内的作用域。

  • postMessageO :向创建线程的源窗口发送信息。
  • onMessage:获取接收消息的事件句柄。
    • importScripts(urls):导入其他JavaScript脚本文件。参数为该脚本文件的URL地址,可以导 入多个脚本文件。导入的脚本文件必须与使用该线程文件的页面在同一个域中,并在同一个 端口中。

importScripts("worker1.js","worker2.js","worker3.js");

  • navigator 对象:有 appName , platfo rm , use rAgent appVe rsion 属性,它们可以用 来标识浏览器。
  • sessionStorage/localStorage :在线程中可以使用 Web Storage o
  • XMLHttpRequest :在线程中可以嵌套线程。
  • setTimeoutO/setlnterval。:在线程中可以实现定时处理。
  • close:结束本线程。
  • eval。,isNaNO, ecape。等:可以使用JavaScript的核心函数。
  • object:可以创建和使用本地对象。
  • WebSockets :可以使用Web Sockets API向服务器发送和接收消息。

14-3-2 Web Worker 的使用

Web Worker的使用方法非常简单,只需要创建一个Web Worker对象,并传入希望执行的 JavaScript文件即可。之后在页面中设置一个事件监听器,用来监听由Web Worker对象发来的消 息以及错误信息。如果想要在页面与Web Worker之间建立通信,数据需要通

过postMessage()函数来进行传递。

首先我们开始第一步,创建Web Worker。步骤十分简单,只要在Worker类的构造器中,将需要 在后台线程中执行的脚本文件的URL地址作为参数传入,就可以创建Worker对象,如下:

let worker = new Worker("./worker.js");

注意:在后台线程中是不能访问页面或者窗口对象的,此时如果在后台线程的脚本文件中使 window

或者document对象,则会引发错误。

这里传入的JavaScript的URL可以是相对或者绝对路径,只要是相同的协议,主机和端口即可。 如果想获取Worker进程的返回值,可以通过onmessage属性来绑定一个事件处理程序。如下:

<body>

<script>

let worker = new Worker("./worker.js");

worker.onmessage = function(){

console.log("the message is back!");

}

</script>

</body>

这里第一行代码用来创建和运行Worker进程,第2行设置Worker的onmessage属性用来绑定事 件处理程序,当Worker的postMessage()方法被调用时,这个被绑定的程序就会被触发。

使用Worker对象的postMessage()方法可以给后台线程发送消息。发送的消息可以是文本数 据,也可以是任何JavaScript对象,需要通过JSON对象的stri ngify方法将其转换成文本数 据。

worker.postMessage(message);

通过获取Worker对象的onmessage事件句柄以及Worker对象的postMessage()方法就可以实现 线程内部消息的接收和发送。

Web Worker不能自行终止,但是能够被启用它们的页面所终止。调用ter minate()函数可以终 止后台进程。被终止的Web Workers将不再响应任何消息或者执行任何其他运算。终止之后, Worker不能被重新启动,但是可以使用同样的URL创建一个新的Worker。

最后,我们来书写一个完整的例子来演示Worker的工作机制,如下:

首先,是我们的1.html页面代码

<body>

vp>计数:voutput id="result">v/output>v/p>

vbutton onclick="sta rtWo rke r()"> 开始工作 v/button> vbutton onclick="stopWo rke r()"> 停止工作 v/button> vp>vstrong>注意:v/strong>IE9及其以下版本浏览器不支持Web Workers.v/p> vscript> let w;

//开始Wo rke r的代码

function startWorker() {

//判断浏览器是否支持

if (typeof (Worker) !== "undefined") {

if (typeof (w) == "undefined") { w = new Worker("1.js");

} w.onmessage = function (event) { document.getElementById("result").innerHTML = event.data

;

};

} else { document.getElementById(" result").inne rHTML ="你的浏览器不支持 ";

f

}

}

//停止Wo rke r的代码

function stopWorker() {

w.terminate();

w = undefined;

</script>

</body>

接下来我们运行在后台的Worke啲代码,如下:

let i = 0;

function timedCount() {

i = i + 1;

//每次得到的结果都通过postMessage方法返回给前台 postMessage(i);

setTimeout("timedCount()", 500);

}

timedCount();

效果:

计数:8

-开始工作r c停生工作二

注意:Internet Explorer 9及更早IE版本浏览器不支持Web Workers

上面的代码,当用户点击"开始工作"时,会创建一个Web Worker在后台进行计数。每次计的数都 会通过postMessage方法返回给前台。当用户点击"停止工作"时,则会terminate。方法来终止 Web Worker 的运行。

14-4多媒体

在H TML5之前,要在浏览器中显示音频和视频是非常困难的,经常我们需要使用类似于Flash —类的插件才能够实现。不过,从H TML5开始引入了 vaudio>和video这两个标签可以实现在 网页中快速插入音频和视频,同时我们还可以使用J avaScript来控制多媒体的播放。

14-4-1引入多媒体

引入多媒体的方式如下:

<body>

<audio src="./test.mp3" controls>

您的浏览器不支持audi o标签

</audio>

</body>

上面的代码我们就在页面里面引入了一个音频标签。对于支持该标签的浏览器,会正常显示出音 频的控制面板(注意必须要书写controls属性),而对于不支持该标签的浏览器,则会显示出中间的 那句"您的浏览器不支持audi o标签"

・src:多媒体文件的路径

  • controls:显示控制面板

为了做到浏览器兼容,我们可以将多媒体文件的路径写在vsou rce>标签里面。然后可以对应对 应多个多媒体文件。浏览器会自动选择第一个可以识别的格式,示例如下:

<body>

<audio controls>

<source src="./test.mp3">

<source src="./test.ogg">

您的浏览器不支持audi o标签

</audio>

</body>

如果要插入视频,那么只需要将上面的<audio>标签换成<video>标签即可。

14-4-2相关属性和方法

  • muted属性用来设置当前媒体是否开静音,如果设置为true代表开启静音,false为不开启

<body>

<audio controls muted=true>

<source src="./test.mp3">

<source src="./test.ogg"> 您的浏览器不支持audi o标签

</audio>

</body>

  • autobuffer属性设置为true后将实现自动缓冲

<body>

<audio controls autobuffer=true>

<source src="./test.mp3">

<source src="./test.ogg"> 您的浏览器不支持audi o标签

</audio>

</body>

  • autopla y属性设置为自动播放

<body>

<audio controls autoplay=true>

<source src="./test.mp3">

<source src="./test.ogg"> 您的浏览器不支持audi o标签

</audio>

</body>

・loop属性设置后将会重复播放

<body>

<audio controls loop=true>

<source src="./test.mp3">

<source src="./test.ogg"> 您的浏览器不支持audi o标签

</audio>

</body>

・poster属性设置视频的封面,没有播放时可以显示一张图片(注意此属性只有video标签拥 有,audio无此属性)

<body>

<video controls poster="./1.jpg">

<source src="./test.mp4">

<source src="./test.ogv">

<source src="./test.swf"> 您的浏览器不支持V ide o标签

</video>

</body>

  • width和height属性用于设置视频的宽度和高度

我们可以通过DO M的方法之一来引用到页面里面的vaudio>或者<video>标签,如下:

const Video = document.getElementsByTagName("Video")[0];

引用成功之后我们就可以在此元素上面对多媒体进行控制,例如上面我们所介绍的属性都是可以 通过在引用后的元素上面来进行设置的,如下:

video.muted = tr ue;//设置为静音 video.loop = tr ue; //设置循环播放

还可以在引用了元素的基础上进行一些其他的设置,如下:

  • volune属性用于设置音量

Video.Volume = 0.9;

  • currentTime属性用于获取多媒体当前所播放的具体时间

video.cu rr entTime += 10; //视频播放快进 10

・playbackRate属性该属性用于设置快进或者快退速度的数字值。值为1时表示以正常速度播

video.playbackRate = 8;// 8 被速度快进

・duration属性用于查看该多媒体的持续时间,也就是时长为多久

video.duration

音频和视频也有很多可以触发的事件,包括:

・play事件,用于开始播放多媒体

  • pause事件,用于暂停多媒体
  • volumechange事件,用于调整多媒体的音量
  • loadedmetadata事件,在多媒体的所有元数据被加载时会触发该事件

这些事件可以让我们响应用户和视频的所有的交互。例如,如下的事件监听器可以检测用户是否 暂停了视频的播放:

video.addEventLister('pause',()=>{

console.log('视频已经暂停');

},false);

当然,除了上面所介绍的属性和方法以外,HTML5中还提供了其他的API来让开发者对多媒体文 件进行控制。完整的文档可以参见如下地址:

https://www.w3.org/2010/05/video/mediaevents.html

 
   

14-5 Canvas画图(次重点)

14-5-1认识canvas元素

在HTML5中引入了 canvas , canvas元素是网页上一^矩形的单元,可以用JavaScript在上面 绘画。控制其每一个像素。canvas拥有多种绘制路径、矩形、圆形、字符以及添加图像的方 法。

canvas主要应用于如下的领域:

•游戏:canvas在基于Web的图像显示方面比Flash更加立体、更加精巧,canvas游戏在流畅度 和跨平台方面更牛。

•可视化数据(数据图表话),比如:百度的echart d3.js three.js

・banner广告:Flash曾经辉煌的时代,智能手机还未曾出现。现在以及未来的智能机时代, HTML5技术能够在banner广告上发挥巨大作用,用canvas实现动态的广告效果再合适不 过。

•未来

模拟器:无论从视觉效果还是核心功能方面来说,模拟器产品可以完全由JavaScript来实现。 远程计算机控制:canvas可以让开发者更好实现基于Web的数据传输,构建一个完美的可视 化控制界面。

图形编辑器:Photoshop图形编辑器将能够100%基于Web实现。

1.添加canvas元素

要添加canvas的方法很简单,就是书写一个canvas标签。注意这是一个双标签,默认什么都不 会显示,如果想要看到画布,可以添加一个border

<body>

<canvas width="400" height="300" style="border:1px solid"> </canvas>

</body>

  1. 如何绘制图像

canvas本身不能进行绘制图形,绘制图形的工作都是交给JavaScript来完成的。绘制图形的步骤 大致分为如下4个步骤:

  1. 添加canvas元素
  2. 在JS中获取canvas元素
  3. 获取到上下文,创建context对象

画布上下文是一个包含用于在画布上画画的所有方法的对象

  1. 使用JS来进行绘制

示例如下:

<body>

<!— 添加canvas兀素 —>

<canvas width="400" height="300" style="border:1px solid"></canvas> <script>

//在JS中获取canvas元素

let canvas = document.getElementsByTagName('canvas')[0];

//获取到上下文,创建context对象

let context = canvas.getContext("2d");

//使用JS来进行绘制

context.beginPath();//开始路径

context.moveTo(10,10);

context.lineTo(100,100);

context.closePath();//闭合路径 context.stroke();

</script>

</body>

效果:

这里需要提一个关于Canvas设置宽高的注意事项。在Canvas中默认有一个宽高,值为 300*150。如果我们在vstyle>里面再设置Canvas的宽高的话,此时会有一个拉伸效果,如

:

<head>

<meta charset="UTF-8"> <title>Document</title>

<style>

canvas{

400px;

height: 300px;

border: 1px solid;

}

</style>

</head>

<body>

<!— 添加canvas兀素 —>

<canvas></canvas>

<script>

//在JS中获取canvas元素

let canvas = document.getElementsByTagName('canvas')[0];

//获取到上下文,创建context对象

let context = canvas.getContext("2d");

//使用JS来进行绘制

context.beginPath();//开始路径 context.moveTo(10, 10);

context.lineTo(100, 100); context.closePath();//闭合路径 context.stroke();

</script>

</body>

效果:canvas的宽高同样是400*300,但是由于我们是在<style>里面设置的宽高,此时会对 canvas进行一^拉伸,如下图

  1. 关于坐标

canvas里面坐标的计算和平时我们在数学里面接触的x轴,y轴的计算方式一样,如下图:

Vertical ex
y-axis

(-3,1)

Hcxizontal or

x*axis

Ongin (0, 0)

4.查看浏览器是否支持canvas

并不是所有的浏览器都支持canvas,我们可以通过下面这个最简单的方式来检测浏览器是否支持 canvas。对于不支持canvas的浏览器,会将里面的话直接输出出来,如下:

<canvas width="400" height="300" style="border:1px solid">

您的浏览器不支持canvas元素,请升级您的浏览器

</canvas>

还有一种方法,就是利用JS里面检测getContext属性是否存在,如果存在就是支持,不存在就是 不支持。示例如下:

<body>

<!— 添加canvas兀素 —>

<canvas width="400" height="300" style="border:1px solid"> 您的浏览器不支持canvas元素,请升级您的浏览器

</canvas>

<script>

//在JS中获取canvas元素

let canvas = document.getElementsByTagName('canvas')[0]; if(canvas.getContext){

console.log("支持");

}else{

console.log("不支持");

}

</script>

</body>

14-5-2绘制简单图形

  1. 绘制直线

绘制直线用到的方法有3个:moveTo()、lineTo()、stoke()

moveTo():相当于将画笔移动到某一个坐标

lineTo():勾勒一条线,但是这只是草稿

stoke():根据勾勒的线描边

具体示例:画出两条对角线

<body>

<!— 添加canvas兀素 —>

<canvas width="400" height="300" style="border:1px solid"> 您的浏览器不支持canvas元素,请升级您的浏览器

</canvas>

<script>

//在JS中获取canvas元素

let canvas = document.getElementsByTagName('canvas')[0];

//获取到上下文,创建context对象

let context = canvas.getContext("2d"); context.moveTo(0,0);

context.lineTo(400,300);

context.moveTo(400,0);

context.lineTo(0,300); context.stroke();

</script>

</body>

效果:

  1. 绘制矩形

在绘制矩形之前,我们先来看一下在canvas中如何设置颜色。通过storkeStyle属性可以指定勾勒 图形时的颜色,而fillStyle则是用于指定填充图形时的颜色。颜色的取值和CSS里面一样。示例如 下:我们在绘制上面的对角线之前改变一下颜色:

<body>

<!— 添加canvas兀素 —>

<canvas width="400" height="300" style="border:1px solid"> 您的浏览器不支持canvas元素,请升级您的浏览器

</canvas>

<script>

//在JS中获取canvas元素

let canvas = document.getElementsByTagName('canvas')[0];

//获取到上下文,创建context对象

let context = canvas.getContext("2d"); context.moveTo(0,0);

context.lineTo(400,300);

context.moveTo(400,0);

context.lineTo(0,300);

context.st rokeStyle = "#ff0000";//设置勾勒颜色 context.stroke();

</script>

</body>

效果:

接下来我们来绘制矩形。在canvas里面绘制矩形的方法有两

个:fillRect()和strokeRect()。这两个方法所接受的参数值一样分别为x坐标,y坐标,矩 形长和矩形宽,区别在于前面的方法是填充矩形,后面的是空心矩形

<body>

<!— 添加canvas兀素 —>

<canvas width="400" height="300" style="border:1px solid"> 您的浏览器不支持canvas元素,请升级您的浏览器

</canvas>

<script>

//在JS中获取canvas元素

let canvas = document.getElementsByTagName('canvas')[0]; //获取到上下文,创建context对象

let context = canvas.getContext("2d"); context.fillStyle = "#ff0000";//设置填充颜色 context.fillRect(100,100,100,50);//绘制填充矩形 context.st rokeRect(200,200,100,50);//绘制空心矩形

</script>

</body>

效果:

原文地址:https://www.cnblogs.com/jrzqdlgdx/p/11239728.html