#JavaScript在HTML5中的應(yīng)用


HTML5繪圖的應(yīng)用

Canvas API提供了基本的繪圖功能,并支持創(chuàng)建文本、直線、曲線、多邊形和橢圓,且可以設(shè)置其邊框的顏色和填充色。下面的例子用JavaSriptCanvas創(chuàng)建了一個(gè)在商業(yè)報(bào)表中常見(jiàn)的直方圖,如圖所示。其代碼如下:

<!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報(bào)表</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創(chuàng)建的直方圖

在創(chuàng)建的graph函數(shù)中,我們獲取這個(gè)圖形所需要的Canvas對(duì)象,并設(shè)置畫(huà)布的寬度和高度,然后通過(guò)循環(huán)訪問(wèn)data數(shù)組獲得相應(yīng)的數(shù)據(jù),并繪出柱狀圖。

在代碼中,使用rgba函數(shù)設(shè)置顏色及alpha值,顏色包括紅(R),綠(G),藍(lán)(B),而alpha值則是顏色的透明度(代碼中為0.9,即90%)。

使用fillRect函數(shù)創(chuàng)建柱狀圖,函數(shù)的參數(shù)為矩形的起點(diǎn)(x,y),高度和寬度:使用lineTo函數(shù)和stroke函數(shù)從當(dāng)前點(diǎn)到指定點(diǎn)之間繪制一條直線。

HTM5本地儲(chǔ)存的應(yīng)用

傳統(tǒng)的HTML使用cookie作為本地儲(chǔ)存(瀏覽器儲(chǔ)存)的方式。通過(guò)cookie可以保存用戶訪問(wèn)網(wǎng)站的信息,如個(gè)人資料等。每個(gè)cookie的格式都是“鍵/值對(duì)”(或稱為“名稱/值對(duì)”),即<cookie名>=<值>,名稱和值必須是合法的標(biāo)示符。從Javascript的角度看,cookie就是一些字符串,可以通過(guò)document.cookie來(lái)讀取或設(shè)置這些信息。由于cookie多用在客戶端和服務(wù)器端之間進(jìn)行通信,所以除了JavaScript以外,服務(wù)器端的語(yǔ)言(如 JSP)也可以讀取cookie。

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

  • 每個(gè)cookie所存放的數(shù)據(jù)不能超過(guò)4KB。
  • cookie是以文件形式存放在客戶端計(jì)算機(jī)中,對(duì)于客戶端的用戶來(lái)說(shuō),這些信息可以被查看或修改,因此,通常在cookie中不能存放與安全或隱私有關(guān)的重要信息。
  • cookie存在有效期。默認(rèn)情況下,一個(gè)cookie的 生命周期就是在瀏覽器關(guān)閉的時(shí)候結(jié)束,如果想要cookie在瀏覽器關(guān)掉之后還能使用,就必須為該cookie設(shè)置有效期。
  • cookie通過(guò)域和路徑來(lái)設(shè)置相應(yīng)的訪問(wèn)控制通過(guò)域的設(shè)置防治不同域之間不能互相訪問(wèn)cookie信息(除非特別設(shè)置);通過(guò)路徑的設(shè)置,使得一個(gè)網(wǎng)頁(yè)所創(chuàng)建的cookie只能被同一目錄下的其他網(wǎng)頁(yè)訪問(wèn)。

下面代碼介紹了如何設(shè)置和獲取cookie的值。cookie的值可以由document.cookie直接獲得,得到的將是以分號(hào)隔開(kāi)的多個(gè)名稱/值對(duì)所組成的字符串。代碼如下:

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

應(yīng)用cookie可以方便地存用戶的信息,但它本身也有明顯的缺陷和不足。例如:

  • 存儲(chǔ)空間小,每個(gè)站點(diǎn)大小限制在4KB左右;
  • 有時(shí)間時(shí)限,需要設(shè)置失效時(shí)間;
  • 在請(qǐng)求網(wǎng)頁(yè)的時(shí)候cookie會(huì)被附加在每個(gè)HTTP請(qǐng)求的header中,增加了流量;
  • HTTP請(qǐng)求中的cookie是明文傳遞的,具有安全隱患。

HTML5的新標(biāo)準(zhǔn)提供了比cookie更好的本地儲(chǔ)存方案,主要包括四種:localStrong、sessionStorage、webSQLindexDB。

1.localStorage機(jī)制###

localStorage中保存的數(shù)據(jù)是以鍵值對(duì)作為數(shù)據(jù)結(jié)構(gòu),他的值可以存放最大5MB的字符串。localStorage的機(jī)制會(huì)把信息存到一個(gè)sqlite類(lèi)型數(shù)據(jù)文件中,程序員可以通過(guò)sqlite打開(kāi)文件并查看期中的表和數(shù)據(jù)。下面的代碼展示了在localStorage中存放多個(gè)鍵值對(duì)的方法。

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

其中,if語(yǔ)句主要是為了判斷瀏覽器是否支持localStorage機(jī)制。setItem函數(shù)設(shè)置了需要保存的名稱和對(duì)應(yīng)的值。下面的代碼展示如何獲取localStorage中的值以及如何刪除鍵值對(duì)。

    //取值
    alert(localStorage['author']);
    alert(db.getItem('company'));
    //刪除
    db.removeItem('company');
    //清除全部鍵值對(duì)
    db.clear();

需要說(shuō)明的是:localStorage的數(shù)據(jù)可以在多個(gè)頁(yè)面中共享,即不同的頁(yè)面可以訪問(wèn)相同的數(shù)據(jù)。

2.sessionStorage機(jī)制###

localStorage機(jī)制不同,通過(guò)sessionStorage存儲(chǔ)的數(shù)據(jù)只有當(dāng)前頁(yè)面可以訪問(wèn)。對(duì)與sessionStorage中鍵值對(duì)的增、刪、改、查操作與localStorage的操作類(lèi)似,代碼如下:

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

限于篇幅,其他兩種機(jī)制在本文中不作介紹
其他參考資料

  1. 前端儲(chǔ)存方式
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. cookie 1.1 什么是cookie cookie 是存儲(chǔ)于訪問(wèn)者的計(jì)算機(jī)中的變量。每當(dāng)同一臺(tái)計(jì)算機(jī)通過(guò)...
    cbw100閱讀 4,195評(píng)論 0 13
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    前端進(jìn)階之旅閱讀 115,566評(píng)論 24 450
  • 常見(jiàn)試題 行內(nèi)元素:會(huì)在水平方向排列,不能包含塊級(jí)元素,設(shè)置width無(wú)效,height無(wú)效(可以設(shè)置line-h...
    他大舅啊閱讀 2,622評(píng)論 1 5
  • 前些日子在忙著面試,拿了心儀的 offer 以后閑下來(lái)整理了一些面試相關(guān)的基本概念。由于很多關(guān)于代碼細(xì)節(jié)的東西之前...
    faremax閱讀 1,484評(píng)論 0 4
  • 不知道人生路該如何繼續(xù),沒(méi)有到終點(diǎn)也沒(méi)有回頭路,我可以失去一切卻換不回最初的我。 我以為我征服了自己,卻不曾想過(guò)我...
    冰糖檸檬閱讀 199評(píng)論 0 1

友情鏈接更多精彩內(nèi)容