【javascript】谈谈HTML5: Web-Worker、canvas、indexedDB、拖拽事件
为什么学习HTML5?
H5中的知识点分布
if(window.Worker){
// 使用Worker
}
Web Worker
“一套API, 两个对象”
var worker = new Worker("./worker.js");
生成了“两个对象”(你可能会问:为什么是两个不是一个呢?请往下看)
├─worker.js
├─main.js
└─index.html
<html>
<head>
<meta charset="utf-8" />
<button id="work-button">传递数据</button>
</head>
<body>
<script type="text/javascript" src="./main.js"></script>
</body>
</html>
var button = document.querySelector("#work-button");
if(window.Worker){
var worker = new Worker("./worker.js");
button.onclick = function () {
worker.postMessage("你好,我是当前脚本");
}
}
this.onmessage = function (e) {
console.log('work接收到的数据为:', e.data);
}

postMessage中参数传递给onmessage中event.data
当前任务脚本和worker脚本完整的通信流程
├─worker.js
├─main.js
└─index.html
同上
main.js:
var button = document.querySelector("#work-button");
if(window.Worker){
var worker = new Worker("./worker.js");
button.onclick = function () {
worker.postMessage("你好,我是当前脚本");
worker.onmessage = function (e) {
console.log('当前脚本接收到的数据:',e.data)
}
}
}
this.onmessage = function (e) {
console.log('work接收到的数据为:', e.data);
this.postMessage("你好,我是worker发来的数据")
}

canvas
<canvas id="canvas"></canvas>
这样取得上下文对象:
let canvas = document.getElementById("canvas"); // 首先取得canvas元素对象
let ctx = canvas.getContext("2d"); //通过getContext()取得关键的上下文对象,2d表示画布是“平面”的
绘制基本形状
fillRect(x, y, width, height) // 绘制一个填充的矩形
strokeRect(x, y, width, height) // 绘制一个矩形的边框

<canvas id="canvas" width="200px" height="100px">
你的浏览器不支持canvas
</canvas>
let canvas = document.getElementById("canvas");
if(canvas.getContext){
let ctx = canvas.getContext("2d");
ctx.fillRect(,,,); // 绘制矩形
}


给画笔添加颜色和样式
let ctx = canvas.getContext("2d");
ctx.fillStyle = "#0081F0"; // 给上下文对象这支画笔添加填充颜色
ctx.fillRect(,,,);

绘制文本
let canvas = document.getElementById("canvas");
if(canvas.getContext){
let ctx = canvas.getContext("2d");
ctx.font = "26px serif"; // 设置文字大小和样式
ctx.fillText("外婆的",,); // “实心”的文本
ctx.strokeText("彭湖湾",,); // “空心”的文本
}

直接绘制已有图片
drawImage(image, x, y) // 其中 image 是 image 或者 canvas 对象
let img = new Image();
img.onload = function () {
// 运行这个函数的时候可以确保img已经被加载好了
};
img.src = "./beach.jpg" // 指定src后图片开始加载

let canvas = document.getElementById("canvas");
let img = new Image();
img.onload = function () {
if(canvas.getContext){
let ctx = canvas.getContext("2d");
ctx.drawImage(img, , )
}
};
img.src = "./beach.jpg"

图片裁剪功能
let canvas = document.getElementById("canvas");
let img = new Image();
img.onload = function () {
if(canvas.getContext){
let ctx = canvas.getContext("2d");
ctx.beginPath(); // 开始绘制路径
ctx.arc(,,,,Math.PI*,true); // 绘制一个起点(100,100),半径为100的圆
ctx.clip(); // 裁剪
ctx.drawImage(img, , ); // 画图
}
};
img.src = "./beach.jpg"

canvas的保存和导出
canvas.toDataURL() // 默认返回的是png图片
canvas.toDataURL('image/jpeg') // 返回jpeg图片
canvas.toDataURL('image/jpeg', quality) // 创建一个JPG图片。你可以有选择地提供从0到1的品质量,1表示最好品质
let canvas = document.getElementById("canvas");
let img = new Image();
img.onload = function () {
if(canvas.getContext){
let ctx = canvas.getContext("2d");
ctx.beginPath(); // 开始绘制路径
ctx.arc(,,,,Math.PI*,true); // 绘制一个起点为(100,100),半径为100的圆
ctx.clip(); // 裁剪
ctx.drawImage(img, , ); // 画图
let src = canvas.toDataURL('image/png')
console.log(src);
}
};
img.src = "./beach.jpg"


