国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

手把手教你做超酷的條形碼效果

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 20:36:42
文檔

手把手教你做超酷的條形碼效果

手把手教你做超酷的條形碼效果:聲明:1.這篇文章教你在web頁面上實(shí)現(xiàn)條形碼效果,體現(xiàn)的是利用網(wǎng)頁制作技術(shù)綜合解決問題的思路。旨在使對(duì)HTML, JavaScript,PhotoShop具有入門級(jí)水平的人鞏固入門級(jí)水平。2.若有問題不能及時(shí)回復(fù),麻煩請(qǐng)擔(dān)待,不勝感激。3.高手免進(jìn)。制作條形碼總共分幾步
推薦度:
導(dǎo)讀手把手教你做超酷的條形碼效果:聲明:1.這篇文章教你在web頁面上實(shí)現(xiàn)條形碼效果,體現(xiàn)的是利用網(wǎng)頁制作技術(shù)綜合解決問題的思路。旨在使對(duì)HTML, JavaScript,PhotoShop具有入門級(jí)水平的人鞏固入門級(jí)水平。2.若有問題不能及時(shí)回復(fù),麻煩請(qǐng)擔(dān)待,不勝感激。3.高手免進(jìn)。制作條形碼總共分幾步
聲明:
1.這篇文章教你在web頁面上實(shí)現(xiàn)條形碼效果,體現(xiàn)的是利用網(wǎng)頁制作技術(shù)綜合解決問題的思路。旨在使對(duì)HTML, JavaScript,PhotoShop具有入門級(jí)水平的人鞏固入門級(jí)水平。
2.若有問題不能及時(shí)回復(fù),麻煩請(qǐng)擔(dān)待,不勝感激。
3.高手免進(jìn)。

制作條形碼總共分幾步?
第一步,把冰箱門兒打開——使用PhotoShop繪制小圖片

我們需要制作出一個(gè)含有16個(gè)元素的條形碼圖片。

首先打開Photoshop,本篇教程中使用的是CS 簡體中文 版本,僅就本教程所涉及的方面來看,操作都大同小異,只要認(rèn)真閱讀,應(yīng)該不會(huì)遇到問題。


  • 打開以后首先按Ctrl + N,建一個(gè) 8像素 X 8像素的圖片,背景選擇透明,如圖所示:

  • 為了看清楚,可以把圖片縮放到最大 1600%。

  • 按一下D,再按一下X,確保前景色為白色背景色為黑色。

  • 使用Ctrl+Delele,填充背景色,黑色。

  • 使用鉛筆筆工具,參數(shù)做如下設(shè)置

  • 刻畫線條,隔一列畫一個(gè)。畫成下面這種效果:

  • 將圖層1拖動(dòng)到下面的新建按鈕上復(fù)制一下

  • 選擇 圖層1 副本,將左邊第一道白色用鉛筆工具涂成黑色(可以按 X 將前景色變成黑色)。如下圖所示:

  • 選擇 圖層1 ,按Ctrl+A,再按 Ctrl + C,然后選擇菜單命令圖像=畫布大小, 將寬度調(diào)整為16個(gè)像素,點(diǎn)中 定位 的最左邊中間的小塊,如下圖所示:

  • 選擇 圖層1 副本。按住Ctrl鍵,左鍵單擊圖層面板上的 圖層1 副本 條目以選擇 圖層1 副本 的選區(qū)。按Ctrl + Shift + I 反選(這一系列也可以用魔術(shù)棒操作,選擇透明部分就可以了)。按Ctrl + V 粘貼成 圖層2。

  • 關(guān)閉 圖層1 和 圖層1 副本 的可見性(左鍵點(diǎn)擊小眼睛圖標(biāo)),選擇圖層2,將左邊第二道白色用鉛筆工具涂成黑色。如下圖所示:

  • 打開 圖層1副本 的可見性,確保選擇了圖層2,按Ctrl + E 向下合并。

  • 打開 圖層1 的可見性,按住Ctrl鍵,左鍵單擊圖層面板上的 圖層1 條目以選擇 圖層1 的選區(qū)。復(fù)制并擴(kuò)大畫布,按前面所述的方法繼續(xù)繪制。在寬度為24,32的時(shí)候再做兩次,分別把 圖層1 模式(pattern)的第三和第四條白色涂成黑色。最后的結(jié)果如下圖所示:
    Click here to open new window
