前端QRCode.js生成二維碼插件(解決長(zhǎng)字符串顯示模糊問(wèn)題)

本文用于推薦一款很好用的二維碼生成插件QRCode.js,測(cè)試使用方便且簡(jiǎn)單滤灯。
其實(shí)官方就有很好的文檔坪稽,這里只是做一個(gè)我工作的記錄和總結(jié)。

@version1.0——2018-11-22——?jiǎng)?chuàng)建《前端QRCode.js生成二維碼插件》
@version1.1——2019-01-20——修改《前端QRCode.js生成二維碼插件(解決長(zhǎng)字符串顯示模糊問(wèn)題)》

  • 將注意事項(xiàng)提出不可忽略的問(wèn)題
  • 添加長(zhǎng)字符串顯示模糊力喷,手機(jī)二維碼不能識(shí)別的問(wèn)題
  • 添加解決小米8手機(jī)不顯示二維碼的問(wèn)題

?burning_韻七七

  • 目錄
    • 介紹
    • 使用
      • 1.引入js文件
      • 2.定義承載二維碼標(biāo)簽
      • 3.js調(diào)用
      • 4.頁(yè)面預(yù)覽
    • 參數(shù)API
      • QRCode參數(shù)
      • Option參數(shù)
      • API接口
    • 實(shí)踐
      • 生成二維碼刽漂,微信QQ識(shí)別打開網(wǎng)頁(yè)
    • 不可忽略的問(wèn)題(踩坑)
      • url的中文編碼問(wèn)題
      • 長(zhǎng)字符串的顯示模糊問(wèn)題
        • 問(wèn)題分析
        • 解決思路
        • 實(shí)踐真知
            1. 二維碼難以識(shí)別
            1. 觀察生成的結(jié)構(gòu)
            1. 放大倍數(shù)
            1. css縮小倍數(shù)
            1. 解決小米8手機(jī)不顯示二維碼的問(wèn)題
          • 此案例完整代碼

介紹

使用

1.引入js文件

<script src="qrcode.js"></script>

2.定義承載二維碼標(biāo)簽

<div id="qrcode"></div>

3.js調(diào)用

簡(jiǎn)單調(diào)用

new QRCode(document.getElementById('qrcode'), 'your content');

設(shè)置參數(shù)調(diào)用

下面會(huì)有參數(shù)詳解

var qrcode = new QRCode('qrcode', {
    text: 'your content',
    width: 256,
    height: 256,
    colorDark: '#000000',
    colorLight: '#ffffff',
    correctLevel: QRCode.CorrectLevel.H
});

4.頁(yè)面預(yù)覽

這樣就很簡(jiǎn)單的生成了一個(gè)二維碼


qrcode.jpg

參數(shù)API

QRCode參數(shù)

new QRCode(element, option)
名稱 默認(rèn)值 說(shuō)明
element - 承載二維碼的DOM元素的ID
option - 參數(shù)設(shè)置

Option參數(shù)

名稱 默認(rèn)值 說(shuō)明 備注
text - 二維碼承載的信息 如果是string那沒有什么好說(shuō)的拂募。
如果是url的話庭猩,為了微信和QQ可以識(shí)別,連接中的中文使用encodeURIComponent進(jìn)行編碼
width 256 二維碼寬度 單位像素(百分比不行)
height 256 二維碼高度 單位像素(百分比不行)
colorDark '#000000' 二維碼前景色 英文\十六進(jìn)制\rgb\rgba\transparent都可以
colorLight '#ffffff' 二維碼背景色 英文\十六進(jìn)制\rgb\rgba\transparent都可以
correctLevel QRCode.CorrectLevel.L 容錯(cuò)級(jí)別 由低到高
QRCode.CorrectLevel.L
QRCode.CorrectLevel.M
QRCode.CorrectLevel.Q
QRCode.CorrectLevel.H

API接口

名稱 參數(shù) 說(shuō)明 使用
clear - 清除二維碼 qrcode.clear()
makeCode string 替換二維碼(參數(shù)里面是新的二維碼內(nèi)容) qrcode.makeCode('new content')
var qrcode = new QRCode('qrcode',{
    'text':'content',
    'width':256,
    'height':256,
    'colorDark':'red',
    'colorLoght':'transparent',
    'correctLevel':QRCode.CorrectLevel.H
})


