前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HTML5新特性

HTML5新特性

作者头像
echobingo
发布2018-04-25 15:00:55
1.6K0
发布2018-04-25 15:00:55
举报

本章的主要内容有:


[1] 用于媒体回放的 video 和audio 元素

[2] HTML5拖放

[3] canvas简单应用

[4] Web存储: localStorage 和 SessionStorage

[5] Input输入类型

[6] 表单类型

[7] 表单属性

[8] 地理定位 (geolocation)

[9] Web Workers: Worker

[10] 服务器发送事件 EventSource


[1] 用于媒体回放的 video 和audio 元素

  • video 支持格式:ogg/mp4/webm; audio 支持格式:ogg/mp3/wav
  • audio 和 vedio 的用法基本相同, 只不过 audio 没有 width 和 height 属性
  • controls 属性向用户显示控件, 比如播放按钮; autoplay 属性自动播放
  • 根据 source 标签浏览器将使用第一个可识别的格式
代码语言:javascript
复制
    <video width="100px" height="100px" autoplay>
        <source src="vai/movie.ogg" type="video/ogg">
        <source src="vai/movie.mp4" type="video/mp4">
    </video>

    <audio src="vai/song.mp3" controls></audio>

视频/音频.png

[2] HTML5拖放

  1. 把拖放元素的 draggable 属性设置为 true
  2. 拖放元素的属性 ondragstart 调用一个函数, 通过 event 的 dataTransfer.setData() 方法设置被拖数据的数据类型和值
  3. ondragover 属性规定在何处放置被拖动的数据, 这里必须要通过 event 的 preventDefault() 方法阻止对元素的默认处理方式
  4. ondrop 属性设置被拖动的数据

** [注] IE 不支持 **

代码语言:javascript
复制
    <div ondrop="drop()" ondragover="allowDrop()">
        <imgsrc="vai/w3c.gif" draggable="true" ondragstart="drag()" id="drag1" />  /* 这里我就无能为力了,简书会把我的img替换成它的图片格式,为了防止自动转化,我把img和src中间空格去了 */
    </div>
    <div ondrop="drop()" ondragover="allowDrop()"></div>

    <script type="text/javascript">
        function allowDrop() {
            event.preventDefault();
        }
        function drag() {
            event.dataTransfer.setData("***", event.target.id);  /* 在这个例子中, 数据类型是 "***", 值是可拖动元素的 id ("drag1") */
        }
        function drop() {
            event.preventDefault();  /* 避免浏览器对数据的默认处理 (drop 事件的默认行为是以链接形式打开) */
            var data = event.dataTransfer.getData("***");   
            /* 通过 event 的 dataTransfer.getData() 方法传入数据类型 "***", 获得可拖动数据元素 id ("drag1") */
            event.target.appendChild(document.getElementById(data));   /* 把被拖元素追加到放置元素 (目标元素) 中 */
        }
    </script>

拖放.gif

[3] canvas简单应用

  • canvas 元素本身是没有绘图能力, 所有的绘制工作必须在 JavaScript 内部完成
代码语言:javascript
复制
    <canvas id="myCanvas"  width="400" height="200" style="border:1px solid #c3c3c3;">
        坐标原点 (0, 0) 从左上角开始, 宽代表 x 轴, 高代表 y 轴
    </canvas>   
    
    <script type="text/javascript">
        var c = document.getElementById("myCanvas");
        var cxt = c.getContext("2d");  /* getContext("2d") 对象是内建的 HTML5 对象, 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法 */   
        // 画矩形
        cxt.fillStyle = "#FFFF00";    /* 矩形的背景颜色, 默认为黑色 */
        cxt.fillRect(0,0,250,150);  /* 矩形坐标, 在画布上绘制 150x75 的矩形,从左上角开始 (0, 0) */
        // 画路径 
        cxt.moveTo(10,10);    /* 起点 */
        cxt.lineTo(150,50);  /* 第一个连接点 */
        cxt.lineTo(10,50);  /* 第二个连接点 */
        cxt.strokeStyle = "blue";  /* 颜色 */
        cxt.stroke();  /* stroke() 方法会实际地绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色 */
        // 画圆形
        cxt.fillStyle = "#FF0000";  /* 圆形背景 */
        cxt.beginPath();
        cxt.arc(125,75,15,0,Math.PI*2,true);  /* 圆心 (x, y)、半径、起始角、结束角、逆时针 (false为顺时针) */
        cxt.closePath();
        cxt.fill();  /* 圆形填充 */
        // 画渐变色
        var grd = cxt.createLinearGradient(0,100,175,50);  /* 渐变开始点(x, y) 渐变结束点(x, y) */
        grd.addColorStop(0,"#000000");   /* 渐变开始颜色 */
        grd.addColorStop(1,"#FFFFFF");  /* 渐变结束颜色 */
        cxt.fillStyle = grd;
        cxt.fillRect(0,100,175,50);
        // 把一副图像放在画布上 (Chrome不支持)
        var img = new Image();
        img.src = "vai/1.png";
        cxt.drawImage(img,200,100);
    </script>

