当你在人群中谈论到“HTML5”,你也许会感觉到,自己像一位异域舞者或独角兽,来到屋子中间,带有明显的“我很酷,我知道它”的意味。这不能说我们虚荣,多少年来,基本的HTML API一直没有任何发展,以至于当有一个小的新功能出现时,例如placeholder,都会让我们露出新奇的眼神。尽管新式的浏览器中实现了很多HTML5特征,但大部分程序员仍对一些小的、非常有用的API不了解或从未听说。本文中我将介绍一些这样的API,并欢迎大家发掘出更多不为人知的HTML5 API!
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非常的有用:它并不会替换原有的右键菜单,而是将你的自定义右键菜单添加到浏览器的右键菜单里:
<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="Twitter" icon="/images/twitter_icon.gif" onclick="goTo('//twitter.com/intent/tweet?text=' + document.title + ': ' + window.location.href);"></menuitem> <menuitem label="Facebook" icon="/images/facebook_icon16x16.gif" onclick="goTo('//facebook.com/sharer/sharer.php?u=' + window.location.href);"></menuitem> </menu> </menu> </section>
需要注意的是,最好使用JavaScript动态的创建这些菜单代码,因为菜单事件最终要调用JavaScript执行任务,如果用户禁止了JavaScript,右键菜单也不会生成,他同时也不会看到菜单。
使用dataset API,程序员可以方便的获取或设置data-*
自定义属性:
/* 以下面的代码为例 <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>
无需多说,跟classList一样,简单实用
即使是IE8也对postMessage API支持多年了,postMessage API的功能是可以让你在两个浏览器窗口或iframe之间传递信息数据:
// 从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("你也好吗!"); } ]);
消息体只能是字符串,但你可以用JSON.stringify和JSON.parse将消息转换成更有意义的数据体!
autofocus属性能够让BUTTON
, INPUT
, 或 TEXTAREA
元素在页面加载完成时自动成为页面焦点:
<input autofocus="autofocus" /> <button autofocus="autofocus">Hi!</button> <textarea autofocus="autofocus"></textarea>
在像谷歌搜索页面那样的有固定模式的地方,autofocus属性是最理想的一个功能。
浏览器对各个API的支持稍有不同,所以,在使用前先检查一下对这些特征的支持情况。再花点时间阅读一下各个API的详细说明,相信你会有更多的发现。
HTML5的诞生给我们提供了很多精彩的JavaScript和HTML新功能和新特征。有些新特征我们已知多年并大量的使用,而另外一些主要是用在前沿的手机移动技术上,或者桌面应用中起辅助作用。不管这些HTML5新功能有多强大,多好用,它们都是为了帮助我们更好的开发浏览器前端应用。我之前给大家分享过一篇你不知道的5个HTML5新功能,目的是希望里面的提到的一些技术能帮助改进你的web应用。这里我还想分享给大家一些少有人知道的HTML5新功能,希望能对你有些用处!
强大的全屏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接口提供给用了一个监听事件,这个事件能告诉程序员当前页面是否是用浏览器中激活的标签页/窗口、是否是用户正在观看的页面,它还能告诉程序员用户何时切换页面、不再观看本页面/窗口:
// 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);
通过灵活的使用这个API,程序员可以在用户不观看本页时暂停一些繁重的任务(例如AJAX或动画)。
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很显然是专门为手机里的浏览器应用设计的,它提供了读取设备里的电池电量和充电状态的功能:
// 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 rel="prefetch" href="http://www.webhek.com/link-prefetch/" /> <!-- 预加载一个图片 --> <link rel="prefetch" href="http://www.webhek.com/wordpress/wp-content/themes/webhek2/images/follow-us.jpg" />
就是这5个你需要知道和尝试的新HTML5 API。请注意,这些新功能在几年之内就会流行起来,所以,越早接受这些API,你就能更好的创造出最前沿技术的Web应用。花几分钟试试这些新功能,看看你能用它们实现什么样的效果!
DNS主机名解析有时会出现拖慢网站速度的问题。现代浏览器当遇到DNS解析时已经十分聪明——用户在跟随某个链接之前,浏览器先尝试解析域名再将其进行缓存。
DNS Prefetching特性允许开发者手动控制,告诉浏览器需要解析哪个域名。代码如下:
Link Prefetching特性允许开发者在页面加载的时候预先加载他们希望指定的页面或元素。代码如下:
你也能够使用prerendering特性令你的网站速度更快,浏览器能够在后台获取并渲染整个页面,用户点击相应链接时再为用户展示该页面。代码如下:
凭借HTML5的Download属性,开发者可以不必到特定页面下载文件,而是直接进行下载。这一操作不必依赖服务器端代码便能够执行。代码如下:
一旦用户输入一个有效的email或URL地址,pattern属性可以令你直接使用regular expressions而无需检查JS或服务器端代码。代码如下:
若使用jQuery插件执行自动填充输入操作,则用户每敲击一次键盘都要访问服务器端代码以及数据库。但有了Datalist元素,开发者不必再使用jQuery插件便可完成该操作。代码如下: