整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

H5 是 HTML5 吗?

H5 是 HTML5 吗?

作为程序员经常会被业务人员问一些技术相关的热门词,比如:“H5页面是什么?” , 我的回答是:“符合 HTML5 标准实现的页面,大家为了方便,简称 H5“。 真的是这样的吗? 当连续有人问相关的问题,并详细了解一些业务以后,慢慢的发现 H5 已经不单单是一个技术相关的词。

之前被我们产品人员也问到一个类似的问题:“怎么通过技术手段来判断一个网站是H5的页面,还是普通页面?”,听到这个问题我懵了,按照我前面的解释 “符合 HTML5 标准实现的页面就是 H5页面”,那当前互联网上看到的网站基本上都在采用了 HTML5 标准。详细了解业务以后才知道,他的要求是把微信里面那种好友之间,或者朋友圈分享的那种带有主题性质的宣传页面(实在是不知道怎么描述)和我们平时电脑上访问的页面通过技术区分识别出来。这个功能能不能实现,具体怎么实现这里不讨论,但是可以看出在业务人员和一些客户眼里,在微信上分享的那种炫酷的页面就是H5页面。 那这里的 H5 还是 HTML5 吗? 从这种应用上来说已经不是了。

另外一个案例,被一个刚开始学习前端的学生问到一个问题:“React 制作的页面都是 SPA(single page web application,单页应用程序) 的,那 HTML5 可以实现 SPA 吗?”,当被问到这个问题的时候我一下子也不知道怎么回答,只是让他先去学习一下 HTML5 ,以及 SPA 到底是什么?要搞清楚。 HTML是超文本标记语言,是一种规范,一种标准,“5” 是HTML第五次重大修改,可以理解为第五个版本,包含了很多功能特性。 SPA 是通过 HTML 与 Javscript 实现的单页应用程序,就是在一个页面上展示所有数据,通过 Javascript 去动态更新程序。所以 SPA 的实现和是不是 HTML5 没有大的关系。这位同学问出这样的问题,我的猜想是这样的,我们在前面提到的那种在微信上分享的那种页面大多数都是一个单页面,然后通过手指向下滚动来浏览一张张炫酷的动画。导致他认为这样的页面就是所谓的 SPA 页面,再加上多数人都认为这种页面都 HTML5 实现的页面,所有他才会问出 HTML5 和 SPA 扯在一起。

我相信现在大多数人认为的 H5 页面,就是在手机微信分享的那种炫酷的网页。 HTML5,作为技术人员都知道是一种标准,一种规范。

H5 这个词的由来?

如果 H5 不等于 HTML5 了,那 H5 到底是什么呢? 维基百科没有定义,百度百科也没有定义,知乎上也没有人说清楚。没有一个标准的定义,只在大家口口相传,出现各种理解扭曲。H5 真的是一个诡异的词。

出现现在这样个状况,我的猜想是这样的,HTML5 在 2013 年左右就发布,在 2014 年底宣布标准制定完成,但是市面的浏览器的支持主要还是在手机上,电脑上主要有 IE 的存在导致标准普及缓慢,所以开始有开发者在手机上做很多酷炫的页面,当这些酷炫的效果在业务人员看到了以后,开始加以有效的利用,特别是在活动宣传和广告方面,为了宣传业务人员会问技术人员:“这种炫酷的效果是怎么实现的?”,技术人员说:“我用的是HTML5的技术”。业务人员的宣传营销能力那是相当厉害,在客户面前大量的宣传:“我们用到了一个牛逼技术,让你的手机网页非常炫酷好看”,慢慢的客户都知道了有一种技术可以把页面在手机上做的非常好看,非常炫酷,然后客户又开始对其他人说:“我们的这个网页用了现在最新的技术,叫什么什么5页面,对H5页面”。然后客户之间口口相传,当以后遇到同样的业务需求的时候,找另外一家供应商说:“我要一个H5页面,要长的类似什么..一样的网页”,然后这一家做网站的公司开始也把这种网站也开始叫着H5页面。最后铺天盖地的“H5页面”就出来了。(这里只是我的一个猜想,具体是什么个情况还有待验证)