indexedDB — — H5的“浏览器数据库”
使用open方法创建/打开数据库
indexedDB.open([ 数据库名称 ], [数据库版本])
var request = indexedDB.open("XXX", );
request.onsuccess = function () {
// request.result === 你通过open创建的数据库
}
<script type="text/javascript">
if(!window.indexedDB) {
alert("你的浏览器还不能支持indexedDB哦!")
}
var request = indexedDB.open("phwDataBase", );
var db
request.onsuccess = function () {
// 将成功创建的数据库对象赋给db
db = request.result;
}
request.onerror = function () {
var errorDescribe = request.errorCode;
// 打印错误
console.log(errorDescribe);
}
request.onupgradeneeded = function (e){
// 取得更新后的数据库对象, 并赋给db
db = request.result;
// 创建名为people数据存储空间, 第二个参数里的keyPath相当于“主键”
var objectStore = db.createObjectStore("people", { keyPath: "id" });
// 创建索引, 加快查询速度
objectStore.createIndex("name", "name", {unique: false});
}
</script>

indexedDB的具体操作
<button id="add-button">增加数据</button>
<button id="delete-button">删除数据</button>
<button id="get-button">获取数据</button>
<button id="show-all-button">遍历全部数据</button>
<button id="index-button">通过索引获取数据</button>

var transaction = db.transaction(["people"],"readwrite");
var objectStore = transaction.objectStore("people");
写操作
function addData () {
// 确保这个时候异步的open方法已经完成,并取得数据库对象
if(!db){
return;
}
// 我们要写入的数据
var data = [
{id: '',name:'a', age: },
{id: '',name:'b', age: },
{id: '',name:'c', age: }
];
// 创建事务,并使其可读可写
var transaction = db.transaction(["people"],"readwrite");
transaction.oncomplete = function () {
alert("添加事务已经完成")
}
transaction.onerror = function () {
alert("出现错误")
}
// 通过事务对象取得people存储空间
var objectStore = transaction.objectStore("people");
for(let d of data) {
// 调用add方法添加数据
objectStore.add(d);
}
}
var addButton = document.getElementById("add-button");
addButton.onclick = addData


删操作
function deleteData () {
if(!db){
return;
}
var transaction = db.transaction(["people"],"readwrite");
var objectStore = transaction.objectStore("people");
objectStore.delete("");
transaction.oncomplete = function () {
alert("删除事务已经完成")
}
}
var deleteButton = document.getElementById("delete-button");
deleteButton.onclick = deleteData;


查操作
function getData () {
if(!db){
return;
}
var transaction = db.transaction(["people"], "readwrite");
var objectStore = transaction.objectStore("people");
var request = objectStore.get("");
request.onsuccess = function () {
alert(JSON.stringify(request.result));
}
}
var getButton = document.getElementById("get-button");
getButton.onclick = getData;

遍历全部数据
function showAllData () {
if(!db){
return;
}
var transaction = db.transaction(["people"], "readwrite");
var objectStore = transaction.objectStore("people");
console.log("遍历开始")
objectStore.openCursor().onsuccess = function (event) {
var cursor = event.target.result;
if(cursor) {
console.log(cursor.key, cursor.value);
cursor.continue();
}
}
}
var showAllButton = document.getElementById("show-all-button");
showAllButton.onclick = showAllData;

