HTML5中新增Javascript特性

存储

  • localStorage
存储:
window.localStorage.setItem('key', 'value');
取值:
window.localStorage.getItem('key');
删除:
window.localStorage.removeItem('key');
清除:
window.localStorage.clear();
长度:
window.localStorage.length 
  • sessionStorage
存储:
window.sessionStorage.setItem('key', 'value');
取值:
window.sessionStorage.getItem('key');
删除:
window.sessionStorage.removeItem('key');
清除:
window.sessionStorage.clear();
长度:
window.sessionStorage.length
sessionStorate、localStorage、cookies三者区别:
1. sessionStorate和localStorage存储空间更大, 5M或者更大;cookie存储一般不能超过4kb。
2. sessionStorate和localStorage不会自动把数据发给服务器,仅为本地存储;cookie在每次http请求都会传送到服务端。
3. sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localStorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。
4. sessionStorate和localStorage支持事件通知机制,可以将数据更新的通知发送给监听者。

ApplicationCache

优点:
1. 离线浏览 - 用户可在离线时浏览您的完整网站
2. 速度 - 缓存资源为本地资源,因此加载速度较快。
3. 服务器负载更少 - 浏览器只会从发生了更改的服务器下载资源
<!DOCTYPE html>
<html manifest="cache.manifest" type="text/cache-manifest">
<head>
    <meta charset="UTF-8">
    <title>manifest</title>
</head>
<body>
    ![](/images/default_pic.jpg)
</body>
</html>
浏览器会打印如下信息:
Creating Application Cache with manifest http://localhost:5555/index/cache.manifest
cache:1 Application Cache Checking event
cache:1 Application Cache Downloading event
cache:1 Application Cache Progress event (0 of 1) http://localhost:5555/images/default_pic.jpg
cache:1 Application Cache Progress event (1 of 1) 
cache:1 Application Cache Cached event
manifest属性可指向绝对网址或相对路径,但绝对网址必须与相应的网络应用同源。清单文件可使用任何文件扩展名,但必须以正确的MIME类型提供。
cache.manifest文件配置如下:

CACHE MANIFEST
# 2010-06-18:v3

# Explicitly cached entries
/index.html
/images/default_pic.jpg

# offline.html will be displayed if the user is offline
FALLBACK:
/ /offline.html

# All other resources (e.g. sites) require the user to be online. 
NETWORK:
*

# Additional resources to cache
CACHE:
/images/logo1.png
/images/logo2.png
/images/logo3.png
CACHE:
    这是条目的默认部分。系统会在首次下载此标头下列出的文件(或紧跟在 CACHE MANIFEST 后的文件)后显式缓存这些文件。
NETWORK:
    此部分下列出的文件是需要连接到服务器的白名单资源。无论用户是否处于离线状态,对这些资源的所有请求都会绕过缓存。可使用通配符。
FALLBACK:
    此部分是可选的,用于指定无法访问资源时的后备网页。其中第一个 URI 代表资源,第二个代表后备网页。两个 URI 必须相关,并且必须与清单文件同源。可使用通配符。
更新缓存

var appCache = window.applicationCache;

appCache.update(); // Attempt to update the user's cache.

...

if (appCache.status == window.applicationCache.UPDATEREADY) {
  appCache.swapCache();  // The fetch was successful, swap in the new cache.
}

update()获取新的应用缓存
swapCache()将原缓存换成新缓存
此流程只是让浏览器检查是否有新的清单、下载指定的更新内容以及重新填充应用缓存。
上述过程需要对网页进行两次重新加载才能向用户提供新的内容,其中第一次是获得新的应用缓存,第二次是刷新网页内容。

为了避免重新加载两次的麻烦,可以设置监听器
// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {
  window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
      // Browser downloaded a new app cache.
      // Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();
      if (confirm('A new version of this site is available. Load it?')) {
        window.location.reload();
      }
    } else {
      // Manifest didn't changed. Nothing new to server.
    }
  }, false);
}, false);

Drag and Drop

<div id="drag1" class="drag"></div>
![](logo.png)
var drag1 = document.getElementById('drag1');
var drag2 = document.getElementById('drag2');

drag1.addEventListener('dragover', function (event) {
    event.preventDefault();
}, false);

drag1.addEventListener('drop', function (event) {
    event.preventDefault();

    var id = event.dataTransfer.getData('id');
    drag1.appendChild(document.getElementById(id));
}, false)

drag2.addEventListener('dragstart', function(event) {
    event.dataTransfer.setData('id', event.target.id);
}, false);
属性 描述
ondrag 元素被拖动时运行的脚本
ondragstart 在拖动操作开端运行的脚本
ondragover 当元素在有效拖放目标上正在被拖动时运行的脚本
ondragenter 当元素元素已被拖动到有效拖放区域时运行的脚本
ondragleave 当元素离开有效拖放目标时运行的脚本
ondragend 在拖动操作末端运行的脚本
ondrop 当被拖元素正在被拖放时运行的脚本
event.dataTrasfer.setData(),设置一个key-value。
dragover事件,默认地,数据/元素无法被放置到其他元素中。为了实现拖放,我们必须阻止元素的这种默认的处理方式。
drop事件的默认行为是以链接形式打开。

Web Workers

JavaScript语言采用的是单线程模型,Web Worker的目的,就是为JavaScript创造多线程环境,允许主线程将一些任务分配给子线程。在主线程运行的同时,子线程在后台运行,两者互不干扰。等到子线程完成计算任务,再把结果返回给主线程。

主线程 main.js

var worker = new Worker('worker.js');

worker.postMessage('I am main.js');
worker.addEventListener('message', function (event) {
  console.log('main receive:' + event.data);
}, false);
子线程 worker.js

self.addEventListener('message', function (event) {
  console.log('worker receive:' + event.data);

  self.postMessage('I am worker.js');
}, false);
关闭主线程
worker.terminate();
关闭子线程
self.close();

Web Sockets

客户端
var connection = new WebSocket('ws://localhost:5555', 'echo-protocol');

connection.onopen = function (event) {
  console.log('open')
  connection.send('This is a client')
}

connection.onmessage = function (event) {
  console.log('message:' + event.data)
}

connection.onclose = function (event) {
  console.log('close')
}
服务端(node.js)
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app);
var WebSocketServer = require('websocket').server;

var wsServer = new WebSocketServer({
    httpServer: server
});

var connection;

wsServer.on('request', function(req){
  connection = req.accept('echo-protocol', req.origin);

  connection.on('message', function(message) {
    var msgString = message.utf8Data;

    console.log(msgString)
    connection.sendUTF(msgString);
  });
});

注:socket.io是目前最流行的WebSocket实现

History

  • history.pushState()

pushState方法不会触发页面刷新,只是导致history对象发生变化,地址栏会有反应。

history.pushState()接收3个参数
state:一个与指定网址相关的状态对象,popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null。
title:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null。
url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。

var stateObj = {'page': '1'};
history.pushState(stateObj, 'title', '?debug=1');
  • history.replaceState()

replaceState方法参数和pushState方法参数相同,但是会修改浏览历史中当前纪录。

history.replaceState(null, null, '?page=2');
  • history.state
history.pushState({page: 1}, null, '?page=1');

history.state
{page: 1}
  • popstate事件

每当同一个文档的浏览历史(即history对象)出现变化时,就会触发popstate事件。仅仅调用pushState方法或replaceState方法 ,并不会触发该事件,只有用户点击浏览器倒退按钮和前进按钮,或者使用JavaScript调用back、forward、go方法时才会触发。另外,该事件只针对同一个文档,如果浏览历史的切换,导致加载不同的文档,该事件也不会触发。

window.onpopstate = function (event) {
  console.log('location: ' + document.location);
  console.log('state: ' + JSON.stringify(event.state));
};

// 或者

window.addEventListener('popstate', function(event) {
  console.log('location: ' + document.location);
  console.log('state: ' + JSON.stringify(event.state));
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容