HTML5新特性2(拖放事件/历史管理/延时加载JS)
2017-12-06 00:51
399 查看
1.拖放事件
draggable
:
设置为true,元素就可以拖拽了
拖拽元素事件 : 事件对象为被拖拽元素
dragstart
, 拖拽前触发
drag
, 拖拽前和拖拽结束之间连续触发,与move的区别
dragend
, 拖拽结束触发
目标元素事件 : 事件对象为目标元素
dragenter
, 进入目标元素触发,相当于mouseover
dragover
,进入目标、离开目标之间,连续触发
dragleave
, 离开目标元素触发,相当于mouseout
drop
, 在目标元素上释放鼠标触发(必须在dragover上阻止默认事件ev.preventDefault()
)
代码展示如下
<img src="hahaha.jpg"> <div id="div1" draggable="true"></div> <script> var oImg = document.querySelector("img"); var oDiv = document.getElementById("div1"); oDiv.ondragstart = function (ev) { ev = ev || event; ev.dataTransfer.setData('name','a'); console.log("拖放开始了"); }; oDiv.ondrag = function () { console.log("拖放进行中"); }; oDiv.ondragend = function () { console.log("拖放结束"); }; oImg.ondragenter = function () { console.log("进入目标元素"); }; oImg.ondragover = function () { event.preventDefault(); console.log("在目标中移动"); }; oImg.ondragleave = function () { console.log("拖放结束"); }; oImg.ondrop = function (ev) { ev = ev || event; var str = ev.dataTransfer.getData('name'); console.log(str); } </script>
2.拖放事件的执行顺序
事件的执行顺序 :drop不触发的时候按照·dragstart > drag > dragenter > dragover > dragleave > dragend事件的执行顺序
drop触发的时候(dragover的时候阻止默认事件
ev.preventDefault();)
dragstart > drag dragenter > dragover > drop > dragend不能释放的光标和能释放的光标不一样
解决火狐下的问题
必须设置dataTransfer对象的setData方法才可以拖拽除图片外的其他标签
oDiv.ondragstart = function (ev) { ev = ev || event; ev.dataTransfer.setData('name','a'); //设置数据 key和value(必须是字符串) console.log("拖放开始了"); }; oImg.ondrop = function (ev) { ev = ev || event; var str = ev.dataTransfer.getData('name'); //获取对应的value值 console.log(str); }
3.dataTransfer对象(event对象)
1.effectAllowed
(dragstart)
2.effectAllowed
: 设置光标样式(none, copy, copyLink, copyMove, link, linkMove, move, all 和 uninitialized)
3.setDragImage
(改变拖拽clone的元素,dragstart ),三个参数:指定的元素,坐标X,坐标Y
4.files
1.获取外部拖拽的文件,返回一个filesList列表2.filesList下有个type属性,返回文件的类型
<div draggable="true"></div> <img src="block.png" width="68" height="28"> <script> var oImg = document.querySelector("img"); var oDiv = document.querySelector("div"); oDiv.ondragstart = function (ev) { ev = ev || event; ev.dataTransfer.setData('name','a'); ev.dataTransfer.setDragImage(oImg,34,14); }; </script>
5.####
FileReader(读取文件信息)
readAsDataURL
:参数为要读取的文件对象,将文件读取为DataUrl
onload
:当读取文件成功完成的时候触发此事件
this. result , 来获取读取的文件数据,如果是图片,将返回base64格式的图片数据
4.历史管理(通过跳转页面)
Window.onhashchange:改变hash值(#x)来管理
用途:可以做成不改变网址,仅改变hash值进行历史管理(window.location.hash)
history:需要在服务器下运行
history.pushState: 三个参数 :数据 标题(都没实现,用“”来代替) 地址(可选)
Window.onpopstate事件 : 读取数据 event.state(读取对应的值)
[b]注意:网址是虚假的,需在服务器指定对应页面,不然刷新找不到页面[/b]
//示例:随机彩票页面
<input type="button" value="生成彩票" id="btn1"/> <div id="div1"></div> <script> var oBtn = document.getElementById('btn1'); var oDiv = document.getElementById('div1'); var json = {}; oBtn.onclick = function(){ var oArr = caiPiao(35,7); var num = Math.random(); json[num] = oArr; oDiv.innerHTML = oArr; window.location.hash = num; } window.onhashchange = function(){ oDiv.innerHTML = json[window.location.hash.substring(1)]; } function caiPiao(numL,howL){ var arr = []; for(var i=0;i<numL;i++){ arr.push(i+1); } var newArr = []; for(var i=0;i<howL;i++){ newArr.push(arr.splice(Math.floor(Math.random()*arr.length),1)); } return newArr; } </script>
5.延时加载JS
JS的加载会影响后面的内容加载,很多浏览器都采用了并行加载JS,但还是会影响其他内容
Html5的defer和async(外部script标签属性)
defer
: 延迟加载,会按顺序执行,在onload执行前被触发
async
: 异步加载,加载完就执行,有顺序问题(某个js基于前面一个js时会有错误),互相不影响时可以使用
Labjs
库—异步加载js库,解决了兼容性
相关文章推荐
- HTML5之新特性(选择器、class列表属性、JSON新方法、data自定义数据、延迟加载JS)
- js设置延时加载事件
- js原生拖拽事件(HTML5的拖放 API)
- partial.js client-side routing(客户端路由-基于HTML5 SPA特性的历史API)
- js使得数据延时加载实例
- HTML5笔记二:历史管理history
- js的JSON新方法和历史记录管理
- 用headjs来管理和加载js 提高网站加载速度
- SPORE,一个很好的实现JS命名空间的管理,模块的定义,与自动加载依赖模块的脚本文件
- 一段实现页面上的图片延时加载的js
- 关于浏览器对HTML5的离线储存资源的管理和加载原理
- jQuery与JS加载事件用法分析
- javascript不依赖JS加载顺序事件对象实现
- html5的onhashchange和history历史管理
- js自动加载事件方法总结
- js onload处理html页面加载之后的事件
- 原生JS实现AJAX、JSONP及DOM加载完成事件,并提供对应方法
- js 加载事件
- js判断页面加载完成绑定事件
- js同步、异步、延时、无阻塞加载