你可能不知道的10个HTML5新功能
Element.classList
classList API提供了我们多年来一种使用JavaScript工具库来实现的控制CSS的基本功能:
// 增加一个CSS类 myElement.classList.add("newClass"); // 删除一个CSS类 myElement.classList.remove("existingClass"); // 检查是否拥有一个CSS类 myElement.classList.contains("oneClass"); // 反转一个CSS类的有无 myElement.classList.toggle("anotherClass");
这个新出现的API的主要价值体现就是:简单实用。读一下这篇文章,里面介绍了其它几个classList功能特征。
ContextMenu API
这个新的ContextMenu API非常的有用:它并不会替换原有的右键菜单,而是将你的自定义右键菜单添加到浏览器的右键菜单里:
<section contextmenu="mymenu"> <!-- 添加菜单 --> <menu type="context" id="mymenu"> <menuitem label="Refresh Post" onclick="window.location.reload();" icon="/images/refresh-icon.png"></menuitem> <menu label="Share on..." icon="/images/share_icon.gif"> <menuitem label="推ter" icon="/images/推ter_icon.gif" onclick="goTo('//推ter.com/intent/tweet?text=' + document.title + ': ' + window.location.href);"></menuitem> <menuitem label="非死book" icon="/images/非死book_icon16x16.gif" onclick="goTo('//非死book.com/sharer/sharer.php?u=' + window.location.href);"></menuitem> </menu> </menu> </section>
需要注意的是,最好使用JavaScript动态的创建这些菜单代码,因为菜单事件最终要调用JavaScript执行任务,如果用户禁止了JavaScript,右键菜单也不会生成,他同时也不会看到菜单。
Element.dataset
使用dataset API,程序员可以方便的获取或设置data-*
自定义属性:
// 从A域上的窗口或iframe,发送一条信息到B域中的窗口或ifame var iframeWindow = document.getElementById("iframe").contentWindow; iframeWindow.postMessage("来自第一个窗口的问候!"); // 在第二个不同域上的窗口或iframe接收消息 window.addEventListener("message", function(event) { // 检验域的合法性 if(event.origin == "http://www.webhek.com") { // 输出日志信息 console.log(event.data); // 反馈消息 event.source.postMessage("你也好吗!"); } ]);
无需多说,跟classList一样,简单实用
window.postMessage API
即使是IE8也对postMessage API支持多年了,postMessage API的功能是可以让你在两个浏览器窗口或iframe之间传递信息数据:
/* 以下面的代码为例 <div id="myDiv" data-name="myDiv" data-id="myId" data-my-custom-key="This is the value"></div> */ // 获取元素 var element = document.getElementById("myDiv"); // 获取id var id = element.dataset.id; // 读取 "data-my-custom-key" 的值 var customKey = element.dataset.myCustomKey; // 修改成其它值 element.dataset.myCustomKey = "Some other value"; // 结果是: // <div id="myDiv" data-name="myDiv" data-id="myId" data-my-custom-key="Some other value"></div>
消息体只能是字符串,但你可以用JSON.stringify和JSON.parse将消息转换成更有意义的数据体!
autofocus属性
autofocus属性能够让BUTTON
, INPUT
, 或 TEXTAREA
元素在页面加载完成时自动成为页面焦点:
<input autofocus="autofocus" /> <button autofocus="autofocus">Hi!</button> <textarea autofocus="autofocus"></textarea>
在像谷歌搜索页面那样的有固定模式的地方,autofocus属性是最理想的一个功能。
浏览器对各个API的支持稍有不同,所以,在使用前先检查一下对这些特征的支持情况。再花点时间阅读一下各个API的详细说明,相信你会有更多的发现。
全屏API接口
强大的全屏API接口能让程序员通过编程启动浏览器进入全屏模式,并请求用户的允许:
// Find the right method, call on correct element function launchFullScreen(element) { if(element.requestFullScreen) { element.requestFullScreen(); } else if(element.mozRequestFullScreen) { element.mozRequestFullScreen(); } else if(element.webkitRequestFullScreen) { element.webkitRequestFullScreen(); } } // Launch fullscreen for browsers that support it! launchFullScreen(document.documentElement); // the whole page launchFullScreen(document.getElementById("videoElement")); // any individual element
任何页面元素都可以成为全屏输出的目标,HTML5里甚至还提供了一个CSS伪类来让程序员在浏览器全屏时控制全屏元素的样式。当你在开发游戏时这个全屏API接口特别有用;尤其像BananaBread这样的枪击游戏中。
页面可见性API接口
页面可见性API接口提供给用了一个监听事件,这个事件能告诉程序员当前页面是否是用浏览器中激活的标签页/窗口、是否是用户正在观看的页面,它还能告诉程序员用户何时切换页面、不再观看本页面/窗口:
// Adapted slightly from Sam Dutton // Set name of hidden property and visibility change event // since some browsers only offer vendor-prefixed support var hidden, state, visibilityChange; if (typeof document.hidden !== "undefined") { hidden = "hidden"; visibilityChange = "visibilitychange"; state = "visibilityState"; } else if (typeof document.mozHidden !== "undefined") { hidden = "mozHidden"; visibilityChange = "mozvisibilitychange"; state = "mozVisibilityState"; } else if (typeof document.msHidden !== "undefined") { hidden = "msHidden"; visibilityChange = "msvisibilitychange"; state = "msVisibilityState"; } else if (typeof document.webkitHidden !== "undefined") { hidden = "webkitHidden"; visibilityChange = "webkitvisibilitychange"; state = "webkitVisibilityState"; } // Add a listener that constantly changes the title document.addEventListener(visibilityChange, function(e) { // Start or stop processing depending on state }, false);
getUserMedia接口API
getUserMedia API是个非常有趣的接口!使用这个API,加上<video>和<canvas>标记,你可以在浏览器里进行拍照!
// Put event listeners into place window.addEventListener("DOMContentLoaded", function() { // Grab elements, create settings, etc. var canvas = document.getElementById("canvas"), context = canvas.getContext("2d"), video = document.getElementById("video"), videoObj = { "video": true }, errBack = function(error) { console.log("Video capture error: ", error.code); }; // Put video listeners into place if(navigator.getUserMedia) { // Standard navigator.getUserMedia(videoObj, function(stream) { video.src = stream; video.play(); }, errBack); } else if(navigator.webkitGetUserMedia) { // WebKit-prefixed navigator.webkitGetUserMedia(videoObj, function(stream){ video.src = window.webkitURL.createObjectURL(stream); video.play(); }, errBack); } }, false);
你一定要在以后的应用中试试这个HTML5新功能,通过浏览器进行各种各样的交互的技术已经越来越流行了!
电池接口API
电池接口API很显然是专门为手机里的浏览器应用设计的,它提供了读取设备里的电池电量和充电状态的功能:
// Get the battery! var battery = navigator.battery || navigator.webkitBattery || navigator.mozBattery; // A few useful battery properties console.warn("Battery charging: ", battery.charging); // true console.warn("Battery level: ", battery.level); // 0.58 console.warn("Battery discharging time: ", battery.dischargingTime); // Add a few event listeners battery.addEventListener("chargingchange", function(e) { console.warn("Battery charge change: ", battery.charging); }, false);
这些HTML5提供的电池接口API能直接将电池电量状态告诉web应用,而不需要借助电池传感器或第三方应用。虽然不是一个特别大的功能,但绝对是一个有用的接口。
页面预加载(Link prefetch)API
页面预加载(Link prefetch)API功能能够让浏览器在后台静悄悄的预先加载/读取一些页面或资源到当前页面,给用户一个顺滑的使用体验:
<!-- 预加载一个页面 --> <link rel="prefetch" href="/misc/goto?guid=4958863952923493466" /> <!-- 预加载一个图片 --> <link rel="prefetch" href="https://simg.open-open.com/show/cbe20d68b3a89a66ce6bdd9dc3b68c13.jpg" />
就是这5个你需要知道和尝试的新HTML5 API。请注意,这些新功能在几年之内就会流行起来,所以,越早接受这些API,你就能更好的创造出最前沿技术的Web应用。花几分钟试试这些新功能,看看你能用它们实现什么样的效果!
本文合并了 《你不知道的5个HTML5新功能》和《你不知道的5个HTML5新功能(第二辑)》