qrcode.clear();
qrcode.madkCode('new content');

實(shí)踐

生成二維碼陈症,微信QQ識(shí)別打開網(wǎng)頁(yè)

需求

  • 前端根據(jù)傳的不同的參數(shù)蔼水,在頁(yè)面生成一個(gè)二維碼
  • 由端分享到QQ、QQ空間录肯、微信趴腋、朋友圈的時(shí)候,截屏成圖片
  • 長(zhǎng)按圖片论咏,識(shí)別其中的二維碼优炬,打開網(wǎng)頁(yè)鏈接。

思路

  • 和端交互的網(wǎng)頁(yè)a.html后面加query參數(shù)厅贪,如:http://www.test.html/a.html?code=123
  • a.html中調(diào)用QRCode.js生成一個(gè)二維碼蠢护,二維碼中的信息是http://www.test.html/b.html?code=123
  • 分享出去的頁(yè)面是截屏是a.html的,識(shí)別圖中的二維碼打開b.html

實(shí)現(xiàn)

由于很簡(jiǎn)單养涮,所以就不貼代碼了葵硕。
但是下面有幾個(gè)踩的坑,不可忽略的問(wèn)題贯吓,必看懈凹。

不可忽略的問(wèn)題(踩坑)

url的中文編碼問(wèn)題

如果傳的是url,但是打開的時(shí)候只是一堆字符串讓手動(dòng)復(fù)制宣决,那么說(shuō)明url的地址不正確蘸劈。
如果是微信,傳的url的地址中有中文是可以識(shí)別的尊沸,但是在QQ中是不行的
所以其中的中文要進(jìn)行encodeURIComponent編碼威沫,但是不要整體都編碼,只是中文的部分編碼即可洼专。

長(zhǎng)字符串的顯示模糊問(wèn)題

問(wèn)題分析

顯示模糊的問(wèn)題棒掠,應(yīng)該是canvas的問(wèn)題。由于字符串比較長(zhǎng)屁商,尤其是需要傳一個(gè)連接地址烟很,后面還加一些參數(shù)的時(shí)候,就會(huì)加大二維碼的像素復(fù)雜度蜡镶,而本身canvas在繪制的時(shí)候雾袱,就一直有像素模糊的問(wèn)題,尤其是在手機(jī)上的時(shí)候官还。

解決思路

所以可以利用這個(gè)問(wèn)題芹橡,不動(dòng)源碼去解決因?yàn)殚L(zhǎng)字符串導(dǎo)致的二維碼模糊,手機(jī)無(wú)法識(shí)別的問(wèn)題——先將生成的二維碼進(jìn)行倍數(shù)擴(kuò)大望伦,然后在css上面固定其顯示寬高林说,這樣就可以擴(kuò)大顯示像素精度煎殷。

實(shí)踐真知

1. 二維碼難以識(shí)別

下面二維碼的識(shí)別難度:

  • QQ > weChat(相同長(zhǎng)度的二維碼,微信的識(shí)別程度比QQ的要好)
    • 微信中在大部分安卓手機(jī)上面是可以長(zhǎng)按識(shí)別的腿箩,小部分安卓手機(jī)比如小米豪直、oppo是無(wú)法識(shí)別的。還有蘋果手機(jī)大部分也不能識(shí)別珠移,更別說(shuō)QQ了弓乙,所以這個(gè)問(wèn)題需要解決。
cant1.png
2. 觀察生成的結(jié)構(gòu)

生成的頁(yè)面結(jié)構(gòu)可以看到是這樣的钧惧。通過(guò)canvas生成二維碼圖片唆貌,然后canvas隱藏顯示img。所以只要確保生成的canvas和img的寬高是100%即可垢乙。

