定位用户的位置
鉴于该特性可能侵犯用户的隐私,除非用户同意,
否则用户位置信息是不可用的。
请使用 getCurrentPosition() 方法来获得用户的位置。
下例是一个简单的地理定位实例,可返回用户位置的经度和纬度。
实例
var x=document.getElementById("demo");
function getLocation()
{
if (navigator.geolocation)
{
navigator.geolocation.getCurrentPosition(showPosition);
}
else{x.innerHTML="Geolocation is not supported by this browser.";}
}
function showPosition(position)
{
x.innerHTML="Latitude: " + position.coords.latitude +
"
Longitude: " + position.coords.longitude;
}
</script>
例子解释:
检测是否支持地理定位
如果支持,则运行 getCurrentPosition() 方法。如果不支持,
则向用户显示一段消息。
如果getCurrentPosition()运行成功,
则向参数showPosition中规定的函数返回一个coordinates对象
showPosition() 函数获得并显示经度和纬度
上面的例子是一个非常基础的地理定位脚本,不含错误处理。
若成功,则 getCurrentPosition() 方法返回对象。
始终会返回 latitude、longitude 以及 accuracy 属性。
如果可用,则会返回其他下面的属性。
属性 | 描述 |
---|---|
coords.latitude | 十进制数的纬度 |
coords.longitude | 十进制数的经度 |
coords.accuracy | 位置精度 |
coords.altitude | 海拔,海平面以上以米计 |
coords.altitudeAccuracy | 位置的海拔精度 |
coords.heading | 方向,从正北开始以度计 |
coords.speed | 速度,以米/每秒计 |
timestamp | 响应的日期/时间 |
Geolocation | 对象 - 其他有趣的方法 |
watchPosition() | 返回用户的当前位置,并继续返回用户移动时的更新位置(就像汽车上的 GPS)。 |
clearWatch() | 停止 watchPosition() 方法 |
下面的例子展示 watchPosition() 方法。
实例
<script>
var x=document.getElementById("demo");
function getLocation()
{
if (navigator.geolocation)
{
navigator.geolocation.watchPosition(showPosition);
}
else{x.innerHTML="Geolocation is not supported by this browser.";}
}
function showPosition(position)
{
x.innerHTML="Latitude: " + position.coords.latitude +
"
Longitude: " + position.coords.longitude;
}
</script>
拖放
拖放(Drag 和 Drop)是很常见的特性。
它指的是您抓取某物并拖入不同的位置。
拖放是 HTML5 标准的组成部分:任何元素都是可拖放的。
下列是关于拖放的简单例子:
实例
<!DOCTYPE HTML>
<html>
<head>
<script>
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
</script>
</head>
<body>
<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<img id="drag1" src="img_logo.gif" draggable="true" ondragstart="drag(event)" width="336" height="69">
</body>
</html>
它也许看上去有点复杂,不过让我们研究一下拖放事件的所有不同部分。
把元素设置为可拖放
首先:
为了把一个元素设置为可拖放,请把 draggable 属性设置为 true:
<img draggable="true">
拖放的内容 - ondragstart 和 setData()
然后,规定当元素被拖动时发生的事情。
在上面的例子中,ondragstart 属性调用了一个 drag(event) 函数,规定拖动什么数据。
dataTransfer.setData() 方法设置被拖动数据的数据类型和值:
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
在本例中,数据类型是 “text”,而值是这个可拖动元素的 id (“drag1”)。
ondragover 事件规定被拖动的数据能够被放置到何处。
默认地,数据/元素无法被放置到其他元素中。
为了实现拖放,我们必须阻止元素的这种默认的处理方式。
这个任务由 ondragover 事件的 event.preventDefault() 方法完成:
event.preventDefault()
进行放置 - ondrop
当放开被拖数据时,会发生 drop 事件。
在上面的例子中,ondrop 属性调用了一个函数,drop(event):
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
代码解释:
调用 preventDefault() 来阻止数据的浏览器默认处理方式
(drop 事件的默认行为是以链接形式打开)
通过 dataTransfer.getData() 方法获得被拖的数据。
该方法将返回在 setData() 方法中设置为相同类型的任何数据
被拖数据是被拖元素的 id ("drag1")
把被拖元素追加到放置元素中
HTML 本地存储:优于 cookies。
通过本地存储(Local Storage),web 应用程序能够在用户浏览器中对数据进行
本地的存储。
在 HTML5 之前,应用程序数据只能存储在 cookie 中,包括每个服务器请求。
本地存储则更安全,并且可在不影响网站性能的前提下将大量数据存储于本地。
与 cookie 不同,存储限制要大得多(至少5MB),并且信息不会被传输到服务器。
本地存储经由起源地(origin)(经由域和协议)。
所有页面,从起源地,能够存储和访问相同的数据。
HTML 本地存储提供了两个在客户端存储数据的对象:
在使用本地存储时,请检测 localStorage 和 sessionStorage 的浏览器支持:
if (typeof(Storage) !== "undefined") {
// 针对 localStorage/sessionStorage 的代码
} else {
// 抱歉!不支持 Web Storage ..
}
localStorage 对象存储的是没有截止日期的数据。
当浏览器被关闭时数据不会被删除,在下一天、周或年中,都是可用的。
实例
// 存储
localStorage.setItem("lastname", "Gates");
// 取回
document.getElementById("result").innerHTML = localStorage.getItem("lastname");
实例解释:
创建 localStorage 名称/值对,其中:name="lastname",value="Gates"
取回 "lastname" 的值,并把它插到 id="result" 的元素中
上例也可这样写:
// 存储
localStorage.lastname = "Gates";
// 取回
document.getElementById("result").innerHTML = localStorage.lastname;
删除 “lastname” localStorage 项目的语法如下:
localStorage.removeItem("lastname");
注释:名称/值对始终存储为字符串。如果需要请记得把它们转换为其他格式!
下面的例子对用户点击按钮的次数进行计数。在代码中,
值字符串被转换为数值,依次对计数进行递增:
实例
if (localStorage.clickcount) {
localStorage.clickcount = Number(localStorage.clickcount) + 1;
} else {
localStorage.clickcount = 1;
}
document.getElementById("result").innerHTML = "您已经点击这个按钮 " +
localStorage.clickcount + " 次。";
sessionStorage 对象等同 localStorage 对象,
不同之处在于只对一个 session 存储数据。
如果用户关闭具体的浏览器标签页,数据也会被删除。
下例在当前 session 中对用户点击按钮进行计数:
实例
if (sessionStorage.clickcount) {
sessionStorage.clickcount = Number(sessionStorage.clickcount) + 1;
} else {
sessionStorage.clickcount = 1;
}
document.getElementById("result").innerHTML = "在本 session 中,您已经点击这个按钮 " +
sessionStorage.clickcount + " 次。";
使用应用程序缓存,通过创建 cache manifest 文件,
可轻松创建 web 应用的离线版本。
HTML5 引入了应用程序缓存(Application Cache),
这意味着可对 web 应用进行缓存,并可在没有因特网连接时进行访问。
应用程序缓存为应用带来三个优势:
下例展示了带有 cache manifest 的 HTML 文档(供离线浏览):
实例
<!DOCTYPE HTML>
<html manifest="demo.appcache">
<body>
文档内容 ......
</body>
</html>
如需启用应用程序缓存,请在文档的 标签中包含 manifest 属性:
<!DOCTYPE HTML>
<html manifest="demo.appcache">
...
</html>
每个指定了 manifest 的页面在用户对其访问时都会被缓存。
如果未指定 manifest 属性,则页面不会被缓存
(除非在 manifest 文件中直接指定了该页面)。
manifest 文件的建议文件扩展名是:".appcache"。
注意:manifest 文件需要设置正确的 MIME-type,即 “text/cache-manifest”。必须在 web 服务器上进行配置。
manifest 文件是简单的文本文件,
它告知浏览器被缓存的内容(以及不缓存的内容)。
第一行,CACHE MANIFEST,是必需的:
CACHE MANIFEST
/theme.css
/logo.gif
/main.js
上面的 manifest 文件列出了三个资源:
一个 CSS 文件,一个 GIF 图像,以及一个 JavaScript 文件。
当 manifest 文件被加载后,浏览器会从网站的根目录下载这三个文件。
然后,无论用户何时与因特网断开连接,这些资源依然可用。
下面的 NETWORK 部分规定文件 "login.php" 永远不会被缓存,
且离线时是不可用的:
login.asp
可以使用星号来指示所有其他其他资源/文件都需要因特网连接:
FALLBACK
下面的 FALLBACK 部分规定如果无法建立因特网连接,则用 “offline.html” 替代 /html/ 目录中的所有文件:
FALLBACK:
/html/ /offline.html
注释:第一个 URI 是资源,第二个是替补。
一旦应用被缓存,它就会保持缓存直到发生下列情况:
CACHE MANIFEST
/theme.css
/logo.gif
/main.js
NETWORK:
login.asp
FALLBACK:
/html/ /offline.html
提示:以 “#” 开头的是注释行,但也可满足其他用途。应用的缓存只会在其 manifest 文件改变时被更新。如果您编辑了一幅图像,或者修改了一个 JavaScript 函数,这些改变都不会被重新缓存。更新注释行中的日期和版本号是一种使浏览器重新缓存文件的办法。
关于应用程序缓存的注意事项
请留心缓存的内容。
一旦文件被缓存,则浏览器会继续展示已缓存的版本,
即使您修改了服务器上的文件。
为了确保浏览器更新缓存,您需要更新 manifest 文件。
注释:浏览器对缓存数据的容量限制可能不太一样(某些浏览器的限制是每个站点 5MB)。