canvas绘图.png

[4] Web存储: localStorage 和 SessionStorage

  1. localStorage 方法存储的数据没有时间限制。第二天、第二周或下一年之后, 数据依然可用
  2. sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后, 数据会被删除
代码语言:javascript
复制
    <div id="result"></div>
    <script>
        // localStorage 和 sessionStorage 的存储与访问
        if (typeof Storage !== "undefined") {
            localStorage.setItem("firstname", "Bill");   /* 存储, 或者 localStorage.lastname="Gates"; */
            sessionStorage["lastname"] = "Gates";
            document.getElementById("result").innerHTML = localStorage.getItem("firstname") + " " + sessionStorage.getItem("lastname");
        } else {
            document.getElementById("result").innerHTML = "抱歉!您的浏览器不支持 Web Storage ...";
        }
        // localStorage 计数功能, 关闭浏览器数据不丢失
        if (localStorage.pagecount) {   
            localStorage.pagecount=Number(localStorage.pagecount) +1;  // 建立的是 String 类型
        }
        else {    // 如果没有该对象属性, 则创建
            localStorage.pagecount=1;
        }
            document.write("Visits "+ localStorage.pagecount + " time(s).");
        // sessionStorage 方法与 localStorage 用法相同
    </script>

result.png

[5] Input输入类型

  • email, url, number, range, (date, month, week, time, datetime, datetime-local), color, search
代码语言:javascript
复制
    <form action="" method="get">
        Email: <input type="email" name="email" />
        <!-- numner 出现 1~10 的选择框, 和 range 用法相同 (会出现滑动条); step 属性规定合法的数字间隔, 只能选择 1、4、7、10 -->
        Points: <input type="number" name="point" min="1" max="10" step="3" />   <!-- 规定了 name 属性后点击提交, 值会出现在 url 框中 -->
        Date: <input type="date" name="date" />
        Time: <input type="time" name="time" />
        DateTime: <input type="datetime-local" name="datetime-local" /> <!-- 设置日期加时间 (本地时间) -->
        Color: <input type="color" name="color" value="#ff00ff" />  <!-- 默认在输入框中为黑色 -->
        <input type="submit" /> 
    </form>

result.png

[6] 表单类型

  • datalist (下拉框), keygen (公钥和密钥), output (输出框)
代码语言:javascript
复制
    Webpage: <input type="url" list="url_list" name="link" />  <!-- 必须通过 input 的 list 属性引用 datalist 标签的 id -->
    <datalist id="url_list">  
        <option label="W3School" value="http://www.W3School.com.cn" />  <!-- [注] 与 select 中的 option 用法不一样 (select 中 option 要闭合) -->
        <option label="Google" value="http://www.google.com" />
        <option label="Microsoft" value="http://www.microsoft.com" />
    </datalist>

datalist应用.png

[7] 表单属性

  • placeholder, multiple, autofocus, required, pattern, form
代码语言:javascript
复制
    <!-- input 属性 -->
    期待输入(灰色): <input type="search" name="user_search"  placeholder="Search W3School" /> <br>
    多文件上传: <input type="file" name="mulfile" multiple="multiple" /> <br>
    自动获焦: <input type="text" name="user_name"  autofocus="autofocus" /> <br>
    必填字段: <input type="text" name="usr_name" required="required" /> <br>
    正则判断: <input type="text" name="country_code" pattern="[A-z]{3}" title="Three letter country code" /> <br> <!-- 出错会显示title信息 -->
    <!-- form 属性 -->
    <form action="" method="get" id="user_form">
        First name: <input type="text" name="fname" />
        <input type="submit" />
    </form>
    Last name: <input type="text" name="lname" form="user_form" />  <!-- 利用 input 的 form 属性引用表单的 id 使 input 仍然位于该表单之中 -->

result.png

[8] 地理定位 (geolocation)

