#JavaScript在HTML5中的应用


HTML5绘图的应用

Canvas API提供了基本的绘图功能,并支持创建文本、直线、曲线、多边形和椭圆,且可以设置其边框的颜色和填充色。下面的例子用JavaSriptCanvas创建了一个在商业报表中常见的直方图,如图所示。其代码如下:

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta name="viewport" content="width=device-width;inital-scale=1.0;maxium-scale=1.0;user-scalable=0;"/>
<title>HTML5报表</title>
<script type="text/javascript">
    function graph(report,maxWidth,maxHeight){
        var data=report.values;
        var canvas=document.getElementById("graph");
        var axisBuffer=20;
        canvas.height=maxHeight+100;
        canvas.width=maxWidth;
        var ctx=canvas.getContext("2d");
        var width=50;
        var buffer=20;
        var i=0;
        var x=buffer+axisBuffer;
        ctx.font="bold 12px 宋体";
        ctx.textAlign="start";
        for(i=0;i<data.length;i++){
            ctx.fillStyle="rgba(0,0,200,0.9)"
            ctx.fillRect(x,maxHeight-(data[i][report.y]/2),width,(data[i][report.y]/2));
            ctx.fillStyle="rgba(0,0,0,0.9)"
            ctx.fillText(data[i][report.x],x+(width/4),maxHeight+15);
            x+=width+buffer;
            }
            //draw the horizontal axis
            ctx.moveTo(axisBuffer,maxHeight);
            ctx.lineTo(axisBuffer+maxWidth,maxHeight);
            ctx.strokeStyle="black";
            ctx.stroke();
            //draw the vertical axis
            ctx.moveTo(axisBuffer,0);
            ctx.lineTo(axisBuffer,maxHeight);
            ctx.stroke();
            //draw gridlines
            var lineSpacing=50;
            var numLines=maxHeight/lineSpacing;
            var y=lineSpacing;
            ctx.font="10px 宋体";
            ctx.textBaseline="middle";
            for(i+0;i<numLines;i++){
                ctx.strokeStyle="rgba(0,0,0,0.25)";
                ctx.moveTo(axisBuffer,y);
                ctx.lineTo(axisBuffer+maxWidth,y);
                ctx.stroke();
                ctx.fillStyle="rgba(0,0,0,0.75)";
                ctx.fillText(""+(2*(maxHeight-y)),0,y);
                y+=lineSpacing;
                }
        }
            function init(){    
            var data=[{year:"2010年",sales:50},
            {year:"2011年",sales:150},
            {year:"2012年",sales:300},
            {year:"2013年",sales:400}];
            var report={
                x:"year",
                y:"sales",
                values:data
                };
                graph(report,350,300);
                }
                </script>
</head>

<body onload="init()">
    <canvas id="graph"></canvas>
</body>
</html>
Canvas创建的直方图

在创建的graph函数中,我们获取这个图形所需要的Canvas对象,并设置画布的宽度和高度,然后通过循环访问data数组获得相应的数据,并绘出柱状图。

在代码中,使用rgba函数设置颜色及alpha值,颜色包括红(R),绿(G),蓝(B),而alpha值则是颜色的透明度(代码中为0.9,即90%)。

使用fillRect函数创建柱状图,函数的参数为矩形的起点(x,y),高度和宽度:使用lineTo函数和stroke函数从当前点到指定点之间绘制一条直线。

HTM5本地储存的应用

传统的HTML使用cookie作为本地储存(浏览器储存)的方式。通过cookie可以保存用户访问网站的信息,如个人资料等。每个cookie的格式都是“键/值对”(或称为“名称/值对”),即<cookie名>=<值>,名称和值必须是合法的标示符。从Javascript的角度看,cookie就是一些字符串,可以通过document.cookie来读取或设置这些信息。由于cookie多用在客户端和服务器端之间进行通信,所以除了JavaScript以外,服务器端的语言(如 JSP)也可以读取cookie

使用cookie需要注意它的如下特性:

  • 每个cookie所存放的数据不能超过4KB。
  • cookie是以文件形式存放在客户端计算机中,对于客户端的用户来说,这些信息可以被查看或修改,因此,通常在cookie中不能存放与安全或隐私有关的重要信息。
  • cookie存在有效期。默认情况下,一个cookie的 生命周期就是在浏览器关闭的时候结束,如果想要cookie在浏览器关掉之后还能使用,就必须为该cookie设置有效期。
  • cookie通过域和路径来设置相应的访问控制通过域的设置防治不同域之间不能互相访问cookie信息(除非特别设置);通过路径的设置,使得一个网页所创建的cookie只能被同一目录下的其他网页访问。

下面代码介绍了如何设置和获取cookie的值。cookie的值可以由document.cookie直接获得,得到的将是以分号隔开的多个名称/值对所组成的字符串。代码如下:

<script tupe="text/Javascript">
    docunment.cookie="userId=828";
    document.cookie="userName=hulk";
    var strcookie=document.cookie;
    alert(strcookie);
<script>

应用cookie可以方便地存用户的信息,但它本身也有明显的缺陷和不足。例如:

  • 存储空间小,每个站点大小限制在4KB左右;
  • 有时间时限,需要设置失效时间;
  • 在请求网页的时候cookie会被附加在每个HTTP请求的header中,增加了流量;
  • HTTP请求中的cookie是明文传递的,具有安全隐患。

HTML5的新标准提供了比cookie更好的本地储存方案,主要包括四种:localStrongsessionStoragewebSQLindexDB

1.localStorage机制###

localStorage中保存的数据是以键值对作为数据结构,他的值可以存放最大5MB的字符串。localStorage的机制会把信息存到一个sqlite类型数据文件中,程序员可以通过sqlite打开文件并查看期中的表和数据。下面的代码展示了在localStorage中存放多个键值对的方法。

    var db=getLocalStorage();
    if(db){
        db.setItem('author','jasonling');
        db.setItem('company','Tecent');
        db.setItem('introduction','A code lover!');
    }

其中,if语句主要是为了判断浏览器是否支持localStorage机制。setItem函数设置了需要保存的名称和对应的值。下面的代码展示如何获取localStorage中的值以及如何删除键值对。

    //取值
    alert(localStorage['author']);
    alert(db.getItem('company'));
    //删除
    db.removeItem('company');
    //清除全部键值对
    db.clear();

需要说明的是:localStorage的数据可以在多个页面中共享,即不同的页面可以访问相同的数据。

2.sessionStorage机制###

localStorage机制不同,通过sessionStorage存储的数据只有当前页面可以访问。对与sessionStorage中键值对的增、删、改、查操作与localStorage的操作类似,代码如下:

    var db=getSessionStorage();
    if(db){
        db.srtItem('author','jasonling');
        db.setItem('company','Tecent');
        db.setItem('introduction','A code lover!');
    }    

限于篇幅,其他两种机制在本文中不作介绍
其他参考资料

  1. 前端储存方式
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 1. cookie 1.1 什么是cookie cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过...
    cbw100阅读 4,048评论 0 13
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    程序员poetry阅读 114,224评论 24 450
  • 常见试题 行内元素:会在水平方向排列,不能包含块级元素,设置width无效,height无效(可以设置line-h...
    他大舅啊阅读 2,416评论 1 5
  • 前些日子在忙着面试,拿了心仪的 offer 以后闲下来整理了一些面试相关的基本概念。由于很多关于代码细节的东西之前...
    faremax阅读 1,392评论 0 4
  • 不知道人生路该如何继续,没有到终点也没有回头路,我可以失去一切却换不回最初的我。 我以为我征服了自己,却不曾想过我...
    冰糖柠檬阅读 133评论 0 1