js生成二维码

秒速五厘米 2022-06-15 06:59 547阅读 0赞

首先引入qrcode.js文件(请大家耐心翻到最后):

/*from tccdn minify at 2014-6-4 14:59:43,file��/cn/c/c/qrcode.js*/
/**
* @fileoverview
* - Using the ‘QRCode for Javascript library’
* - Fixed dataset of ‘QRCode for Javascript library’ for support full-spec.
* - this library has no dependencies.
*
* @author davidshimjs
* @see http://www.d-project.com/
* @see http://jeromeetienne.github.com/jquery-qrcode/
*/
var QRCode;

(function () {
//——————————————————————————————————-
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
// http://www.opensource.org/licenses/mit-license.php
//
// The word “QR Code” is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//——————————————————————————————————-
function QR8bitByte(data) {
this.mode = QRMode.MODE_8BIT_BYTE;
this.data = data;
this.parsedData = [];

  1. // Added to support UTF-8 Characters
  2. for (var i = 0, l = this.data.length; i < l; i++) \{
  3. var byteArray = \[\];
  4. var code = this.data.charCodeAt(i);
  5. if (code > 0x10000) \{
  6. byteArray\[0\] = 0xF0 | ((code & 0x1C0000) >>> 18);
  7. byteArray\[1\] = 0x80 | ((code & 0x3F000) >>> 12);
  8. byteArray\[2\] = 0x80 | ((code & 0xFC0) >>> 6);
  9. byteArray\[3\] = 0x80 | (code & 0x3F);
  10. \} else if (code > 0x800) \{
  11. byteArray\[0\] = 0xE0 | ((code & 0xF000) >>> 12);
  12. byteArray\[1\] = 0x80 | ((code & 0xFC0) >>> 6);
  13. byteArray\[2\] = 0x80 | (code & 0x3F);
  14. \} else if (code > 0x80) \{
  15. byteArray\[0\] = 0xC0 | ((code & 0x7C0) >>> 6);
  16. byteArray\[1\] = 0x80 | (code & 0x3F);
  17. \} else \{
  18. byteArray\[0\] = code;
  19. \}
  20. this.parsedData.push(byteArray);
  21. \}
  22. this.parsedData = Array.prototype.concat.apply(\[\], this.parsedData);
  23. if (this.parsedData.length != this.data.length) \{
  24. this.parsedData.unshift(191);
  25. this.parsedData.unshift(187);
  26. this.parsedData.unshift(239);
  27. \}
  28. \}
  29. QR8bitByte.prototype = \{
  30. getLength: function (buffer) \{
  31. return this.parsedData.length;
  32. \},
  33. write: function (buffer) \{
  34. for (var i = 0, l = this.parsedData.length; i < l; i++) \{
  35. buffer.put(this.parsedData\[i\], 8);
  36. \}
  37. \}
  38. \};
  39. function QRCodeModel(typeNumber, errorCorrectLevel) \{
  40. this.typeNumber = typeNumber;
  41. this.errorCorrectLevel = errorCorrectLevel;
  42. this.modules = null;
  43. this.moduleCount = 0;
  44. this.dataCache = null;
  45. this.dataList = \[\];
  46. \}

function QRPolynomial(num, shift) {
if (num.length == undefined) throw new Error(num.length + “/“ + shift);
var offset = 0;
while (offset < num.length && num[offset] == 0) offset++;
this.num = new Array(num.length - offset + shift);
for (var i = 0; i < num.length - offset; i++) this.num[i] = num[i + offset];
}

function QRRSBlock(totalCount, dataCount) {
this.totalCount = totalCount, this.dataCount = dataCount;
}

function QRBitBuffer() {
this.buffer = [], this.length = 0;
}

  1. QRCodeModel.prototype = \{
  2. "addData": function(data) \{
  3. var newData = new QR8bitByte(data);
  4. this.dataList.push(newData), this.dataCache = null;
  5. \},
  6. "isDark": function(row, col) \{
  7. if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) throw new Error(row + "," + col);
  8. return this.modules\[row\]\[col\];
  9. \},
  10. "getModuleCount": function() \{
  11. return this.moduleCount;
  12. \},
  13. "make": function() \{
  14. this.makeImpl(!1, this.getBestMaskPattern());
  15. \},
  16. "makeImpl": function(test, maskPattern) \{
  17. this.moduleCount = this.typeNumber \* 4 + 17, this.modules = new Array(this.moduleCount);
  18. for (var row = 0; row < this.moduleCount; row++) \{
  19. this.modules\[row\] = new Array(this.moduleCount);
  20. for (var col = 0; col < this.moduleCount; col++) this.modules\[row\]\[col\] = null;
  21. \}
  22. this.setupPositionProbePattern(0, 0),
  23. this.setupPositionProbePattern(this.moduleCount - 7, 0),
  24. this.setupPositionProbePattern(0, this.moduleCount - 7),
  25. this.setupPositionAdjustPattern(), this.setupTimingPattern(),
  26. this.setupTypeInfo(test, maskPattern),
  27. this.typeNumber >= 7 && this.setupTypeNumber(test),
  28. this.dataCache == null && (this.dataCache = QRCodeModel.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)), this.mapData(this.dataCache, maskPattern);
  29. \},
  30. "setupPositionProbePattern": function(row, col) \{
  31. for (var r = -1; r <= 7; r++) \{
  32. if (row + r <= -1 || this.moduleCount <= row + r) continue;
  33. for (var c = -1; c <= 7; c++) \{
  34. if (col + c <= -1 || this.moduleCount <= col + c) continue;

0 <= r && r <= 6 && (c == 0 || c == 6) || 0 <= c && c <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c && c <= 4 ? this.modules[row + r][col + c] = !0 : this.modules[row + r][col + c] = !1;
}
}
},
“getBestMaskPattern”: function() {
var minLostPoint = 0, pattern = 0;
for (var i = 0; i < 8; i++) {
this.makeImpl(!0, i);
var lostPoint = QRUtil.getLostPoint(this);
if (i == 0 || minLostPoint > lostPoint) minLostPoint = lostPoint, pattern = i;
}
return pattern;
},
“createMovieClip”: function(target_mc, instance_name, depth) {
var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth), cs = 1;
this.make();
for (var row = 0; row < this.modules.length; row++) {
var y = row * cs;
for (var col = 0; col < this.modules[row].length; col++) {
var x = col * cs, dark = this.modules[row][col];
dark && (qr_mc.beginFill(0, 100), qr_mc.moveTo(x, y), qr_mc.lineTo(x + cs, y), qr_mc.lineTo(x + cs, y + cs), qr_mc.lineTo(x, y + cs), qr_mc.endFill());
}
}
return qr_mc;
},
“setupTimingPattern”: function() {
for (var r = 8; r < this.moduleCount - 8; r++) {
if (this.modules[r][6] != null) continue;
this.modules[r][6] = r % 2 == 0;
}
for (var c = 8; c < this.moduleCount - 8; c++) {
if (this.modules[6][c] != null) continue;
this.modules[6][c] = c % 2 == 0;
}
},
“setupPositionAdjustPattern”: function() {
var pos = QRUtil.getPatternPosition(this.typeNumber);
for (var i = 0; i < pos.length; i++) for (var j = 0; j < pos.length; j++) {
var row = pos[i], col = pos[j];
if (this.modules[row][col] != null) continue;
for (var r = -2; r <= 2; r++) for (var c = -2; c <= 2; c++) r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0 ? this.modules[row + r][col + c] = !0 : this.modules[row + r][col + c] = !1;
}
},
“setupTypeNumber”: function(test) {
var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
for (var i = 0; i < 18; i++) {
var mod = !test && (bits >> i & 1) == 1;
this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
}
for (var i = 0; i < 18; i++) {
var mod = !test && (bits >> i & 1) == 1;
this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
}
},
“setupTypeInfo”: function(test, maskPattern) {
var data = this.errorCorrectLevel << 3 | maskPattern, bits = QRUtil.getBCHTypeInfo(data);
for (var i = 0; i < 15; i++) {
var mod = !test && (bits >> i & 1) == 1;
i < 6 ? this.modules[i][8] = mod : i < 8 ? this.modules[i + 1][8] = mod : this.modules[this.moduleCount - 15 + i][8] = mod;
}
for (var i = 0; i < 15; i++) {
var mod = !test && (bits >> i & 1) == 1;
i < 8 ? this.modules[8][this.moduleCount - i - 1] = mod : i < 9 ? this.modules[8][15 - i - 1 + 1] = mod : this.modules[8][15 - i - 1] = mod;
}
this.modules[this.moduleCount - 8][8] = !test;
},
“mapData”: function(data, maskPattern) {
var inc = -1, row = this.moduleCount - 1, bitIndex = 7, byteIndex = 0;
for (var col = this.moduleCount - 1; col > 0; col -= 2) {
col == 6 && col—;
for (;;) {
for (var c = 0; c < 2; c++) if (this.modules[row][col - c] == null) {
var dark = !1;
byteIndex < data.length && (dark = (data[byteIndex] >>> bitIndex & 1) == 1);
var mask = QRUtil.getMask(maskPattern, row, col - c);
mask && (dark = !dark), this.modules[row][col - c] = dark, bitIndex—, bitIndex == -1 && (byteIndex++, bitIndex = 7);
}
row += inc;
if (row < 0 || this.moduleCount <= row) {
row -= inc, inc = -inc;
break;
}
}
}
}
}, QRCodeModel.PAD0 = 236, QRCodeModel.PAD1 = 17, QRCodeModel.createData = function(typeNumber, errorCorrectLevel, dataList) {
var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel), buffer = new QRBitBuffer;
for (var i = 0; i < dataList.length; i++) {
var data = dataList[i];
buffer.put(data.mode, 4), buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)), data.write(buffer);
}
var totalDataCount = 0;
for (var i = 0; i < rsBlocks.length; i++) totalDataCount += rsBlocks[i].dataCount;
if (buffer.getLengthInBits() > totalDataCount * 8) throw new Error(“code length overflow. (“ + buffer.getLengthInBits() + “>” + totalDataCount * 8 + “)”);
buffer.getLengthInBits() + 4 <= totalDataCount * 8 && buffer.put(0, 4);
while (buffer.getLengthInBits() % 8 != 0) buffer.putBit(!1);
for (;;) {
if (buffer.getLengthInBits() >= totalDataCount * 8) break;
buffer.put(QRCodeModel.PAD0, 8);
if (buffer.getLengthInBits() >= totalDataCount * 8) break;
buffer.put(QRCodeModel.PAD1, 8);
}
return QRCodeModel.createBytes(buffer, rsBlocks);
}, QRCodeModel.createBytes = function(buffer, rsBlocks) {
var offset = 0, maxDcCount = 0, maxEcCount = 0, dcdata = new Array(rsBlocks.length), ecdata = new Array(rsBlocks.length);
for (var r = 0; r < rsBlocks.length; r++) {
var dcCount = rsBlocks[r].dataCount, ecCount = rsBlocks[r].totalCount - dcCount;
maxDcCount = Math.max(maxDcCount, dcCount), maxEcCount = Math.max(maxEcCount, ecCount), dcdata[r] = new Array(dcCount);
for (var i = 0; i < dcdata[r].length; i++) dcdata[r][i] = 255 & buffer.buffer[i + offset];
offset += dcCount;
var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount), rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1), modPoly = rawPoly.mod(rsPoly);
ecdata[r] = new Array(rsPoly.getLength() - 1);
for (var i = 0; i < ecdata[r].length; i++) {
var modIndex = i + modPoly.getLength() - ecdata[r].length;
ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0;
}
}
var totalCodeCount = 0;
for (var i = 0; i < rsBlocks.length; i++) totalCodeCount += rsBlocks[i].totalCount;
var data = new Array(totalCodeCount), index = 0;
for (var i = 0; i < maxDcCount; i++) for (var r = 0; r < rsBlocks.length; r++) i < dcdata[r].length && (data[index++] = dcdata[r][i]);
for (var i = 0; i < maxEcCount; i++) for (var r = 0; r < rsBlocks.length; r++) i < ecdata[r].length && (data[index++] = ecdata[r][i]);
return data;
};

  1. var QRMode = \{
  2. "MODE\_NUMBER": 1,
  3. "MODE\_ALPHA\_NUM": 2,
  4. "MODE\_8BIT\_BYTE": 4,
  5. "MODE\_KANJI": 8
  6. \}, QRErrorCorrectLevel = \{
  7. "L": 1,
  8. "M": 0,
  9. "Q": 3,
  10. "H": 2
  11. \}, QRMaskPattern = \{
  12. "PATTERN000": 0,
  13. "PATTERN001": 1,
  14. "PATTERN010": 2,
  15. "PATTERN011": 3,
  16. "PATTERN100": 4,
  17. "PATTERN101": 5,
  18. "PATTERN110": 6,
  19. "PATTERN111": 7
  20. \}, QRUtil = \{
  21. "PATTERN\_POSITION\_TABLE": \[ \[\], \[ 6, 18 \], \[ 6, 22 \], \[ 6, 26 \], \[ 6, 30 \], \[ 6, 34 \], \[ 6, 22, 38 \], \[ 6, 24, 42 \], \[ 6, 26, 46 \], \[ 6, 28, 50 \], \[ 6, 30, 54 \], \[ 6, 32, 58 \], \[ 6, 34, 62 \], \[ 6, 26, 46, 66 \], \[ 6, 26, 48, 70 \], \[ 6, 26, 50, 74 \], \[ 6, 30, 54, 78 \], \[ 6, 30, 56, 82 \], \[ 6, 30, 58, 86 \], \[ 6, 34, 62, 90 \], \[ 6, 28, 50, 72, 94 \], \[ 6, 26, 50, 74, 98 \], \[ 6, 30, 54, 78, 102 \], \[ 6, 28, 54, 80, 106 \], \[ 6, 32, 58, 84, 110 \], \[ 6, 30, 58, 86, 114 \], \[ 6, 34, 62, 90, 118 \], \[ 6, 26, 50, 74, 98, 122 \], \[ 6, 30, 54, 78, 102, 126 \], \[ 6, 26, 52, 78, 104, 130 \], \[ 6, 30, 56, 82, 108, 134 \], \[ 6, 34, 60, 86, 112, 138 \], \[ 6, 30, 58, 86, 114, 142 \], \[ 6, 34, 62, 90, 118, 146 \], \[ 6, 30, 54, 78, 102, 126, 150 \], \[ 6, 24, 50, 76, 102, 128, 154 \], \[ 6, 28, 54, 80, 106, 132, 158 \], \[ 6, 32, 58, 84, 110, 136, 162 \], \[ 6, 26, 54, 82, 110, 138, 166 \], \[ 6, 30, 58, 86, 114, 142, 170 \] \],
  22. "G15": 1335,
  23. "G18": 7973,
  24. "G15\_MASK": 21522,
  25. "getBCHTypeInfo": function(data) \{
  26. var d = data << 10;
  27. while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) d ^= QRUtil.G15 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15);
  28. return (data << 10 | d) ^ QRUtil.G15\_MASK;
  29. \},
  30. "getBCHTypeNumber": function(data) \{
  31. var d = data << 12;
  32. while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) d ^= QRUtil.G18 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18);
  33. return data << 12 | d;
  34. \},
  35. "getBCHDigit": function(data) \{
  36. var digit = 0;
  37. while (data != 0) digit++, data >>>= 1;
  38. return digit;
  39. \},
  40. "getPatternPosition": function(typeNumber) \{
  41. return QRUtil.PATTERN\_POSITION\_TABLE\[typeNumber - 1\];
  42. \},
  43. "getMask": function(maskPattern, i, j) \{
  44. switch (maskPattern) \{
  45. case QRMaskPattern.PATTERN000:
  46. return (i + j) % 2 == 0;
  47. case QRMaskPattern.PATTERN001:
  48. return i % 2 == 0;
  49. case QRMaskPattern.PATTERN010:
  50. return j % 3 == 0;
  51. case QRMaskPattern.PATTERN011:
  52. return (i + j) % 3 == 0;
  53. case QRMaskPattern.PATTERN100:
  54. return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
  55. case QRMaskPattern.PATTERN101:
  56. return i \* j % 2 + i \* j % 3 == 0;
  57. case QRMaskPattern.PATTERN110:
  58. return (i \* j % 2 + i \* j % 3) % 2 == 0;
  59. case QRMaskPattern.PATTERN111:
  60. return (i \* j % 3 + (i + j) % 2) % 2 == 0;
  61. default:
  62. throw new Error("bad maskPattern:" + maskPattern);
  63. \}
  64. \},
  65. "getErrorCorrectPolynomial": function(errorCorrectLength) \{
  66. var a = new QRPolynomial(\[ 1 \], 0);
  67. for (var i = 0; i < errorCorrectLength; i++) a = a.multiply(new QRPolynomial(\[ 1, QRMath.gexp(i) \], 0));
  68. return a;
  69. \},
  70. "getLengthInBits": function(mode, type) \{
  71. if (1 <= type && type < 10) switch (mode) \{
  72. case QRMode.MODE\_NUMBER:
  73. return 10;
  74. case QRMode.MODE\_ALPHA\_NUM:
  75. return 9;
  76. case QRMode.MODE\_8BIT\_BYTE:
  77. return 8;
  78. case QRMode.MODE\_KANJI:
  79. return 8;
  80. default:
  81. throw new Error("mode:" + mode);
  82. \} else if (type < 27) switch (mode) \{
  83. case QRMode.MODE\_NUMBER:
  84. return 12;
  85. case QRMode.MODE\_ALPHA\_NUM:
  86. return 11;
  87. case QRMode.MODE\_8BIT\_BYTE:
  88. return 16;
  89. case QRMode.MODE\_KANJI:
  90. return 10;
  91. default:
  92. throw new Error("mode:" + mode);
  93. \} else \{
  94. if (!(type < 41)) throw new Error("type:" + type);
  95. switch (mode) \{
  96. case QRMode.MODE\_NUMBER:
  97. return 14;
  98. case QRMode.MODE\_ALPHA\_NUM:
  99. return 13;
  100. case QRMode.MODE\_8BIT\_BYTE:
  101. return 16;
  102. case QRMode.MODE\_KANJI:
  103. return 12;
  104. default:
  105. throw new Error("mode:" + mode);
  106. \}
  107. \}
  108. \},
  109. "getLostPoint": function(qrCode) \{
  110. var moduleCount = qrCode.getModuleCount(), lostPoint = 0;
  111. for (var row = 0; row < moduleCount; row++) for (var col = 0; col < moduleCount; col++) \{
  112. var sameCount = 0, dark = qrCode.isDark(row, col);
  113. for (var r = -1; r <= 1; r++) \{
  114. if (row + r < 0 || moduleCount <= row + r) continue;
  115. for (var c = -1; c <= 1; c++) \{
  116. if (col + c < 0 || moduleCount <= col + c) continue;
  117. if (r == 0 && c == 0) continue;
  118. dark == qrCode.isDark(row + r, col + c) && sameCount++;
  119. \}
  120. \}
  121. sameCount > 5 && (lostPoint += 3 + sameCount - 5);
  122. \}
  123. for (var row = 0; row < moduleCount - 1; row++) for (var col = 0; col < moduleCount - 1; col++) \{
  124. var count = 0;
  125. qrCode.isDark(row, col) && count++, qrCode.isDark(row + 1, col) && count++, qrCode.isDark(row, col + 1) && count++, qrCode.isDark(row + 1, col + 1) && count++;
  126. if (count == 0 || count == 4) lostPoint += 3;
  127. \}
  128. for (var row = 0; row < moduleCount; row++) for (var col = 0; col < moduleCount - 6; col++) qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6) && (lostPoint += 40);
  129. for (var col = 0; col < moduleCount; col++) for (var row = 0; row < moduleCount - 6; row++) qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col) && (lostPoint += 40);
  130. var darkCount = 0;
  131. for (var col = 0; col < moduleCount; col++) for (var row = 0; row < moduleCount; row++) qrCode.isDark(row, col) && darkCount++;
  132. var ratio = Math.abs(100 \* darkCount / moduleCount / moduleCount - 50) / 5;
  133. return lostPoint += ratio \* 10, lostPoint;
  134. \}
  135. \}, QRMath = \{
  136. "glog": function(n) \{
  137. if (n < 1) throw new Error("glog(" + n + ")");
  138. return QRMath.LOG\_TABLE\[n\];
  139. \},
  140. "gexp": function(n) \{
  141. while (n < 0) n += 255;
  142. while (n >= 256) n -= 255;
  143. return QRMath.EXP\_TABLE\[n\];
  144. \},
  145. "EXP\_TABLE": new Array(256),
  146. "LOG\_TABLE": new Array(256)
  147. \};
  148. for (var i = 0; i < 8; i++) QRMath.EXP\_TABLE\[i\] = 1 << i;
  149. for (var i = 8; i < 256; i++) QRMath.EXP\_TABLE\[i\] = QRMath.EXP\_TABLE\[i - 4\] ^ QRMath.EXP\_TABLE\[i - 5\] ^ QRMath.EXP\_TABLE\[i - 6\] ^ QRMath.EXP\_TABLE\[i - 8\];
  150. for (var i = 0; i < 255; i++) QRMath.LOG\_TABLE\[QRMath.EXP\_TABLE\[i\]\] = i;
  151. QRPolynomial.prototype = \{
  152. "get": function(index) \{
  153. return this.num\[index\];
  154. \},
  155. "getLength": function() \{
  156. return this.num.length;
  157. \},
  158. "multiply": function(e) \{
  159. var num = new Array(this.getLength() + e.getLength() - 1);
  160. for (var i = 0; i < this.getLength(); i++) for (var j = 0; j < e.getLength(); j++) num\[i + j\] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
  161. return new QRPolynomial(num, 0);
  162. \},
  163. "mod": function(e) \{
  164. if (this.getLength() - e.getLength() < 0) return this;
  165. var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)), num = new Array(this.getLength());
  166. for (var i = 0; i < this.getLength(); i++) num\[i\] = this.get(i);
  167. for (var i = 0; i < e.getLength(); i++) num\[i\] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
  168. return (new QRPolynomial(num, 0)).mod(e);
  169. \}
  170. \}, QRRSBlock.RS\_BLOCK\_TABLE = \[ \[ 1, 26, 19 \], \[ 1, 26, 16 \], \[ 1, 26, 13 \], \[ 1, 26, 9 \], \[ 1, 44, 34 \], \[ 1, 44, 28 \], \[ 1, 44, 22 \], \[ 1, 44, 16 \], \[ 1, 70, 55 \], \[ 1, 70, 44 \], \[ 2, 35, 17 \], \[ 2, 35, 13 \], \[ 1, 100, 80 \], \[ 2, 50, 32 \], \[ 2, 50, 24 \], \[ 4, 25, 9 \], \[ 1, 134, 108 \], \[ 2, 67, 43 \], \[ 2, 33, 15, 2, 34, 16 \], \[ 2, 33, 11, 2, 34, 12 \], \[ 2, 86, 68 \], \[ 4, 43, 27 \], \[ 4, 43, 19 \], \[ 4, 43, 15 \], \[ 2, 98, 78 \], \[ 4, 49, 31 \], \[ 2, 32, 14, 4, 33, 15 \], \[ 4, 39, 13, 1, 40, 14 \], \[ 2, 121, 97 \], \[ 2, 60, 38, 2, 61, 39 \], \[ 4, 40, 18, 2, 41, 19 \], \[ 4, 40, 14, 2, 41, 15 \], \[ 2, 146, 116 \], \[ 3, 58, 36, 2, 59, 37 \], \[ 4, 36, 16, 4, 37, 17 \], \[ 4, 36, 12, 4, 37, 13 \], \[ 2, 86, 68, 2, 87, 69 \], \[ 4, 69, 43, 1, 70, 44 \], \[ 6, 43, 19, 2, 44, 20 \], \[ 6, 43, 15, 2, 44, 16 \], \[ 4, 101, 81 \], \[ 1, 80, 50, 4, 81, 51 \], \[ 4, 50, 22, 4, 51, 23 \], \[ 3, 36, 12, 8, 37, 13 \], \[ 2, 116, 92, 2, 117, 93 \], \[ 6, 58, 36, 2, 59, 37 \], \[ 4, 46, 20, 6, 47, 21 \], \[ 7, 42, 14, 4, 43, 15 \], \[ 4, 133, 107 \], \[ 8, 59, 37, 1, 60, 38 \], \[ 8, 44, 20, 4, 45, 21 \], \[ 12, 33, 11, 4, 34, 12 \], \[ 3, 145, 115, 1, 146, 116 \], \[ 4, 64, 40, 5, 65, 41 \], \[ 11, 36, 16, 5, 37, 17 \], \[ 11, 36, 12, 5, 37, 13 \], \[ 5, 109, 87, 1, 110, 88 \], \[ 5, 65, 41, 5, 66, 42 \], \[ 5, 54, 24, 7, 55, 25 \], \[ 11, 36, 12 \], \[ 5, 122, 98, 1, 123, 99 \], \[ 7, 73, 45, 3, 74, 46 \], \[ 15, 43, 19, 2, 44, 20 \], \[ 3, 45, 15, 13, 46, 16 \], \[ 1, 135, 107, 5, 136, 108 \], \[ 10, 74, 46, 1, 75, 47 \], \[ 1, 50, 22, 15, 51, 23 \], \[ 2, 42, 14, 17, 43, 15 \], \[ 5, 150, 120, 1, 151, 121 \], \[ 9, 69, 43, 4, 70, 44 \], \[ 17, 50, 22, 1, 51, 23 \], \[ 2, 42, 14, 19, 43, 15 \], \[ 3, 141, 113, 4, 142, 114 \], \[ 3, 70, 44, 11, 71, 45 \], \[ 17, 47, 21, 4, 48, 22 \], \[ 9, 39, 13, 16, 40, 14 \], \[ 3, 135, 107, 5, 136, 108 \], \[ 3, 67, 41, 13, 68, 42 \], \[ 15, 54, 24, 5, 55, 25 \], \[ 15, 43, 15, 10, 44, 16 \], \[ 4, 144, 116, 4, 145, 117 \], \[ 17, 68, 42 \], \[ 17, 50, 22, 6, 51, 23 \], \[ 19, 46, 16, 6, 47, 17 \], \[ 2, 139, 111, 7, 140, 112 \], \[ 17, 74, 46 \], \[ 7, 54, 24, 16, 55, 25 \], \[ 34, 37, 13 \], \[ 4, 151, 121, 5, 152, 122 \], \[ 4, 75, 47, 14, 76, 48 \], \[ 11, 54, 24, 14, 55, 25 \], \[ 16, 45, 15, 14, 46, 16 \], \[ 6, 147, 117, 4, 148, 118 \], \[ 6, 73, 45, 14, 74, 46 \], \[ 11, 54, 24, 16, 55, 25 \], \[ 30, 46, 16, 2, 47, 17 \], \[ 8, 132, 106, 4, 133, 107 \], \[ 8, 75, 47, 13, 76, 48 \], \[ 7, 54, 24, 22, 55, 25 \], \[ 22, 45, 15, 13, 46, 16 \], \[ 10, 142, 114, 2, 143, 115 \], \[ 19, 74, 46, 4, 75, 47 \], \[ 28, 50, 22, 6, 51, 23 \], \[ 33, 46, 16, 4, 47, 17 \], \[ 8, 152, 122, 4, 153, 123 \], \[ 22, 73, 45, 3, 74, 46 \], \[ 8, 53, 23, 26, 54, 24 \], \[ 12, 45, 15, 28, 46, 16 \], \[ 3, 147, 117, 10, 148, 118 \], \[ 3, 73, 45, 23, 74, 46 \], \[ 4, 54, 24, 31, 55, 25 \], \[ 11, 45, 15, 31, 46, 16 \], \[ 7, 146, 116, 7, 147, 117 \], \[ 21, 73, 45, 7, 74, 46 \], \[ 1, 53, 23, 37, 54, 24 \], \[ 19, 45, 15, 26, 46, 16 \], \[ 5, 145, 115, 10, 146, 116 \], \[ 19, 75, 47, 10, 76, 48 \], \[ 15, 54, 24, 25, 55, 25 \], \[ 23, 45, 15, 25, 46, 16 \], \[ 13, 145, 115, 3, 146, 116 \], \[ 2, 74, 46, 29, 75, 47 \], \[ 42, 54, 24, 1, 55, 25 \], \[ 23, 45, 15, 28, 46, 16 \], \[ 17, 145, 115 \], \[ 10, 74, 46, 23, 75, 47 \], \[ 10, 54, 24, 35, 55, 25 \], \[ 19, 45, 15, 35, 46, 16 \], \[ 17, 145, 115, 1, 146, 116 \], \[ 14, 74, 46, 21, 75, 47 \], \[ 29, 54, 24, 19, 55, 25 \], \[ 11, 45, 15, 46, 46, 16 \], \[ 13, 145, 115, 6, 146, 116 \], \[ 14, 74, 46, 23, 75, 47 \], \[ 44, 54, 24, 7, 55, 25 \], \[ 59, 46, 16, 1, 47, 17 \], \[ 12, 151, 121, 7, 152, 122 \], \[ 12, 75, 47, 26, 76, 48 \], \[ 39, 54, 24, 14, 55, 25 \], \[ 22, 45, 15, 41, 46, 16 \], \[ 6, 151, 121, 14, 152, 122 \], \[ 6, 75, 47, 34, 76, 48 \], \[ 46, 54, 24, 10, 55, 25 \], \[ 2, 45, 15, 64, 46, 16 \], \[ 17, 152, 122, 4, 153, 123 \], \[ 29, 74, 46, 14, 75, 47 \], \[ 49, 54, 24, 10, 55, 25 \], \[ 24, 45, 15, 46, 46, 16 \], \[ 4, 152, 122, 18, 153, 123 \], \[ 13, 74, 46, 32, 75, 47 \], \[ 48, 54, 24, 14, 55, 25 \], \[ 42, 45, 15, 32, 46, 16 \], \[ 20, 147, 117, 4, 148, 118 \], \[ 40, 75, 47, 7, 76, 48 \], \[ 43, 54, 24, 22, 55, 25 \], \[ 10, 45, 15, 67, 46, 16 \], \[ 19, 148, 118, 6, 149, 119 \], \[ 18, 75, 47, 31, 76, 48 \], \[ 34, 54, 24, 34, 55, 25 \], \[ 20, 45, 15, 61, 46, 16 \] \], QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) \{
  171. var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
  172. if (rsBlock == undefined) throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
  173. var length = rsBlock.length / 3, list = \[\];
  174. for (var i = 0; i < length; i++) \{
  175. var count = rsBlock\[i \* 3 + 0\], totalCount = rsBlock\[i \* 3 + 1\], dataCount = rsBlock\[i \* 3 + 2\];
  176. for (var j = 0; j < count; j++) list.push(new QRRSBlock(totalCount, dataCount));
  177. \}
  178. return list;
  179. \}, QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) \{
  180. switch (errorCorrectLevel) \{
  181. case QRErrorCorrectLevel.L:
  182. return QRRSBlock.RS\_BLOCK\_TABLE\[(typeNumber - 1) \* 4 + 0\];
  183. case QRErrorCorrectLevel.M:
  184. return QRRSBlock.RS\_BLOCK\_TABLE\[(typeNumber - 1) \* 4 + 1\];
  185. case QRErrorCorrectLevel.Q:
  186. return QRRSBlock.RS\_BLOCK\_TABLE\[(typeNumber - 1) \* 4 + 2\];
  187. case QRErrorCorrectLevel.H:
  188. return QRRSBlock.RS\_BLOCK\_TABLE\[(typeNumber - 1) \* 4 + 3\];
  189. default:
  190. return undefined;
  191. \}
  192. \}, QRBitBuffer.prototype = \{
  193. "get": function(index) \{
  194. var bufIndex = Math.floor(index / 8);
  195. return (this.buffer\[bufIndex\] >>> 7 - index % 8 & 1) == 1;
  196. \},
  197. "put": function(num, length) \{
  198. for (var i = 0; i < length; i++) this.putBit((num >>> length - i - 1 & 1) == 1);
  199. \},
  200. "getLengthInBits": function() \{
  201. return this.length;
  202. \},
  203. "putBit": function(bit) \{
  204. var bufIndex = Math.floor(this.length / 8);
  205. this.buffer.length <= bufIndex && this.buffer.push(0), bit && (this.buffer\[bufIndex\] |= 128 >>> this.length % 8), this.length++;
  206. \}
  207. \};
  208. var QRCodeLimitLength=\[\[17,14,11,7\],\[32,26,20,14\],\[53,42,32,24\],\[78,62,46,34\],\[106,84,60,44\],\[134,106,74,58\],\[154,122,86,64\],\[192,152,108,84\],\[230,180,130,98\],\[271,213,151,119\],\[321,251,177,137\],\[367,287,203,155\],\[425,331,241,177\],\[458,362,258,194\],\[520,412,292,220\],\[586,450,322,250\],\[644,504,364,280\],\[718,560,394,310\],\[792,624,442,338\],\[858,666,482,382\],\[929,711,509,403\],\[1003,779,565,439\],\[1091,857,611,461\],\[1171,911,661,511\],\[1273,997,715,535\],\[1367,1059,751,593\],\[1465,1125,805,625\],\[1528,1190,868,658\],\[1628,1264,908,698\],\[1732,1370,982,742\],\[1840,1452,1030,790\],\[1952,1538,1112,842\],\[2068,1628,1168,898\],\[2188,1722,1228,958\],\[2303,1809,1283,983\],\[2431,1911,1351,1051\],\[2563,1989,1423,1093\],\[2699,2099,1499,1139\],\[2809,2213,1579,1219\],\[2953,2331,1663,1273\]\];
  209. function \_isSupportCanvas() \{
  210. return typeof CanvasRenderingContext2D != "undefined";
  211. \}
  212. // android 2.x doesn't support Data-URI spec
  213. function \_getAndroid() \{
  214. var android = false;
  215. var sAgent = navigator.userAgent;
  216. if (/android/i.test(sAgent)) \{ // android
  217. android = true;
  218. aMat = sAgent.toString().match(/android (\[0-9\]\\.\[0-9\])/i);
  219. if (aMat && aMat\[1\]) \{
  220. android = parseFloat(aMat\[1\]);
  221. \}
  222. \}
  223. return android;
  224. \}
  225. var svgDrawer = (function() \{
  226. var Drawing = function (el, htOption) \{
  227. this.\_el = el;
  228. this.\_htOption = htOption;
  229. \};
  230. Drawing.prototype.draw = function (oQRCode) \{
  231. var \_htOption = this.\_htOption;
  232. var \_el = this.\_el;
  233. var nCount = oQRCode.getModuleCount();
  234. var nWidth = Math.floor(\_htOption.width / nCount);
  235. var nHeight = Math.floor(\_htOption.height / nCount);
  236. this.clear();
  237. function makeSVG(tag, attrs) \{
  238. var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
  239. for (var k in attrs)
  240. if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs\[k\]);
  241. return el;
  242. \}
  243. var svg = makeSVG("svg" , \{'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': \_htOption.colorLight\});
  244. svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
  245. \_el.appendChild(svg);
  246. svg.appendChild(makeSVG("rect", \{"fill": \_htOption.colorDark, "width": "1", "height": "1", "id": "template"\}));
  247. for (var row = 0; row < nCount; row++) \{
  248. for (var col = 0; col < nCount; col++) \{
  249. if (oQRCode.isDark(row, col)) \{
  250. var child = makeSVG("use", \{"x": String(row), "y": String(col)\});
  251. child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "\#template")
  252. svg.appendChild(child);
  253. \}
  254. \}
  255. \}
  256. \};
  257. Drawing.prototype.clear = function () \{
  258. while (this.\_el.hasChildNodes())
  259. this.\_el.removeChild(this.\_el.lastChild);
  260. \};
  261. return Drawing;
  262. \})();
  263. var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
  264. // Drawing in DOM by using Table tag
  265. var Drawing = useSVG ? svgDrawer : !\_isSupportCanvas() ? (function () \{
  266. var Drawing = function (el, htOption) \{
  267. this.\_el = el;
  268. this.\_htOption = htOption;
  269. \};
  270. /\*\*
  271. \* Draw the QRCode
  272. \*
  273. \* @param \{QRCode\} oQRCode
  274. \*/
  275. Drawing.prototype.draw = function (oQRCode) \{
  276. var \_htOption = this.\_htOption;
  277. var \_el = this.\_el;
  278. var nCount = oQRCode.getModuleCount();
  279. var nWidth = Math.floor(\_htOption.width / nCount);
  280. var nHeight = Math.floor(\_htOption.height / nCount);
  281. var aHTML = \['<table style="border:0;border-collapse:collapse;">'\];
  282. for (var row = 0; row < nCount; row++) \{
  283. aHTML.push('<tr>');
  284. for (var col = 0; col < nCount; col++) \{
  285. aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? \_htOption.colorDark : \_htOption.colorLight) + ';"></td>');
  286. \}
  287. aHTML.push('</tr>');
  288. \}
  289. aHTML.push('</table>');
  290. \_el.innerHTML = aHTML.join('');
  291. // Fix the margin values as real size.
  292. var elTable = \_el.childNodes\[0\];
  293. var nLeftMarginTable = (\_htOption.width - elTable.offsetWidth) / 2;
  294. var nTopMarginTable = (\_htOption.height - elTable.offsetHeight) / 2;
  295. if (nLeftMarginTable > 0 && nTopMarginTable > 0) \{
  296. elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
  297. \}
  298. \};
  299. /\*\*
  300. \* Clear the QRCode
  301. \*/
  302. Drawing.prototype.clear = function () \{
  303. this.\_el.innerHTML = '';
  304. \};
  305. return Drawing;
  306. \})() : (function () \{ // Drawing in Canvas
  307. function \_onMakeImage() \{
  308. this.\_elImage.src = this.\_elCanvas.toDataURL("image/png");
  309. this.\_elImage.style.display = "block";
  310. this.\_elCanvas.style.display = "none";
  311. \}
  312. // Android 2.1 bug workaround
  313. // http://code.google.com/p/android/issues/detail?id=5141
  314. if (this.\_android && this.\_android <= 2.1) \{
  315. var factor = 1 / window.devicePixelRatio;
  316. var drawImage = CanvasRenderingContext2D.prototype.drawImage;
  317. CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) \{
  318. if (("nodeName" in image) && /img/i.test(image.nodeName)) \{
  319. for (var i = arguments.length - 1; i >= 1; i--) \{
  320. arguments\[i\] = arguments\[i\] \* factor;
  321. \}
  322. \} else if (typeof dw == "undefined") \{
  323. arguments\[1\] \*= factor;
  324. arguments\[2\] \*= factor;
  325. arguments\[3\] \*= factor;
  326. arguments\[4\] \*= factor;
  327. \}
  328. drawImage.apply(this, arguments);
  329. \};
  330. \}
  331. /\*\*
  332. \* Check whether the user's browser supports Data URI or not
  333. \*
  334. \* @private
  335. \* @param \{Function\} fSuccess Occurs if it supports Data URI
  336. \* @param \{Function\} fFail Occurs if it doesn't support Data URI
  337. \*/
  338. function \_safeSetDataURI(fSuccess, fFail) \{
  339. var self = this;
  340. self.\_fFail = fFail;
  341. self.\_fSuccess = fSuccess;
  342. // Check it just once
  343. if (self.\_bSupportDataURI === null) \{
  344. var el = document.createElement("img");
  345. var fOnError = function() \{
  346. self.\_bSupportDataURI = false;
  347. if (self.\_fFail) \{
  348. \_fFail.call(self);
  349. \}
  350. \};
  351. var fOnSuccess = function() \{
  352. self.\_bSupportDataURI = true;
  353. if (self.\_fSuccess) \{
  354. self.\_fSuccess.call(self);
  355. \}
  356. \};
  357. el.onabort = fOnError;
  358. el.onerror = fOnError;
  359. el.onload = fOnSuccess;
  360. el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
  361. return;
  362. \} else if (self.\_bSupportDataURI === true && self.\_fSuccess) \{
  363. self.\_fSuccess.call(self);
  364. \} else if (self.\_bSupportDataURI === false && self.\_fFail) \{
  365. self.\_fFail.call(self);
  366. \}
  367. \};
  368. /\*\*
  369. \* Drawing QRCode by using canvas
  370. \*
  371. \* @constructor
  372. \* @param \{HTMLElement\} el
  373. \* @param \{Object\} htOption QRCode Options
  374. \*/
  375. var Drawing = function (el, htOption) \{
  376. this.\_bIsPainted = false;
  377. this.\_android = \_getAndroid();
  378. this.\_htOption = htOption;
  379. this.\_elCanvas = document.createElement("canvas");
  380. this.\_elCanvas.width = htOption.width;
  381. this.\_elCanvas.height = htOption.height;
  382. el.appendChild(this.\_elCanvas);
  383. this.\_el = el;
  384. this.\_oContext = this.\_elCanvas.getContext("2d");
  385. this.\_bIsPainted = false;
  386. this.\_elImage = document.createElement("img");
  387. this.\_elImage.alt = "Scan me!";
  388. this.\_elImage.style.display = "none";
  389. this.\_el.appendChild(this.\_elImage);
  390. this.\_bSupportDataURI = null;
  391. \};
  392. /\*\*
  393. \* Draw the QRCode
  394. \*
  395. \* @param \{QRCode\} oQRCode
  396. \*/
  397. Drawing.prototype.draw = function (oQRCode) \{
  398. var \_elImage = this.\_elImage;
  399. var \_oContext = this.\_oContext;
  400. var \_htOption = this.\_htOption;
  401. var nCount = oQRCode.getModuleCount();
  402. var nWidth = \_htOption.width / nCount;
  403. var nHeight = \_htOption.height / nCount;
  404. var nRoundedWidth = Math.round(nWidth);
  405. var nRoundedHeight = Math.round(nHeight);
  406. \_elImage.style.display = "none";
  407. this.clear();
  408. for (var row = 0; row < nCount; row++) \{
  409. for (var col = 0; col < nCount; col++) \{
  410. var bIsDark = oQRCode.isDark(row, col);
  411. var nLeft = col \* nWidth;
  412. var nTop = row \* nHeight;
  413. \_oContext.strokeStyle = bIsDark ? \_htOption.colorDark : \_htOption.colorLight;
  414. \_oContext.lineWidth = 1;
  415. \_oContext.fillStyle = bIsDark ? \_htOption.colorDark : \_htOption.colorLight;
  416. \_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
  417. // ?? ???? ?? ??
  418. \_oContext.strokeRect(
  419. Math.floor(nLeft) + 0.5,
  420. Math.floor(nTop) + 0.5,
  421. nRoundedWidth,
  422. nRoundedHeight
  423. );
  424. \_oContext.strokeRect(
  425. Math.ceil(nLeft) - 0.5,
  426. Math.ceil(nTop) - 0.5,
  427. nRoundedWidth,
  428. nRoundedHeight
  429. );
  430. \}
  431. \}
  432. this.\_bIsPainted = true;
  433. \};
  434. /\*\*
  435. \* Make the image from Canvas if the browser supports Data URI.
  436. \*/
  437. Drawing.prototype.makeImage = function () \{
  438. if (this.\_bIsPainted) \{
  439. \_safeSetDataURI.call(this, \_onMakeImage);
  440. \}
  441. \};
  442. /\*\*
  443. \* Return whether the QRCode is painted or not
  444. \*
  445. \* @return \{Boolean\}
  446. \*/
  447. Drawing.prototype.isPainted = function () \{
  448. return this.\_bIsPainted;
  449. \};
  450. /\*\*
  451. \* Clear the QRCode
  452. \*/
  453. Drawing.prototype.clear = function () \{
  454. this.\_oContext.clearRect(0, 0, this.\_elCanvas.width, this.\_elCanvas.height);
  455. this.\_bIsPainted = false;
  456. \};
  457. /\*\*
  458. \* @private
  459. \* @param \{Number\} nNumber
  460. \*/
  461. Drawing.prototype.round = function (nNumber) \{
  462. if (!nNumber) \{
  463. return nNumber;
  464. \}
  465. return Math.floor(nNumber \* 1000) / 1000;
  466. \};
  467. return Drawing;
  468. \})();
  469. /\*\*
  470. \* Get the type by string length
  471. \*
  472. \* @private
  473. \* @param \{String\} sText
  474. \* @param \{Number\} nCorrectLevel
  475. \* @return \{Number\} type
  476. \*/
  477. function \_getTypeNumber(sText, nCorrectLevel) \{
  478. var nType = 1;
  479. var length = \_getUTF8Length(sText);
  480. for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) \{
  481. var nLimit = 0;
  482. switch (nCorrectLevel) \{
  483. case QRErrorCorrectLevel.L :
  484. nLimit = QRCodeLimitLength\[i\]\[0\];
  485. break;
  486. case QRErrorCorrectLevel.M :
  487. nLimit = QRCodeLimitLength\[i\]\[1\];
  488. break;
  489. case QRErrorCorrectLevel.Q :
  490. nLimit = QRCodeLimitLength\[i\]\[2\];
  491. break;
  492. case QRErrorCorrectLevel.H :
  493. nLimit = QRCodeLimitLength\[i\]\[3\];
  494. break;
  495. \}
  496. if (length <= nLimit) \{
  497. break;
  498. \} else \{
  499. nType++;
  500. \}
  501. \}
  502. if (nType > QRCodeLimitLength.length) \{
  503. throw new Error("Too long data");
  504. \}
  505. return nType;
  506. \}
  507. function \_getUTF8Length(sText) \{
  508. var replacedText = encodeURI(sText).toString().replace(/\\%\[0-9a-fA-F\]\{2\}/g, 'a');
  509. return replacedText.length + (replacedText.length != sText ? 3 : 0);
  510. \}
  511. /\*\*
  512. \* @class QRCode
  513. \* @constructor
  514. \* @example
  515. \* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
  516. \*
  517. \* @example
  518. \* var oQRCode = new QRCode("test", \{
  519. \* text : "http://naver.com",
  520. \* width : 128,
  521. \* height : 128
  522. \* \});
  523. \*
  524. \* oQRCode.clear(); // Clear the QRCode.
  525. \* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
  526. \*
  527. \* @param \{HTMLElement|String\} el target element or 'id' attribute of element.
  528. \* @param \{Object|String\} vOption
  529. \* @param \{String\} vOption.text QRCode link data
  530. \* @param \{Number\} \[vOption.width=256\]
  531. \* @param \{Number\} \[vOption.height=256\]
  532. \* @param \{String\} \[vOption.colorDark="\#000000"\]
  533. \* @param \{String\} \[vOption.colorLight="\#ffffff"\]
  534. \* @param \{QRCode.CorrectLevel\} \[vOption.correctLevel=QRCode.CorrectLevel.H\] \[L|M|Q|H\]
  535. \*/
  536. QRCode = function (el, vOption) \{
  537. this.\_htOption = \{
  538. width : 256,
  539. height : 256,
  540. typeNumber : 4,
  541. colorDark : "\#000000",
  542. colorLight : "\#ffffff",
  543. correctLevel : QRErrorCorrectLevel.H
  544. \};
  545. if (typeof vOption === 'string') \{
  546. vOption = \{
  547. text : vOption
  548. \};
  549. \}
  550. // Overwrites options
  551. if (vOption) \{
  552. for (var i in vOption) \{
  553. this.\_htOption\[i\] = vOption\[i\];
  554. \}
  555. \}
  556. if (typeof el == "string") \{
  557. el = document.getElementById(el);
  558. \}
  559. this.\_android = \_getAndroid();
  560. this.\_el = el;
  561. this.\_oQRCode = null;
  562. this.\_oDrawing = new Drawing(this.\_el, this.\_htOption);
  563. if (this.\_htOption.text) \{
  564. this.makeCode(this.\_htOption.text);
  565. \}
  566. \};
  567. /\*\*
  568. \* Make the QRCode
  569. \*
  570. \* @param \{String\} sText link data
  571. \*/
  572. QRCode.prototype.makeCode = function (sText) \{
  573. this.\_oQRCode = new QRCodeModel(\_getTypeNumber(sText, this.\_htOption.correctLevel), this.\_htOption.correctLevel);
  574. this.\_oQRCode.addData(sText);
  575. this.\_oQRCode.make();
  576. this.\_el.title = sText;
  577. this.\_oDrawing.draw(this.\_oQRCode);
  578. this.makeImage();
  579. \};
  580. /\*\*
  581. \* Make the Image from Canvas element
  582. \* - It occurs automatically
  583. \* - Android below 3 doesn't support Data-URI spec.
  584. \*
  585. \* @private
  586. \*/
  587. QRCode.prototype.makeImage = function () \{
  588. if (typeof this.\_oDrawing.makeImage == "function" && (!this.\_android || this.\_android >= 3)) \{
  589. this.\_oDrawing.makeImage();
  590. \}
  591. \};
  592. /\*\*
  593. \* Clear the QRCode
  594. \*/
  595. QRCode.prototype.clear = function () \{
  596. this.\_oDrawing.clear();
  597. \};
  598. /\*\*
  599. \* @name QRCode.CorrectLevel
  600. \*/
  601. QRCode.CorrectLevel = QRErrorCorrectLevel;

})();

以上就是qrcode.js,引入成功后在页面上写下如下代码:

<!DOCTYPE html>




















发表评论

表情:
评论列表 (有 0 条评论,547人围观)

还没有评论,来说两句吧...

相关阅读