代码语言:javascript
复制
    <p id="demo"> 点击这个按钮, 获得您的位置: </p>
    <button onclick="getLocation()">试一下</button>
    <div id="mapholder"></div>
    <script>
        var x=document.getElementById("demo");
        function getLocation() {
            if (navigator.geolocation) {
                /* 如果 getCurrentPosition() 运行成功, 则向参数 showPosition 中规定的函数返回一个 coordinates 对象 */
                navigator.geolocation.getCurrentPosition(showPosition,showError);  /* 参数为两个回调函数 (函数名, 不加括号) */
            }
            else{
                x.innerHTML="Geolocation is not supported by this browser.";
            }
        }
        function showPosition(position) {
            var latlon=position.coords.latitude+","+position.coords.longitude; /* 维度、经度*/
            var img_url="http://maps.googleapis.com/maps/api/staticmap?center="+latlon+"&zoom=14&size=400x300&sensor=false"; /* 谷歌地图 */
            document.getElementById("mapholder").innerHTML = "<imgsrc='"+img_url+"' />";  /* 将谷歌地图的链接加入图片的路径中 */
        }
        function showError(error) {
            switch(error.code) {
                case error.PERMISSION_DENIED:
                    x.innerHTML="User denied the request for Geolocation."
                break;
                case error.POSITION_UNAVAILABLE:
                    x.innerHTML="Location information is unavailable."
                break;
                case error.TIMEOUT:
                    x.innerHTML="The request to get user location timed out."
                break;
                case error.UNKNOWN_ERROR:
                    x.innerHTML="An unknown error occurred."
                break;
            }
        }
    </script>

获得地理位置.png

[9] Web Workers: Worker

  • Web Worker 是运行在后台的 JavaScript, 不会影响页面的性能
  • 由于 web worker 位于外部文件中, 它们无法访问下例 JavaScript 对象: window 对象, document 对象, parent 对象
  • 需要跨域访问, 故在本地不能运行 (上传至服务器即可查看下面代码的运行效果)
代码语言:javascript
复制
    Count numbers: <output id="res"></output><br>
    <button onclick="startWorker()">Start Worker</button>
    <button onclick="stopWorker()">Stop Worker</button>
    <br />
    <script>
        var w;
        function startWorker() {
            if(typeof Worker !== "undefined") {
                if(typeof w =="undefined") {
                    w=new Worker("js/timeCount.js");  /* 创建 Worker 对象 */
                    // w.postMessage("hello");     /* 向worker发送数据, 模拟双线程 */
                    w.onmessage = function (evt) {   /* 当 web worker 传递消息时,会执行事件监听器中的代码 */
                        document.getElementById("res").innerHTML=evt.data; /* 从 timeCount.js 收到的数据*/
                    /* [注] event可传参,也可以不传参 */
                    };
                }
            }
            else {
                document.getElementById("res").innerHTML="Sorry, your browser does not support Web Workers..."; 
            }
        }
        function stopWorker() { 
            w.terminate();  /* 终止 web worker, 并释放浏览器/计算机资源, 请调用 terminate() 方法 */
        }
    </script>
  • js/timeCount.js文件
代码语言:javascript
复制
var i=0;
function timeCount() {
    i=i+1;
    postMessage(i);   /* postMessage() 方法向主线程发送数据 */
    setTimeout(timeCount,500);  /* 或 setTimeout("timeCount()",500); */
    timeCount();
}
timeCount();  /* 一定要调用函数执行 */

// 模拟双线程的用法

// onmessage = function (evt){
//   var p = evt.data;  //通过evt.data获得发送来的数据
//   var r = p + " world!!!";
//   postMessage(r);  //将获取到的数据加工后发送回主线程
// }

result.png

[10] 服务器发送事件 EventSource

  • HTML5 服务器发送事件 (server-sent event) 允许网页获得来自服务器的更新
代码语言:javascript
复制
    <div id="resu"></div>  <!-- id 不能和前面例子的 id 相同 -->
    <script>
        if(typeof EventSource !=="undefined") {
            var source=new EventSource("php/server.php");  /* 创建 EventSource 对象 */
            source.onmessage=function(event) {
                document.getElementById("resu").innerHTML += event.data + "<br />";  /* 获得 php/server.php 发来的数据 */
            };
        }
        else {
            document.getElementById("resu").innerHTML = "抱歉,您的浏览器不支持 server-sent 事件 ...";
        }
    </script>
  • php/server.php 文件
代码语言:javascript
复制
<?php
    header('Content-Type: text/event-stream');  /* 把报头 "Content-Type" 设置为 "text/event-stream" */
    header('Cache-Control: no-cache');  /* 规定不对页面进行缓存 */

    $time = date('r');
    echo "data: The server time is: ".$time."\n\n";  /* 格式不能变, 以 data: 开头 (data: 不输出), 最后跟两个回车 (回车用 \n, 用 <br> 不通过) */
    flush();
?>

result.png

欢迎指正错误和补充!
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.04.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本章的主要内容有:
  • [1] 用于媒体回放的 video 和audio 元素
  • [2] HTML5拖放
  • [3] canvas简单应用
  • [4] Web存储: localStorage 和 SessionStorage
  • [5] Input输入类型
  • [6] 表单类型
  • [7] 表单属性
  • [8] 地理定位 (geolocation)
  • [9] Web Workers: Worker
  • [10] 服务器发送事件 EventSource
    • 欢迎指正错误和补充!
    相关产品与服务
    数据保险箱
    数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档