你可能不知道的10个HTML5新功能

jopen 10年前

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新功能(第二辑)