通过索引查找
function getByIndex () {
if(!db){
return;
}
var transaction = db.transaction(["people"], "readwrite");
var objectStore = transaction.objectStore("people");
var index = objectStore.index("name");
var request = index.get("c");
request.onsuccess = function (event) {
alert(JSON.stringify(request.result));
}
}
var indexButton = document.getElementById("index-button");
indexButton.onclick = getByIndex;
拖放事件
<div>
<img
id = "myImg"
src="./clock.jpg"
draggable="true"
ondragstart="dragstart(event)"
/>
</div>
<div
id="targetDiv"
ondragover="dragover(event)"
ondrop="drop(event)">
</div>
<script type="text/javascript">
function dragstart (event) {
event.dataTransfer.setData("text/plain", event.target.id)
}
function drop (event) {
// 阻止默认行为——禁止在浏览器中打开新的链接
event.preventDefault();
var imgId = event.dataTransfer.getData("text/plain");
var targetDiv = document.getElementById("targetDiv");
targetDiv.appendChild(document.getElementById(imgId));
}
function dragover (event) {
// 组织默认行为——禁止放置
event.preventDefault();
}
</script>
【javascript】谈谈HTML5: Web-Worker、canvas、indexedDB、拖拽事件的更多相关文章
- JavaScript多线程之HTML5 Web Worker
在博主的前些文章Promise的前世今生和妙用技巧和JavaScript单线程和浏览器事件循环简述中都曾提到了HTML5 Web Worker这一个概念.在JavaScript单线程和浏览器事件循环简 ...
- 深入HTML5 Web Worker应用实践:多线程编程
HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越多崭新的特性和功能.它不但强化了 Web 系统或网页的表现性能 ...
- 【javascript】html5中使用canvas编写头像上传截取功能
[javascript]html5中使用canvas编写头像上传截取功能 本人对canvas很是喜欢,于是想仿照新浪微博头像上传功能(前端使用canvas) 本程序目前在谷歌浏览器和火狐浏览器测试可用 ...
- 深入 HTML5 Web Worker 应用实践:多线程编程
深入 HTML5 Web Worker 应用实践:多线程编程 HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越 ...
- HTML5 02. 多媒体控件、拖拽事件、历史记录、web存储、应用程序缓存、地理定位、网络状态
多媒体 video:是行内块(text-align: center; 对行内块适用) <figure></figure>: 多媒体标签 : <figcaption> ...
- html5 web worker学习笔记(记一)
(吐槽:浏览器js终于进入多线程时代!) 以前利用setTimeout.setInterval等方式的多线程,是伪多线程,本质上是一种在单线程中进行队列执行的方式.自从html5 web worker ...
- html5拖拽事件 xhr2 实现文件上传 含进度条
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- canvas 图片拖拽旋转之二——canvas状态保存(save和restore)
引言 在上一篇日志“canvas 图片拖拽旋转之一”中,对坐标转换有了比较深入的了解,但是仅仅利用坐标转换实现的拖拽旋转,会改变canvas坐标系的状态,从而影响画布上其他元素的绘制.因此,这个时候需 ...
- (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
利用JavaScript(JS)实现一个九宫格拖拽功能 Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...
- HTML5深入学习之鼠标跟随,拖拽事件
知识点(鼠标跟随): mousedown: 当用户用鼠标点击在某一元素上就会触发该事件 mouseover: 当鼠标指针在某一元素上移动就会触发改事件 下面这个例子的效果就是鼠标点击元素后,元素跟着 ...
随机推荐
- 双硬盘,win10安装到固态盘
1.PE下格式化固态盘的系统盘 2.打开DG分区工具,查看固态盘的系统盘是否为激活状态,红色为激活,如果不是,激活一下 3.用windows安装器,或者hdd安装win10到固态盘 4.bios中启动 ...
- java 编程英语单词,语句
记录一下java 编程工作学习中常用的英语汇总 in other words: 换句话说 dangle :悬挂 separated:分开的 distinct:明显的,独特的 actual :实际的 i ...
- ES查询-term VS match (转)
原文地址:https://blog.csdn.net/sxf_123456/article/details/78845437 elasticsearch 中term与match区别 term是精确查询 ...
- ES查询-match VS match_phrase
我们以一个查询的示例开始,我们在student这个type中存储了一些学生的基本信息,我们分别使用match和match_phrase进行查询. 首先,使用match进行检索,关键字是“He is”: ...
- Oracle SQL Developer 调试存储过程步骤(Oracle)
1.首先你编译通过你的存储过程,编译的时候一定要选“编译以进行调试”. 2.在想要调试的行上设置好断点. 3.点击“调试”按钮,然后输入存储过程入参,点“确定”开始调试. 4.断点进入后,上方会出现一 ...
- 一键脚本清理DEBIAN系统无用组件 减少系统资源
虽然如今我们选择服务器资源都比较多,以前我们看到很多128MB内存.甚至32MB内存的建站网站,感觉特别羡慕.其实这些也不是难事,相比之下,DEBIAN系统比CENTOS系统占用资源少,然后我们需要进 ...
- Unity Button事件的简洁处理
看到很多人依然还是通过最原始的方法给button绑定事件并处理,这种通过Find往子集一个个的查找,获取到后再绑定事件这种操作很费事,有些人则是对查找对象写了个方法自动往子集遍历更方便获取对象,但还是 ...
- n2n网络环境搭建
目的: 实现家中nas,在任何环境ssh访问 方案:n2n v1 (原因稳定&兼容macbook) 开源地址: https://svn.ntop.org/svn/ntop/trunk/n2 ...
- dom4j移除节点不成功
在使用dom4j的时候想移除xml节点,经常使用remove来移除节点,通过整个文档或者根节点删除某一个子节点,但如果子节点不是儿子节点,在dom4j中就无法删除.在dom4j中移除节点必须使用父节点 ...
- 【linux】工作时使用的命令
几个基本操作: 1.查看当前文件夹下的内容: list 2.查看当前所在的文件夹:pwd 3.切换当前工作文件夹:cd 4.文件不存在时,新建文件:touch 5.创建目录:mkdir 6.删除指定的 ...