随后,在一些招聘岗位出现了“H5开发工程师”。

书籍出现了 《H5营销…》。

社会上的培训机构出现了H5技术培训,“0基础学习H5…”,“H5速成班”。

出现了很多专门做H5网站的公司,就连百度都有一个叫做 “百度H5”的产品。

这是一种健康的现象吗?

我开始有点好奇那些培训机构和相关书籍是怎么定义 H5 这个词的。

移动营销页面

值得高兴的一件事情是,由于市场业务的推动,让移动互联网等到了快速的发展。甚至提高了前端开发在市场中的主要性。但是,还是存在一些问题。

  • 培训机构宣传的那种 “0基础120天速成H5工程师” … ,学员学习的应该还是的前端知识,所以这里的 H5 应该是 HTML5 标准相关体系的技术栈的培训。市场业务把一个以活动推广(营销)为导向的手机上炫酷的页面理解为 H5 页面。这是存在一个信息不对称的问题,这个问题也经常让技术人员与业务人员难以沟通。

  • 用词不严谨,在国内没有一家机构对 “H5”这个词有合理的解释,估计也是不好解释。像百度这样的 H5 产品,感觉他们把 H5 理解为创意,还有人理解为微场景,还有人理解为手机上的PPT。

  • 把 HTML5 理解为一种技术也是不合理的,它应该是一种规范,一种标准(多次强调)。

  • 如果 HTML6 标准发布以后怎么办? 是不是这些所有的名称需要换一遍,“H5网站”,“H6开发工程师”,“H6营销宝典”,“请问你们公司做H6吗?” …

回头我们再来看一下,我们看到的那些手机炫酷的网站真的全是 HTML5 新特征实现的吗?不一定。那是不是只用 HTML5 的新特性就能够写出这样的网站呢?不一定,它有时候还需要CSS3 做动画,用JavaScript去控制行为 。

在 2012 左右,那时候还没有发布 HTML5,不过看到了移动互联网的苗头,我和朋友一起开始做手机建站,主要面向一些中小型企业,客户的需求很简单,就是通过手机可以打开自己的官方网站,同时可以把网站上的产品随时随地分享给他们的客户看(这种需求后来被响应式相关技术满足了)。那时候人们理解这种网站就是手机网站。到现在客户需求还是很明确,就是需要在手机上做一些博取眼球的营销页面,通常都是一些活动页面。在国际上有个词叫做 Minisite ,它的解释是:“知名企业为了配合企业的市场运作活动,会推出一些小型网站也就是MiniSite进行线上营销”。所以我认为当前市场上客户所说的 H5 页面,应该是一种移动端的 MiniSite (Mobile MiniSite)。或者把它叫做 “移动营销页面”,简称 MMP (Mobile Marketing Page) 。

结束

不过 H5 这个词已经很难改掉了,如果我现在继续给客户说,H5 是符合 HTML5 的简称,HTML5 是一种标准,一种规范,那我们讨论的东西肯定不是同一个东西。