CTRL+Mouse wheel to zoom in/out

  • 接下來還需要拓寬,方法是一樣的,只不過這次的模式變換的方案是把相鄰兩個(gè)白色之間的黑色涂成白色。比如第五次拓展,其模式是這個(gè)樣子:

  • 再做幾次后,等寬度為 64 時(shí),畫布看起來應(yīng)該是這個(gè)樣子的:

  • 接下來仍然需要拓寬,思想是刪掉相鄰兩個(gè)白色條(注意,可以認(rèn)為第4個(gè)白條和第一個(gè)白條是相鄰的),于是再做4次的效果是這樣的:

  • 還差32個(gè)像素就完成了,還需再拓寬,這次是填充兩個(gè)相鄰黑色條為白色條,最后效果如下:

  • 圖層1 可以不要了,刪掉即可。

  • 接下來我們要去掉黑色的部分,使其透明。使用魔棒工具,將選項(xiàng)做如下設(shè)置:

    選擇以后,按delete鍵刪除,則整個(gè)畫布變成如下形式:

    似乎亂七八糟,是PS對(duì)透明背景表達(dá)的問題,只要保證步驟對(duì)了,做成這個(gè)效果就行了。

  • 大功告成選擇文件 -- 另存為,類型選擇為 gif, 可以起名叫 barcode.gif,在下下面的對(duì)話框中,透明這一項(xiàng)一定要選中。 找個(gè)合適的地方放好。

  • 于是冰箱門打開了,如果你做出的不是這個(gè)樣子,用我這個(gè)做好的就行了,免得大象裝不進(jìn)去。


  • 第二步,把大象裝進(jìn)去——代碼分析
    我們的目標(biāo)是把一個(gè)字符串轉(zhuǎn)化為一個(gè)條形碼顯示在頁面上。那么一個(gè)字符串如何對(duì)應(yīng)出一個(gè)條形碼呢?上面做個(gè)128X8的圖片到底是要扯什么蛋?

    我們可以考慮數(shù)據(jù)在存儲(chǔ)器中的最基本儲(chǔ)存單位——字節(jié)(byte) 一個(gè)字節(jié)是八位(bit)。一個(gè)8位二進(jìn)制數(shù)可以通過一個(gè)2位的十六進(jìn)制數(shù)表示,表示為 00 - FF。剛才提到了一個(gè)16,注意到了嗎?

    如何把一個(gè)字符串轉(zhuǎn)換成字節(jié)表示呢?似乎不能直接表示,但是J(ava)script 中的字符串有一個(gè)charCodeAt()方法。我們知道單字節(jié)若表示整數(shù),其范圍是 0 -255,雙字節(jié)若表

    示正整數(shù),范圍是 0 - 65535。charCodeAt()方法返回的是一個(gè)字符的Unicode表示,這種Unicode方案中,中文是兩個(gè)字節(jié)的,英文是一個(gè)字節(jié)的。所以對(duì)于一個(gè)英文字符它總是返回0 - 255 之間的正整數(shù),對(duì)于一個(gè)中文字符,它總是返回 255 - 65535 之間的正整數(shù)(非精確范圍)。

    再講一下位運(yùn)算的知識(shí)吧,節(jié)選自微軟的Jscript腳本參考手冊(cè):


  • 對(duì)于與運(yùn)算。 &運(yùn)算符查看兩個(gè)表達(dá)式的二進(jìn)制表示法的值,并執(zhí)行按位“與”操作。該操作的結(jié)果如下所示:

    0101 (expression1)
    1100 (expression2)
    ----
    0100 (result)
    任何時(shí)候,只要兩個(gè)表達(dá)式的某位都為 1,則結(jié)果的該位為 1。否則,結(jié)果的該位為 0。

  • 對(duì)于移位運(yùn)算,比如右移運(yùn)算。expression1 >> expression2 中,>> 運(yùn)算符 把 expression1 的所有位向右移 expression2 指定的位數(shù)。expression1 的符號(hào)位被用來填充右移后左邊空出來的位。向右移出的位被丟棄。例如,下面的代碼被求值后,temp 的值是 -4:-14 (即二進(jìn)制的 11110010)右移兩位等于 -4 (即二進(jìn)制的 11111100)。


  • var temp
    temp = -14 >> 2
    注:32位整數(shù)類型的數(shù)據(jù)有符號(hào)位的問題,對(duì)于負(fù)數(shù),填充位為1,正數(shù)為0。我們通過charCodeAt()得到的數(shù)都是正數(shù),所以不用管這個(gè)問題。
    對(duì)于一個(gè)8位二進(jìn)制數(shù),與二進(jìn)制 11110000 相與,再右移4位,則可以得到它的最左四位。
    直接與 1111 相與,則可以得到他的右邊四位。
    準(zhǔn)備知識(shí)了解這么多夠了,下面讓我開始實(shí)踐編碼。
    說,要有一個(gè)字符串,于是就有了個(gè)字符串。
    var strTest = "dknt沒有任何含義";
    我們就是要把這個(gè)字符串轉(zhuǎn)化為一個(gè)條形碼。
    我們要獲得它的二進(jìn)制表示,那我們就建一個(gè)函數(shù)來獲得它的二進(jìn)制表示。比如 getBinary();

    <script> 
    function getBinary(sText){ 
     alert(sText); 
    }; 
    var strTest = "dknt沒有任何含義"; 
    getBinary(strTest ); 
    </script>

    提示:您可以先修改部分代碼再運(yùn)行
    為了獲得二進(jìn)制表示,我們要一個(gè)字符一個(gè)字符的進(jìn)行,不能著急,首先要獲得每個(gè)字符對(duì)應(yīng)的Unicode編碼。

    <script> 
    function getBinary(sText){ 
     for(var i = 0; i < sText.length; i++){ 
     alert( sText.charCodeAt( i ) ); 
     } 
    }; 
    var strTest = "dknt沒有任何含義"; 
    getBinary(strTest ); 
    </script>

    大于 255 的顯然是占用兩個(gè)字節(jié)的字符。要想辦法分成單一字節(jié)的兩個(gè)數(shù)據(jù),以使程序流易于自動(dòng)化一些。可以使用雙字節(jié)數(shù)值與 二進(jìn)制 1111111100000000 相與再右移8位來獲得第一個(gè)字節(jié)。直接與11111111相與就可以得到第二個(gè)字節(jié)的數(shù)據(jù)。使用十六進(jìn)制數(shù)可能更方便一點(diǎn)。1111111100000000 的十六進(jìn)制表示為 FF00。11111111顯然就是 FF了。
    J(ava)script中,用0x前綴表示十六進(jìn)制數(shù)。我們可以實(shí)踐一下下面的代碼。

    <script> 
    function getBinary(sText){ 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     alert( (iDecimalUnicode & 0xFF00) >> 8); 
     alert( iDecimalUnicode & 0xFF ); 
     }else{ 
     alert( iDecimalUnicode ); 
     } 
     } 
    }; 
    var strTest = "dknt沒有任何含義"; 
    getBinary(strTest ); 
    </script>

    可以看到現(xiàn)在每個(gè)數(shù)都是小于255的了。
    注意,(iDecimalUnicode & 0xFF00) >> 8 中,>> 的優(yōu)先級(jí)比 & 高,所以按照我們的目的,(iDecimalUnicode & 0xFF00) 一定要有括號(hào)。
    我們希望能有個(gè)統(tǒng)一的處理邏輯,把每個(gè)字節(jié)分成兩部分,每個(gè)部分用十六進(jìn)制的1位就可以表示,換句話說,就是每部分都是一個(gè)不超過16的十進(jìn)制數(shù)。類似Ruby中的代碼段數(shù)據(jù)類型,在J(ava)script中,也可以用匿名函數(shù)來實(shí)現(xiàn)類似的功能。我們可以建一個(gè)名為tmpOP變量來承接這個(gè)匿名函數(shù),然后利用它來簡化程序邏輯。此外,我們應(yīng)該有個(gè)東西來儲(chǔ)存分解出來的結(jié)果。那就用個(gè)result數(shù)組來裝吧。另外按照語義,我們這個(gè)函數(shù)做的已經(jīng)不僅僅是轉(zhuǎn)化二進(jìn)制了,而是轉(zhuǎn)化成意義上的十六進(jìn)制位了。我們應(yīng)該是恨敏捷的,所以把函數(shù)名改成getHexes吧。

    <script> 
    function getHexes(sText){ 
     var aResult = []; 
     var tmpOP = function(iByte){ 
     aResult.push( (iByte & 0xF0) >> 4 ); 
     aResult.push( iByte & 0xF ); 
     }; 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     tmpOP( (iDecimalUnicode & 0xFF00) >> 8); 
     tmpOP( iDecimalUnicode & 0xFF ); 
     }else{ 
     tmpOP( iDecimalUnicode ); 
     } 
     } 
     alert(aResult); 
    }; 
    var strTest = "dknt沒有任何含義"; 
    getHexes(strTest ); 
    </script>

    很高興看到現(xiàn)在就彈出一個(gè)alert吧,剛才那么多alert是很鬧心。我很抱歉。這次因?yàn)槲覀兪褂昧薬lert一個(gè)數(shù)組,感覺整齊一點(diǎn)。
    現(xiàn)在發(fā)現(xiàn)數(shù)組的每一個(gè)元素都是小于16了吧,很好,大象快裝進(jìn)去了。

    有一個(gè)問題,我們不能把字符串的每個(gè)字符都轉(zhuǎn)化成條形碼,若是一個(gè)1萬多字的文章怎么辦,那不扯呢嗎。所以我們要限制一下處理的字符數(shù)。以條形碼的視點(diǎn)來看,似乎寬度應(yīng)該是固定的,也就是說我們用以對(duì)應(yīng)的 aResult 數(shù)組的長度應(yīng)該是固定的。那也好辦,在我們的 tmpOP 里控制一下就行了。我們可以假設(shè)我們只需要8個(gè)十六進(jìn)制位來生成條形碼。可以在getHexes里加一個(gè) iMaxLength 參數(shù)來控制。
    如下:

    <script> 
    function getHexes(sText, iMaxLength){ 
     var aResult = []; 
     var tmpOP = function(iByte){ 
     aResult.push( (iByte & 0xF0) >> 4 ); 
     if( aResult.length > iMaxLength ) return 0; 
     aResult.push( iByte & 0xF ); 
     if( aResult.length > iMaxLength ) return 0; 
     return 1; 
     }; 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     if( !tmpOP( (iDecimalUnicode & 0xFF00) >> 8) ) break;; 
     if( !tmpOP( iDecimalUnicode & 0xFF ) ) break; 
     }else{ 
     if( !tmpOP( iDecimalUnicode ) ) break; 
     } 
     } 
     alert(aResult); 
    }; 
    var strTest = "dknt沒有任何含義"; 
    var iWidth = 8; 
    getHexes(strTest, iWidth); 
    </script>

    現(xiàn)在確實(shí)只有8個(gè)小于16的數(shù)了。

    在 tmpOP 中,發(fā)現(xiàn) aResult 數(shù)組的長度超過最大值,就返回一個(gè)0,外面發(fā)現(xiàn)這個(gè)0以后,就直接退出循環(huán),因?yàn)闆]有必要再繼續(xù)往下取字符了。

    有些地方略顯不妥,本著精益求精的精神,我們要把我們的程序效率提高提高。首先,我們知道了位相與的目的,就可以寫一些更直接處理的代碼,因?yàn)槲覀儼烟幚黼p字節(jié)時(shí),為了分成兩個(gè)單字節(jié),實(shí)際上多與運(yùn)算了一次,和后面的分解雙十六進(jìn)制位有重復(fù)的位相與。說俗了就是多干了一次沒用的事。不如一次就分解出4個(gè)十六進(jìn)制位。

    此外,我們總是向數(shù)組詢問length屬性來獲知數(shù)組長度,要知道數(shù)組做這件事是很累的,反正我們也有條件自己心理有數(shù),為什么還要總問它呢。

    基于這兩點(diǎn),我們把程序改動(dòng)如下:

    <script> 
    function getHexes(sText, iMaxLength){ 
     var aResult = [], aPos=[0xF, 0xF0, 0xF00, 0xF000], iLength = 0; 
     var tmpOP = function(iByte, iPos){ 
     aResult.push( (iByte & aPos[iPos]) >> iPos * 4 ); 
     iLength++ 
     if( iLength == iMaxLength ) return 0; 
     return 1; 
     }; 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     if( !tmpOP( iDecimalUnicode , 3) ) break;; 
     if( !tmpOP( iDecimalUnicode , 2) ) break; 
     if( !tmpOP( iDecimalUnicode , 1) ) break; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     }else{ 
     if( !tmpOP( iDecimalUnicode , 1) ) break;; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     } 
     } 
     alert(aResult); 
    }; 
    var strTest = "dknt沒有任何含義"; 
    var iWidth = 8; 
    getHexes(strTest, iWidth); 
    </script>

    看到了效果跟上一個(gè)是一樣的,說明我們沒改錯(cuò)。其中,aPos數(shù)組就可以儲(chǔ)存掩碼,數(shù)組的索引 X 4 就是需要右移的位數(shù)。tmpOP( iDecimalUnicode , i) 就表示取 iDecimalUnicode 從右邊數(shù)第i個(gè)十六進(jìn)制位(第0個(gè)就是最右邊的1個(gè)十六進(jìn)制位)。

    大象是勉勉強(qiáng)強(qiáng)塞進(jìn)去了,下面我們就把活做的利索點(diǎn),把冰箱門兒帶上。要不條形碼還沒露面,我們?cè)趺词請(qǐng)觯?

    第三步,把冰箱門兒帶上——封裝和測試用例
    接下來的工作重點(diǎn)就是要把條形碼做出來。為了測試效果,我們還需要一個(gè)用戶界面。
    皮之不存,毛之焉附,首先做一個(gè)界面。隨便做一個(gè)普通頁面就行了。然后在上面安放一個(gè)文本框,一個(gè)觸發(fā)按鈕,一個(gè)條形碼顯示區(qū)域。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Barcode Test Case</title> 
    </head> 
    <body> 
    <p style="float:left;"> 
     <input type="text" /> <input type="button" value="Generate"/> 
    </p> 
    <p style="float:left;"></p> 
    </body> 
    </html>

    我們需要把大象移植過來,加在我們的界面上,此外我們還需要讓按鈕能觸發(fā)getHexes函數(shù),那就加一個(gè) onclick方法吧。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Barcode Test Case</title> 
    <script> 
    function getHexes(sText, iMaxLength){ 
     var aResult = [], aPos=[0xF, 0xF0, 0xF00, 0xF000], iLength = 0; 
     var tmpOP = function(iByte, iPos){ 
     aResult.push( (iByte & aPos[iPos]) >> iPos * 4 ); 
     iLength++ 
     if( iLength == iMaxLength ) return 0; 
     return 1; 
     }; 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     if( !tmpOP( iDecimalUnicode , 3) ) break;; 
     if( !tmpOP( iDecimalUnicode , 2) ) break; 
     if( !tmpOP( iDecimalUnicode , 1) ) break; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     }else{ 
     if( !tmpOP( iDecimalUnicode , 1) ) break;; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     } 
     } 
     alert(aResult); 
    }; 
    var strTest = "dknt沒有任何含義"; 
    var iWidth = 8; 
    </script> 
    </head> 
    <body> 
    <div style="float:left;"> 
     <input type="text" /> <input type="button" value="Generate" onclick="getHexes(strTest, iWidth)"/> 
    </div> 
    <div style="float:left;"></div> 
    </body> 
    </html>

    點(diǎn)擊Generate按鈕可以發(fā)現(xiàn),我們之前的程序邏輯仍然生效。說明移植成功。

    問題很大,getHexes始終操作的是一個(gè)固定的變量值,怎么讓它能操作界面上的值呢?可以操作DOM來獲取界面上的值。要使用DOM來操作,最簡單的方法就是給所關(guān)注的元素上添加 id 屬性。此外在 iWidth 這個(gè)變量在我們的界面中沒有接口,看來是忘了,不過這個(gè)忘了很正常,當(dāng)初根據(jù)我們的界面設(shè)計(jì)語義本來就沒有這個(gè)內(nèi)容。我們確實(shí)很敏捷,馬上添加上去就行了。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Barcode Test Case</title> 
    <script> 
    function getHexes(sText, iMaxLength){ 
     var aResult = [], aPos=[0xF, 0xF0, 0xF00, 0xF000], iLength = 0; 
     var tmpOP = function(iByte, iPos){ 
     aResult.push( (iByte & aPos[iPos]) >> iPos * 4 ); 
     iLength++ 
     if( iLength == iMaxLength ) return 0; 
     return 1; 
     }; 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     if( !tmpOP( iDecimalUnicode , 3) ) break;; 
     if( !tmpOP( iDecimalUnicode , 2) ) break; 
     if( !tmpOP( iDecimalUnicode , 1) ) break; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     }else{ 
     if( !tmpOP( iDecimalUnicode , 1) ) break;; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     } 
     } 
     alert(aResult); 
    }; 
    </script> 
    </head> 
    <body> 
    <div style="float:left;"> 
     <div style="float:left; width:70px; font-size:18px;line-height:25px; font-family:Arial"> 
     Text:
     
     Width: 
     </div> 
     <div style="float:left;"> 
     <input id="text" type="text" value="dknt沒有任何含義" />
     
     <input id="width" type="text" value="8"/></div> 
     <div style="float:left;margin-left:20px"> 
     <input type="button" value="Generate" onclick="getHexes(document.getElementById('text').value, parseInt( document.getElementById 
    ('width').value) )"/></div> 
    </div> 
    <div style="float:left;"></div> 
    </body>

    注意,我們已經(jīng)把<script /> 標(biāo)簽的
    var strTest = "dknt沒有任何含義";
    var iWidth = 8;
    兩句去掉了。因?yàn)樗麄兇_實(shí)沒有什么用了,我們已經(jīng)不從那里獲得數(shù)據(jù)了。
    這回,如果你改動(dòng)兩個(gè)文本框中的文字,將會(huì)看到另外一組十六進(jìn)制位。此外,我們覺得加一個(gè)對(duì)文本框的說明更好一些,所以就在前面加了個(gè)p.
    現(xiàn)在我們發(fā)現(xiàn)似乎把一大串字符寫在onlick里似乎有點(diǎn)不自然,如果將來邏輯更復(fù)雜了將很難維護(hù),不如就單建個(gè)函數(shù)專門負(fù)責(zé)此事。它也可以包含更復(fù)雜的調(diào)度邏輯。此外,我們對(duì)兩個(gè)文本框的類型沒有驗(yàn)證,如果輸入的不是我們想要的數(shù)據(jù)類型怎么辦?所以還要加上判斷邏輯。所以修改如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Barcode Test Case</title> 
    <script> 
    function getHexes(sText, iMaxLength){ 
     var aResult = [], aPos=[0xF, 0xF0, 0xF00, 0xF000], iLength = 0; 
     var tmpOP = function(iByte, iPos){ 
     aResult.push( (iByte & aPos[iPos]) >> iPos * 4 ); 
     iLength++ 
     if( iLength == iMaxLength ) return 0; 
     return 1; 
     }; 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     if( !tmpOP( iDecimalUnicode , 3) ) break;; 
     if( !tmpOP( iDecimalUnicode , 2) ) break; 
     if( !tmpOP( iDecimalUnicode , 1) ) break; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     }else{ 
     if( !tmpOP( iDecimalUnicode , 1) ) break;; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     } 
     } 
     alert(aResult); 
    }; 
    function GenerateBarCode(){ 
     var sText = document.getElementById('text').value, 
     iWidth = parseInt( document.getElementById('width').value ); 
     sText = sText.replace(/(^\s+|\s+$)/ig, ''); 
     iWidth = iWidth || 0; 
     if( iWidth > 20 || iWidth < 0) return false; 
     if(sText.length < iWidth ) return false; 
     
     getHexes(sText, iWidth) 
    } 
    </script> 
    </head> 
    <body> 
    <div style="float:left;"> 
     <div style="float:left; width:70px; font-size:18px;line-height:25px; font-family:Arial"> 
     Text:
     
     Width: 
     </div> 
     <div style="float:left;"> 
     <input id="text" type="text" value="dknt沒有任何含義" />
     
     <input id="width" type="text" value="8"/></div> 
     <div style="float:left;margin-left:20px"> 
     <input type="button" value="Generate" onclick="GenerateBarCode()"/></div> 
    </div> 
    <div style="float:left;"></div> 
    </body>

    GenerateBarCode 要去掉text左右的空格,然后還要檢查width是否是有效值(這里最大設(shè)為20,不過你可以隨便改,太大似乎就有點(diǎn)變態(tài)了)。

    然而我們的條形碼還是沒出來,但是我們已經(jīng)恨厭倦alert了,這次一定要讓getHexes返回一個(gè)數(shù)組給GenerateBarCode,然后讓GenerateBarCode進(jìn)行后續(xù)處理。

    <title>Barcode Test Case</title> 
    <script> 
    function getHexes(sText, iMaxLength){ 
     var aResult = [], aPos=[0xF, 0xF0, 0xF00, 0xF000], iLength = 0; 
     var tmpOP = function(iByte, iPos){ 
     aResult.push( (iByte & aPos[iPos]) >> iPos * 4 ); 
     iLength++ 
     if( iLength == iMaxLength ) return 0; 
     return 1; 
     }; 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     if( !tmpOP( iDecimalUnicode , 3) ) break;; 
     if( !tmpOP( iDecimalUnicode , 2) ) break; 
     if( !tmpOP( iDecimalUnicode , 1) ) break; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     }else{ 
     if( !tmpOP( iDecimalUnicode , 1) ) break;; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     } 
     } 
     return aResult ; 
    }; 
    function GenerateBarCode(){ 
     var sText = document.getElementById('text').value, 
     iWidth = parseInt( document.getElementById('width').value ); 
     sText = sText.replace(/(^\s+|\s+$)/ig, ''); 
     iWidth = iWidth || 0; 
     if( iWidth > 20 || iWidth < 1) return false; 
     
     var aHexes = getHexes(sText, iWidth), sDivString=''; 
     for (var i = 0; i < iWidth; i++){ 
     sDivString += "<div style=\"width:8px;height:8px;float:left;background-image:url("+gifURL+");background-position-x:"+(8 * aHexes[i]) 
    +"px\"></div>" 
     } 
     document.getElementById('BarCode_Field').innerHTML = sDivString; 
    } 
    var gifURL = "/upload/200742411119165.gif"; 
    </script> 
    </head> 
    <body> 
    <div style="float:left;"> 
     <div style="float:left; width:70px; font-size:18px;line-height:25px; font-family:Arial"> 
     Text:
     
     Width: 
     </div> 
     <div style="float:left;"> 
     <input id="text" type="text" value="dknt沒有任何含義" />
     
     <input id="width" type="text" value="8"/></div> 
     <div style="float:left;margin-left:20px"> 
     <input type="button" value="Generate" onclick="GenerateBarCode()"/></div> 
    </div> 
    <div id="BarCode_Field" style="float:left;margin-left:20px"></div> 
    </body>

    GenerateBarCode接到getHexes傳過來的數(shù)組以后開始使用其中的十六進(jìn)制位構(gòu)造DIV小單元。其中,我們用 background-image 來指明背景文件的位置,正好我剛才上傳了做好的gif文件,用gifURL保存它的位置。background-position-x表示背景圖片水平方向偏移,我們用十六進(jìn)制位(范圍是0-15) X 8 (即gif小單元的像素寬度) 正好就可以讓我們想要的gif小單元作為當(dāng)前div的背景了。這就是我們的gif為什么要做成那樣的原因。實(shí)際上,之所以要把所有的小單元放在一個(gè)圖片里,主要是為了節(jié)省I/O調(diào)用的次數(shù),提高效率。

    GenerateBarCode中的for循環(huán),終止條件是iWidth,以便讓sText補(bǔ)足iWidth位時(shí),也能顯示出 iWidth 位來,因?yàn)閿?shù)組空元素的默認(rèn)值可以返回0。

    我們給承接結(jié)果的div賦以id為BarCode_Field,將構(gòu)造好的HTML片段放在這個(gè)div中,頁面就可以呈現(xiàn)出條形碼了。

    然而似乎還是沒看到條形碼。那當(dāng)然了,我們的gif背景透明色已經(jīng)讓頁面的背景白色透過來了,白成一片了,當(dāng)然看不著。我們得改一下Body的背景顏色。如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Barcode Test Case</title> 
    <script> 
    function getHexes(sText, iMaxLength){ 
     var aResult = [], aPos=[0xF, 0xF0, 0xF00, 0xF000], iLength = 0; 
     var tmpOP = function(iByte, iPos){ 
     aResult.push( (iByte & aPos[iPos]) >> iPos * 4 ); 
     iLength++ 
     if( iLength == iMaxLength ) return 0; 
     return 1; 
     }; 
     for(var i = 0; i < sText.length; i++){ 
     var iDecimalUnicode =sText.charCodeAt( i ); 
     if( iDecimalUnicode > 255 ){ 
     if( !tmpOP( iDecimalUnicode , 3) ) break;; 
     if( !tmpOP( iDecimalUnicode , 2) ) break; 
     if( !tmpOP( iDecimalUnicode , 1) ) break; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     }else{ 
     if( !tmpOP( iDecimalUnicode , 1) ) break;; 
     if( !tmpOP( iDecimalUnicode , 0) ) break; 
     } 
     } 
     return aResult ; 
    }; 
    function GenerateBarCode(){ 
     var sText = document.getElementById('text').value, 
     iWidth = parseInt( document.getElementById('width').value ); 
     sText = sText.replace(/(^\s+|\s+$)/ig, ''); 
     iWidth = iWidth || 0; 
     if( iWidth > 20 || iWidth < 1) return false; 
     
     var aHexes = getHexes(sText, iWidth), sDivString=''; 
     for (var i = 0; i < iWidth; i++){ 
     sDivString += "<div style=\"width:8px;height:8px;float:left;background-image:url("+gifURL+");background-position-x:"+(8 * aHexes[i]) 
    +"px\"></div>" 
     } 
     document.getElementById('BarCode_Field').innerHTML = sDivString; 
    } 
    var gifURL = "/upload/200742411119165.gif"; 
    </script> 
    </head> 
    <body style="background-color:#000000; color:white"> 
    <div style="float:left;"> 
     <div style="float:left; width:70px; font-size:18px;line-height:25px; font-family:Arial"> 
     Text:
     
     Width: 
     </div> 
     <div style="float:left;"> 
     <input id="text" type="text" value="dknt沒有任何含義" />
     
     <input id="width" type="text" value="8"/></div> 
     <div style="float:left;margin-left:20px"> 
     <input type="button" value="Generate" onclick="GenerateBarCode()"/></div> 
    </div> 
    <div id="BarCode_Field" style="float:left;margin-left:20px"></div> 
    </body>

    大功告成。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    手把手教你做超酷的條形碼效果

    手把手教你做超酷的條形碼效果:聲明:1.這篇文章教你在web頁面上實(shí)現(xiàn)條形碼效果,體現(xiàn)的是利用網(wǎng)頁制作技術(shù)綜合解決問題的思路。旨在使對(duì)HTML, JavaScript,PhotoShop具有入門級(jí)水平的人鞏固入門級(jí)水平。2.若有問題不能及時(shí)回復(fù),麻煩請(qǐng)擔(dān)待,不勝感激。3.高手免進(jìn)。制作條形碼總共分幾步
    推薦度:
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 欧美日韩亚洲第一页 | 亚洲国产欧美另类 | 日本成人久久 | 国产日韩欧美一区二区三区视频 | 欧美另类色图 | 国产一区二区三区精品视频 | 欧美另类日韩中文色综合 | 国产国语高清在线视频二区 | 亚洲欧洲综合 | 99精品欧美一区二区三区综合在线 | 日韩欧美在线综合网高清 | 欧美色图一区 | 国产在线播放免费 | 亚洲一二三区视频 | 国产精品 视频一区 二区三区 | 久久精品一区二区三区不卡牛牛 | 国产日韩欧美视频 | 国产高清a毛片在线看 | 在线视频日韩 | 久久成人国产精品免费 | 久久国产精品一区二区 | 亚洲 欧美 日韩 小说 另类 | 亚洲欧美综合网 | 岛国一区二区 | 国产一区二区福利 | 91精品国产91久久久久福利 | 亚洲欧美国产高清va在线播放 | 99热成人精品国产免国语的 | 亚洲国产成人久久综合一 | 欧美一区二区三区在线观看 | 日韩一页 | 国产三级在线 | 国产欧美色图 | 亚洲第一欧美 | 图片区 日韩 欧美 亚洲 | 欧美午夜一区二区福利视频 | 亚洲乱码中文论理电影 | 久久国产精品成人免费 | 欧美国产第一页 | 欧美另类激情 | 韩日一区二区 |