生成的頁(yè)面結(jié)構(gòu)
3. 放大倍數(shù)
//顯示二維碼
var qrcode = new QRCode(document.getElementById("qrcodeConIn"), {
    text: `${location.origin}/codesearch/activity/broadcastgroup?requestAct=openview&openId=${data.openId}&random=${data.random}`,
    width: fontSize * 1.92 * 4,  //這里是根據(jù)rem進(jìn)行了換算锨咙,后面的4指的就是四倍
    height: fontSize * 1.92 * 4, //這里是根據(jù)rem進(jìn)行了換算,后面的4指的就是四倍
    colorDark : '#000',
    colorLight : "transparent",
    correctLevel : QRCode.CorrectLevel.H
});

看一下放大倍數(shù)的圖片(為了效果展示的是3倍的圖片)

3倍的二維碼
4. css縮小倍數(shù)
/*固定寬高*/
.qrcodeCon{
    width: 2.2rem;
    height: 2.2rem;
    padding: 0.15rem;
}

/*內(nèi)容自適應(yīng)*/
.qrcodeConIn{
    width: 100%;
    height: 100%;
}

/*生成的二維碼里面的img標(biāo)簽寬高自適應(yīng)*/
.qrcodeConIn img{
    width: 100%;
    height: 100%;
}
/*一開始生成的canvas也要進(jìn)行寬高自適應(yīng)*/
.qrcodeConIn canvas{
    width: 100%;
    height: 100%;
}

這樣就可以看到生成的效果了追逮。
下面這個(gè)二維碼酪刀,幾乎所有手機(jī)的QQ和微信都可以識(shí)別了,如果還不能識(shí)別钮孵,那就繼續(xù)加大倍數(shù)骂倘。

can1.png
5. 解決小米8手機(jī)不顯示二維碼的問(wèn)題

先說(shuō)我只是在測(cè)試的時(shí)候,發(fā)現(xiàn)小米8手機(jī)并不能生成二維碼巴席,我覺得肯定是有一些代碼不兼容历涝。但是目前沒有時(shí)間去研究源碼,留下一個(gè)坑漾唉。

但是是知道处硬,小米8在生成二維碼之后的img標(biāo)簽中的src為空轩拨。
根據(jù)這個(gè)現(xiàn)象后面做了一個(gè)planB疼电,待以后有時(shí)間研究了再完善模聋。

//把代碼放到事件隊(duì)列后面
setTimeout(function(){
    //檢測(cè)一下如果img標(biāo)簽里面的src沒有base64就進(jìn)行下面操作
    if(!$("#qrcodeConIn img").attr("src")){
        $("#qrcodeConIn img").show();
        $("#qrcodeConIn canvas").hide();
        var canvas = $("#qrcodeConIn canvas")[0];
        var dataURL = canvas.toDataURL("image/png");
        $("#qrcodeConIn img").attr("src",dataURL);
    }
},0);
此案例完整代碼

html

<div class="codeCon">
    <!--撐開的后面背景-->
    <div class="inlineBlock qrcode">
        <!--白色部分占位-->
        <div id="qrcodeCon" class="qrcodeCon">
            <!--二維碼顯示范圍-->
            <div id="qrcodeConIn" class="qrcodeConIn"></div>
        </div>
    </div>
    <div class="inlineBlock">
        <h3>長(zhǎng)按識(shí)別</h3>
        <h3>掃碼免費(fèi)領(lǐng)</h3>
        <p>僅限今日</p>
    </div>
</div>

css

.codeCon{
    margin: 0 auto;
    width: 6.6rem;
    padding: 0.35rem 0;
    border-radius: 0.2rem;
    background-color: #eee;
}

.inlineBlock{
    display: inline-block;
    vertical-align: middle;
}
.qrcode{
    background-color: #fff;
    border-radius: 0.2rem;
    border: 1px solid #eee;
}
/*固定寬高*/
.qrcodeCon{
    width: 2.2rem;
    height: 2.2rem;
    padding: 0.15rem;
}

/*內(nèi)容自適應(yīng)*/
.qrcodeConIn{
    width: 100%;
    height: 100%;
}

h3{
    font-size: 0.4rem;
    margin-bottom: 0.15rem;
    letter-spacing: 0.04rem;
    text-indent: 0.04rem;
}
p{
    font-size: 0.32rem;
    letter-spacing: 0.2rem;
    text-indent: 0.2rem;
}

/*生成的二維碼里面的img標(biāo)簽寬高自適應(yīng)*/
.qrcodeConIn img{
    width: 100%;
    height: 100%;
}
/*一開始生成的canvas也要進(jìn)行寬高自適應(yīng)*/
.qrcodeConIn canvas{
    width: 100%;
    height: 100%;
}

js

//顯示二維碼
var qrcode = new QRCode(document.getElementById("qrcodeConIn"), {
    text: `${location.origin}/codesearch/activity/broadcastgroup?requestAct=openview&openId=${data.openId}&random=${data.random}`,
    width: fontSize * 1.92 * 4,
    height: fontSize * 1.92 * 4,
    colorDark : '#000',
    colorLight : "transparent",
    correctLevel : QRCode.CorrectLevel.H
});
setTimeout(function(){
    if(!$("#qrcodeConIn img").attr("src")){
        $("#qrcodeConIn img").show();
        $("#qrcodeConIn canvas").hide();
        var canvas = $("#qrcodeConIn canvas")[0];
        var dataURL = canvas.toDataURL("image/png");
        $("#qrcodeConIn img").attr("src",dataURL);
    }
},0);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市般此,隨后出現(xiàn)的幾起案子蚪战,更是在濱河造成了極大的恐慌,老刑警劉巖铐懊,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邀桑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡科乎,警方通過(guò)查閱死者的電腦和手機(jī)壁畸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喜喂,“玉大人瓤摧,你說(shuō)我怎么就攤上這事∮裼酰” “怎么了照弥?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)进副。 經(jīng)常有香客問(wèn)我这揣,道長(zhǎng),這世上最難降的妖魔是什么影斑? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任给赞,我火速辦了婚禮,結(jié)果婚禮上矫户,老公的妹妹穿的比我還像新娘片迅。我一直安慰自己,他們只是感情好皆辽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布柑蛇。 她就那樣靜靜地躺著,像睡著了一般驱闷。 火紅的嫁衣襯著肌膚如雪耻台。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天空另,我揣著相機(jī)與錄音盆耽,去河邊找鬼。 笑死扼菠,一個(gè)胖子當(dāng)著我的面吹牛摄杂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播循榆,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匙姜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了冯痢?” 一聲冷哼從身側(cè)響起氮昧,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浦楣,沒想到半個(gè)月后袖肥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡振劳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年椎组,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片历恐。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寸癌,死狀恐怖专筷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒸苇,我是刑警寧澤磷蛹,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站溪烤,受9級(jí)特大地震影響味咳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檬嘀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一槽驶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸳兽,春花似錦掂铐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蒿秦,卻和暖如春烤镐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棍鳖。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工炮叶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渡处。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓镜悉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親医瘫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侣肄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,982評(píng)論 3 119
  • 近年來(lái)隨著企業(yè)所面臨環(huán)境的不斷變化醇份,要求領(lǐng)導(dǎo)者要站出來(lái)稼锅,更多地根據(jù)環(huán)境的變化去做戰(zhàn)略轉(zhuǎn)型,讓企業(yè)可以不斷發(fā)展僚纷。 培...
    職場(chǎng)案例閱讀 257評(píng)論 0 0
  • 內(nèi)置數(shù)據(jù)結(jié)構(gòu)(變量類型) list set dict tuple set(集合)- (一堆確定的無(wú)序的唯一數(shù)據(jù)) ...
    桃阿閱讀 267評(píng)論 0 0
  • 發(fā)天紙的鞭炮聲 響起灶老爺起駕的 人間煙火 膝蓋便不由自主了 自編自導(dǎo)的供桌前 一頭叩下 滿地的滄桑 嗚咽期許的悲...
    凹丁閱讀 294評(píng)論 0 2
  • 歲月又逢冬怖竭,最恨離別時(shí)锥债。“故關(guān)衰草遍,離別正堪悲哮肚。路出寒云外登夫,人歸暮雪時(shí)。少孤為客早允趟,多難識(shí)君遲恼策。掩泣空相向,風(fēng)塵...
    向行閱讀 2,814評(píng)論 4 7