但是我希望,作为开发者,在一些技术解释上不应该误导业务人员。作为业务人员,在对外宣传的时候也不应该误导客户。命名这种事情我们应该严谨。

    本文摘自:HYPERS前端团队博客

    endo UI调查后得出的几个关键结论:

    • 移动应用开发不存在’one-size-fits-all’(万全之策)的解决方案。无论是采用混合、HTML5还是原生,许多开发者在项目的中期总会发现他们最开始采用的方法并不是最佳方案

    • Web混合(Hybrid)应用正在成为热门趋势

    • Web平台(HTML5 & JavaScript)是创建跨平台应用的首选

    还在一条道走到黑?out了!

    一直以来,人们在将HTML5和原生SDK进行比较时,一般认为HTML5在这两个方面处于劣势:

    • APIs对手机功能和服务的访问有限

    • 性能这个一直是被一些开发者诟病的问题,UI响应度和数据加载速度都没有原生应用给力

    但是我们也可以看到,HTML5这两年在这些劣势上与原生应用的差距也在越来越小。Kendo UI团队近日开发了两款HTML5/Hybrid应用,然后将他们呈现给其他开发人员,让他们判断哪款是原生应用,哪款是混合应用。结果没有一个开发者判断正确,没有一个人否定两款应用其实都不是原生应用。

    这个调查表明HTML5/Hybrid/Native三者之间的差距在越来越小,界限越来越模糊。这不仅仅体现在应用的用户体验上,还体现在开发过程中:越来越多的开发者在项目中期意识到要实现目标可以有其他可替代的方式,而绝不是一条道走到黑。

    那么这对于大多数移动开发者来说,这意味着什么呢?这意味着开发人员需要抛弃过去对三者孰优孰劣的狭隘观念了,擦亮你的双眼,真正弄清楚它们各自的优势,然后不断的在混合、HTML5和原生开发中尝试,只有这样才能准确判断哪一种方式是最佳的方案。

    HTML5开发受追捧,原生开发被冷落

    原生开发虽然具有性能高、可访问手机所有功能、可线下使用等先天优势。但在开发阶段却是困难重重,比如开发周期长、支持设备有限、上线时间不确定等问题。在今年的调查中可以看到,越来越多的开发者选择纯HTML5开发跨平台应用,而纯原生应用越来越少:

    无论是HTML5还是原生,适合才是王道

    在被问到开发原生应用的中途是否又换成了HTML5应用开发,40%的人回答了”Yes”。而将这个问题反过来,31%的人回答了”Yes”。这个比例不相上下,证明其实无论是HTML5还是原生,只要适合自己的项目需求,它就是好方法。

    大部分对HTML5企业级开发有信心

    选择HTML5、混合和原生开发的比率在越来越均衡,但HTML5在企业级开发中的地位上升也是非常明显的,当被问及预测HTML5何时适合进行企业级开发时,31%的人回答是”Immediately”,26%的人认为是在未来的一年之内。

    当问及到2014中期你计划用HTML5开发多少应用时,大多数开发人员(占34%)的回答是2-3个,而24%的人回答是11个以上。

    HTML5开发商务应用过半 B2C是主流

    你使用HTML5开发哪些类型的移动应用?超半数的被调查者选择Business apps,占57%,Finance和Productivity应用各占21%,另外,教育、社交、医疗等应用也占较高比例。

    那么在商务应用中,开发者们又具体开发了哪些应用呢?64%的人选择了公共B2C应用,排第二的是B2E应用,占49%。

    HTML5已成跨平台开发首选

    随着越来越多的用户从桌面/Web转移到移动端,53%的人选择采用HTML5创建跨平台应用,可见HTML5已经成为跨平台移动开发的首选。

    大部分人认为混合开发可节省大量成本

    调查显示,35%的开发者用HTML5&JavaScript开发Web应用,而混合应用和原生应用均各占16%。

    除了易用性以外,成本也是开发人员必须考虑的一大重要因素,当问及与原生应用 相比,你认为混合应用开发可以节省的时间和人力成本时,50%的受访者认为可节省40%-70%的成本。

    结论

    事实胜于雄辩,HTML5/Hybrid确实正在成为越来越多移动开发者的选择,但绝不是未来唯一的选择。我们应该认清,HTML5、混合及原生技术都有各自的优势,不能单纯的认为HTML5好或者原生好。而我们应该做的是根据自己的需求、定位和预算,去选择最佳的解决方案。


    数据随身查,添加官方微信公共帐号:i199it

    .应用程序标签

    • DataList(数据列表)

    • Progress(进度条)

    • Meter(数值显示器) 示例:

    <html lang="en"><head> <meta charset="UTF-8"> <title>应用程序标签</title> <style> .my-progress{ -webkit-appearance: none; } </style></head><body><!--数据列表,呈现需要载体--><input type="text" list="data-list"><datalist id="data-list"> <option value="张三"></option> <option value="李四"></option></datalist><!--进度条--><progress></progress><!--progress默认最大值是1,可以设定自己想要的值--><progress class="my-progress" value="30" max="100"></progress><meter min="0" max="100" low="40" high="90" optimum="100" value="91">A+</meter></body>

    可以利用数据列表(data-list)做一个那种带下拉框的输入框,可以根据用户输入的内容匹配下拉框的内容(select2也可以实现这种需求,而且最低可以兼容到IE8,推荐用select2),后面的progress和meter样式不好控制,用的不太多。

    2.自定义属性(data-*)

    在html5中可以自定义数据,以data开头,利用这个自定义标签我们可以把属性暂时存储到页面中,在js中可以使用,例子如下:

    <html lang="en"><head> <meta charset="UTF-8"> <title>data属性</title></head><body> <ul id="list"> </ul></body><script> // 键是ID 值是信息 var data={ 01: { name: "张三1", age: 18 }, 02: { name: "张三2", age: 19 }, 03: { name: "张三3", age: 20 } }; var list=document.getElementById("list"); for(var id in data){ var item=data[id]; var liem=document.createElement("li"); liem.innerHTML=item.name; //自定义data-*属性 liem.setAttribute("data-name",item.name); liem.setAttribute("data-age",item.age); list.appendChild(liem); //点击获取dataset属性 liem.addEventListener("click",function(){ //下面这两种方式均可以,都不带data- alert(this.dataset['name']); alert(this.dataset.name); }) }</script>

    下面这篇文章总结的很好,可以参考:http://blog.csdn.net/qq_31851435/article/details/53100691

    3.新的表单提交方式

    传统的一共有9中表单提交方式,html5新增了几种,目前只用在移动端,pc端兼容性有问题,而且在输入的时候并没有进行验证,比如类型是email的,并没有校验邮箱格式,还是需要我们自己手动写正则表达式验证的,只是在手机端当唤起输入法的时候会自动切换到英文输入法。

    <head> <meta charset="UTF-8"> <title>新的表单提交方式</title></head><body><h3>传统的表单提交方式(9种)</h3>用户名:<input type="text"> <br>密码:<input type="password"><br>性别:<input type="radio"><br>课程:<input type="checkbox"><br>隐藏:<input type="hidden">文件:<input type="file"><br>按钮:<input type="button" value="按钮"><br>表单:<input type="submit"><br>重置:<input type="reset"><br><hr><h3>新的表单提交方式(目前只用在移动端)</h3>颜色:<input type="color"><br>网址:<input type="url"><br>搜索:<input type="search" results="10" placeholder="Search..."><br>邮箱:<input type="email" pattern="^\*.com"><br>日期:<input type="date" min="2015-09-01" max="2018-09-01"><br>图片:<input type="image"><br>范围:<input type="range" min="0" max="50" value="10"><br>数字:<input type="number"></body>

    4.新的选择器

    html5提供新的选择器,querySelector选择单个的元素,返回满足条件的第一个元素,是一个dom元素,querySelectorAll选择全部的元素,返回满足条件的全部元素,是一个dom数组,里面可以是id,标签或class类。

    <html lang="en"><head> <meta charset="UTF-8"> <title>新选择器</title></head><body><h3>新选择器</h3><ul> <li class="item">item1</li> <li class="item">item2</li> <li class="item">item3</li> <li class="item">item4</li> <li class="item">item5</li> <li class="item">item6</li> <li class="item">item7</li> <li class="item">item8</li> <li class="item">item9</li> <li class="item">item10</li></ul></body><script> //匿名函数,可以将作用域分隔开 (function(){ var liem=document.querySelector(".item"); //只选择第一个 console.log(liem.innerHTML); var lis=document.querySelectorAll("ul>li"); //选择全部 for(var i=0;i<lis.length;i++){ console.log(lis[i]); lis[i].addEventListener("click",function(){ debugger; //可以调试代码。类似于浏览器打断点 console.log(this.innerHTML); }) } })()</script>

    5.元素类列表(Element.classList)

    新H5中DOM对象多了一个classList属性,是一个数组:

    • add 添加一个新的类名

    • remove 删除一个类名

    • contains 判断是否包含一个指定的类名

    • toggle 切换一个类名。 element.toggle('class-name',[addorremove]),第一个参数是类名,第二个参数是布尔值,如果是true,则添加类名,如果是false,则去掉类名。示例:

    <head> <meta charset="UTF-8"> <title>元素类列表</title> <link rel="stylesheet" href="css/bootstrap.css"></head><body><div class="container"> <div class="collapse navbar-collapse"> <nav class="navbar navbar-default"> <a class="navbar-brand" href="#">Brand</a> <ul class="nav navbar-nav"> <li><a href="#">Home</a></li> <li><a href="#">Link</a></li> <li><a href="#">Link</a></li> </ul> </nav> </div></div><script> //匿名函数 (function(){ /** 点击时添加和删除类名**/ var lis=document.querySelectorAll(".nav li"); for(var i=0;i<lis.length;i++){ lis[i].addEventListener("click",function(e){ //去掉原先所有的样式 for(var j=0;j<lis.length;j++){ lis[j].classList.remove("active"); } //添加点击样式 this.classList.add("active"); e.preventDefault(); //取消事件的默认操作 }) } /** 点击时存在类名则删除,不存在类名则添加**/ var elem=document.querySelector(".navbar-brand"); //点击时如果存在active这个属性则去掉,如果不存在这个属性则加上 elem.addEventListener("click",function(e){ //判断是否包含active这个类名 var isExist=elem.classList.contains("active"); this.classList.toggle("active",!isExist); e.preventDefault(); }) })()</script></body>

    6.访问历史Api

    在HTML5中可以通过window.history操作访问历史状态,让一个页面可以有多个历史状态

    • window.history.forward(); // 前进

    • window.history.back(); // 后退

    • window.history.go(); // 刷新

    • history.pushState(放入历史中的状态数据, 设置title(现在浏览器不支持), 改变历史状态),通过JS可以加入一个访问状态

    <head> <meta charset="UTF-8"> <title>历史记录</title></head><body><input type="button" value="测试历史记录" onclick="addHistory()"></body><script> //添加历史记录 function addHistory(){ //判断浏览器是否支持历史记录,毕竟是h5的新特性,低版本浏览器不支持 if(window.history && history.pushState){ //支持 history.pushState(new Date().toLocaleDateString(),"设置历史记录的标签,但是目前浏览器还不支持","?demo="+new Date().toLocaleTimeString()); }else{ console.log("抱歉,浏览器不支持历史记录") } } //下面这个事件是点击浏览器中的前进或后退时触发 window.addEventListener("popstate",function(e){ console.log("点击了历史按钮"+e.state); })</script>

    7.全屏Api

    H5中可以用requestFullScreen()方法实现指定元素的全屏显示(类似于浏览器中按F11)。首先需要获取需要全屏显示的元素,然后判断浏览器是属于谷歌内核还是火狐内核或者其它浏览器,然后调用响应方法即可。(注意:目前这个特性浏览器兼容性还比较差,谷歌和火狐可以)

    var elem=需要全屏的元素;if (elem.webkitRequestFullScreen) { elem.webkitRequestFullScreen();} else if (elem.mozRequestFullScreen) { elem.mozRequestFullScreen();} else if (elem.requestFullScreen){ elem.requestFullScreen();}
    <head> <meta charset="UTF-8"> <title>全屏显示</title></head><body><h3 style="cursor: pointer">点我全屏显示</h3><p>测试全屏显示测试全屏显示测试全屏显示测试全屏显示测试全屏显示测试全屏显示 测试全屏显示测试全屏显示测试<br> 全屏显示测试全屏显示测试全屏显示测试全屏显示测试全屏显示</p><script> //匿名函数 (function () { //获取事件源和要全屏显示的元素 var elem=document.querySelector("p"); document.querySelector("h3").addEventListener("click",function(e){ //判断浏览器是否支持全屏显示 if (elem.webkitRequestFullScreen) { elem.webkitRequestFullScreen(); } else if (elem.mozRequestFullScreen) { elem.mozRequestFullScreen(); } else if (elem.requestFullScreen){ elem.requestFullScreen(); }else{ console.log("浏览器不支持全屏显示") } }); })()</script></body>

    8.Application Cache离线访问技术

    在H5中可以利用Application Cache实现离线访问技术,测试时可以通过谷歌浏览器——NetWork——No throttling(Disable cache后面的那个下拉框)——下拉选择Offline(模拟未联网的情形)。示例如下:

    html代码:<html lang="en" manifest="cache.manifest"><head> <meta charset="UTF-8"> <title>离线访问</title> <link rel="stylesheet" href="style.css"></head><body><p>这是html页面中的内容</p><script src="script.js"></script></body>style.css文件代码body::before{ content: "这是Css中引入的内容"; font-size: 40px;}script.js文件代码:document.write("这是js中引入的内容")cache.manifest文件代码:CACHE MANIFEST# version 1.0.1CACHE: 08离线访问.html script.js style.cssNETWORK: *

    解释:在html代码中通过css的伪类和js的document.write函数分别输出两句话,模拟请求其它文件,然后在manifest(缓存清单)中定义了一个cache.manifest的缓存清单文件,文件里首先定义了当前软件的版本,下面的CACHE,代表断网情况下,从下面定义的文件中读取文件,NETWORK代表联网时候要读取的文件,星号代表全部。即断网时从我定义的文件中读取文件,联网时,读取全部文件,这样便可实现离线访问。

    9.web网页存储

    h5中提供sessionStorage和localStorage两种数据存储方式,前者存储的内容只在本次会话中存储,浏览器关闭数据消失,后者是可以永久存储在浏览器中,除非手动或通过程序删除。这两种存储方式比cookie存储的数据量大,而且可以存储对象数据(cookie只能存储字符串数据)。

    <head> <meta charset="UTF-8"> <title>网页存储</title></head><body><textarea rows="5" cols="30" id="txt-data"></textarea><input type="button" value="设置数据" id="set-data"><input type="button" value="获取数据" id="get-data"><script> (function(){ var txtValue=document.querySelector("#txt-data"); console.log(txtValue.value); //设置数据 document.querySelector("#set-data").addEventListener("click",function (e) { //判断是否支持存储 if(window.sessionStorage){ sessionStorage.setItem("key",txtValue.value); }else{ console.log("还在用渣渣IE吗?升级吧。。。") } }) //获取数据 document.querySelector("#get-data").addEventListener("click",function (e) { //判断是否支持存储 if(window.sessionStorage){ txtValue.value=sessionStorage.getItem("key"); }else{ console.log("还在用渣渣IE吗?升级吧。。。") } }) })()</script></body>

    10.操作文件Api

    通过file表单选择文件,之后利用h5提供的文件api可以获取文件名,大小,类型,最后修改时间等文件信息。

    <html lang="en"><head> <meta charset="UTF-8"> <title>操作文件</title> <link rel="stylesheet" href="css/bootstrap.css"></head><body> <div class="container"> <form> <input type="file" class="form-control hidden" id="btn_file" multiple> <input type="button" value="选择文件" class="btn btn-success" id="btn_select"> <div class="list-group" id="ul_list"> <!--待追加数据位置--> </div> </form> </div></body><script> (function(){ var btn_file=document.querySelector("#btn_file"); var btn_select=document.querySelector("#btn_select"); var ul_list=document.querySelector("#ul_list"); //利用“hidden”类将文件输入框隐藏,当点击“选择文件按钮时”,调用选择文件按钮,选择文件, // 因为input type="file"这个无法修改样式,把它隐藏,点击其它按钮时,在其它按钮中调用点击上传文件 btn_select.addEventListener("click",function(){ btn_file.click(); }) //选择文件完成后(即文件内容发生改变后) btn_file.addEventListener("change",function(e){ var files=btn_file.files; //获取所有文件,并遍历 for(var i=0;i<files.length;i++){ console.log(files[i]); var liem=document.createElement("li"); liem.setAttribute("class","list-group-item"); liem.innerHTML=' <h4 class="list-group-item-heading">'+files[i].name+'</h4>'+ '<p class="list-group-item-text">'+files[i].lastModifiedDate.toLocaleTimeString()+' '+(files[i].size/1024).toFixed(2)+'kb</p>' ul_list.appendChild(liem); } }) })()</script>

    这里是用到了bootstrap的样式,因为file表单比较丑,而且无法改变样式,所以我们可以把文件表单隐藏(用hidden隐藏样式),提供一个按钮,当点击这个按钮时去雕砌选文件的弹框,multiple属性支持一次选择多个文件。

    11.拖拽文件

    拖拽文件时需要依次注册以下事件:

    • dragenter 注册拖拽进入事件

    • dragleave 注册拖拽离开事件

    • dragover 注册滑动事件(在这里面阻止默认事件)

    • drop 注册松手落地事件。 在拖动松手落地事件中判断拖进来的是文件还是图片地址还是文字,分别进行处理。e.dataTransfer获取拖动进来的信息。

    <head> <meta charset="UTF-8"> <title>拖拽文件</title> <link rel="stylesheet" href="css/bootstrap.css"> <style> #target{ height: 200px; border: 5px dashed #c0c0c0; color: #505050; padding: 20px; font-size: 40px; cursor: pointer; text-align: center; -webkit-user-select: none; } #target.actived{ border-color: #888; color: #080808; box-shadow: 0 0 80px #e0e0e0 inset; } </style></head><body><div class="container"> <div class="page-header"> <h3>拖拽文件</h3> </div> <div class="jumbotron"> <p>我们这里测试拖拽文件</p> <img src="test.png"> </div> <div id="target"> 拖拽文件进来 <ul id="result" class="list-group"></ul> </div></div></body><script> (function(){ var target=document.querySelector("#target"); var fileList=document.querySelector('#result'); //注册拖拽进入事件 target.addEventListener("dragenter",function(){ this.classList.add("actived"); //添加样式 }) //注册拖拽文件离开事件 target.addEventListener("dragleave",function(){ this.classList.remove("actived"); //添加样式 }) //注册落地事件之前必须要先阻止默认事件,这里在滑动里面阻止默认事件 target.addEventListener("dragover",function(e){ e.preventDefault(); //阻止默认事件 e.stopPropagation(); }) //注册松手落地事件 target.addEventListener("drop",function(e){ //判断拖入进来的是文件,图片还是文字,分别处理 if(e.dataTransfer.files.length){ //拖入的是文件 var files=e.dataTransfer.files; for (var i=0; i < files.length; i++) { var li=document.createElement('li'); li.setAttribute('class', 'list-group-item'); // 创建信息的子节点 li.innerHTML='<h5 class="list-group-item-heading">' + files[i].name + '</h5><p class="list-group-item-text">' + files[i].lastModifiedDate.toLocaleDateString() + ' ' + files[i].lastModifiedDate.toLocaleTimeString() + ' ' + (files[i].size / 1024).toFixed(2) + 'KB</p>'; fileList.appendChild(li); } }else{ //不是文件 var data=e.dataTransfer.getData('text/plain'); //判断拖入的是文本还是图片 if(data){ //拖入的是文本,直接置换 target.innerHTML=data; }else{ //拖入的是图片 var imgElem=document.createElement("img"); imgElem.src=data; target.appendChild(imgElem); } } }) })()</script>

    12.访问设备信息

    h5提供了许多可以访问设备的Api,但是目前基本都应用在手机端,pc端使用非常有限。

    • 获取网络状态。

    // × 所有PC浏览器现在都不支持 只有手机端的Firefoxvar connectionInfo=navigator.connection;或者下面这个方法:if (navigator.onLine){ console.log('online');}else{ console.log('offline');}
    • 获取重力感应方向

    window.addEventListener('deviceorientation', function(event) { var a=event.alpha; // Y轴 上下方向 var b=event.beta; // Z轴 东西方向 var g=event.gamma; // X轴 南北方向});
    • 加速度计

    window.addEventListener('devicemotion', function(e) { // 获取加速计数据 {x,y,z} var acceleration=e.accelerationIncludingGravity;});
    • 地理坐标

    navigator.geolocation.getCurrentPosition(function(e) { // e.coords.longitude : 经度, e.coords.latitude : 纬度 document.querySelector('#result').innerHTML=JSON.stringify(e.coords);}, function(e) { document.querySelector('#result').innerHTML=JSON.stringify(e);});navigator.geolocation.watchPosition(success, error);

    H5还有其它的一些特性,包括语义化标签,ARIA无障碍互联网应用,多媒体(包括音频,视频)等等,真正使用的时候再详细研究。