index.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /**
  2. * FeHelper QR Code Tools
  3. */
  4. new Vue({
  5. el: '#pageContainer',
  6. data: {
  7. textContent: '',
  8. qrSize: 200,
  9. qrColor: '#000000',
  10. useIcon: 'no',
  11. previewSrc: '',
  12. resultContent: '',
  13. qrEncodeMode: true,
  14. showResult: false
  15. },
  16. mounted: function () {
  17. let mode = new URL(location.href).searchParams.get('mode');
  18. this.qrEncodeMode = mode !== 'decode';
  19. // 在tab创建或者更新时候,监听事件,看看是否有参数传递过来
  20. if (location.protocol === 'chrome-extension:') {
  21. chrome.tabs.query({currentWindow: true,active: true, }, (tabs) => {
  22. let activeTab = tabs.filter(tab => tab.active)[0];
  23. chrome.runtime.sendMessage({
  24. type: 'fh-dynamic-any-thing',
  25. thing: 'request-page-content',
  26. tabId: activeTab.id
  27. }).then(resp => {
  28. if(!resp) return ;
  29. let text = resp.content || (resp.tab ? (resp.tab.fromTab ? resp.tab.fromTab.url : '') : '');
  30. if (text) {
  31. if (!this.qrEncodeMode) {
  32. // 解码模式
  33. this._qrDecode(text);
  34. } else {
  35. this.textContent = text;
  36. this.convert();
  37. }
  38. }
  39. });
  40. });
  41. }
  42. this.$refs.codeSource && this.$refs.codeSource.focus();
  43. // 拖拽注册
  44. document.addEventListener('drop', (evt) => {
  45. evt.preventDefault();
  46. evt.stopPropagation();
  47. let files = evt.dataTransfer.files;
  48. if (files.length) {
  49. if (this.qrEncodeMode) {
  50. this._drawIcon(files[0]);
  51. } else {
  52. this._decodeLocal(files[0]);
  53. }
  54. }
  55. }, false);
  56. document.addEventListener('dragover', (e) => {
  57. e.preventDefault();
  58. e.stopPropagation();
  59. }, false);
  60. //监听paste事件
  61. document.addEventListener('paste', (event) => {
  62. if (this.qrEncodeMode) return;
  63. this.paste(event);
  64. }, false);
  65. // color picker绑定
  66. $("#opt_fc").colorpicker({
  67. fillcolor: true,
  68. success: (obj, color) => {
  69. this.qrColor = color;
  70. this.convert();
  71. }
  72. })
  73. },
  74. methods: {
  75. convert: function () {
  76. this.showResult = true;
  77. this.$nextTick(() => {
  78. if (this.textContent) {
  79. $('#preview').html('').qrcode(this._createOptions());
  80. } else {
  81. $('#preview').html('再在输入框里输入一些内容,就能生成二维码了哦~')
  82. }
  83. });
  84. },
  85. fileChanged: function (event) {
  86. if (event.target.files.length) {
  87. if (this.qrEncodeMode) {
  88. this._drawIcon(event.target.files[0]);
  89. } else {
  90. this._decodeLocal(event.target.files[0]);
  91. }
  92. event.target.value = '';
  93. }
  94. },
  95. _drawIcon: function (file) {
  96. if (/image\//.test(file.type)) {
  97. this.useIcon = 'custom';
  98. let reader = new FileReader();
  99. reader.onload = (evt) => {
  100. this.$refs.logoCustom.src = evt.target.result;
  101. this.convert();
  102. };
  103. reader.readAsDataURL(file);
  104. } else {
  105. alert('请选择图片文件!');
  106. }
  107. },
  108. _createOptions: function () {
  109. let defaultOptions = {
  110. render: 'canvas',
  111. minVersion: 1,
  112. maxVersion: 40,
  113. ecLevel: 'L',
  114. left: 0,
  115. top: 0,
  116. size: +this.qrSize || 200,
  117. fill: this.qrColor,
  118. background: '#fff',
  119. radius: 0,
  120. quiet: 0,
  121. text: this.textContent,
  122. mode: 0,
  123. mSize: 0.15,
  124. mPosX: 0.5,
  125. mPosY: 0.5,
  126. label: 'FH',
  127. fontname: 'sans',
  128. fontcolor: '#f00',
  129. image: false
  130. };
  131. // 判断是否需要设置icon
  132. switch (this.useIcon) {
  133. case 'default':
  134. defaultOptions.mode = 4;
  135. defaultOptions.image = this.$refs.logoDefault;
  136. break;
  137. case 'custom':
  138. defaultOptions.mode = 4;
  139. defaultOptions.image = this.$refs.logoCustom;
  140. break;
  141. }
  142. return defaultOptions;
  143. },
  144. trans: function () {
  145. this.qrEncodeMode = !this.qrEncodeMode;
  146. },
  147. select: function () {
  148. this.$refs.resultBox.select();
  149. },
  150. _decodeLocal: function (file) {
  151. let reader = new FileReader();
  152. reader.onload = (e) => {
  153. this._qrDecode(e.target.result);
  154. };
  155. reader.readAsDataURL(file);
  156. },
  157. paste: function (event) {
  158. let items = event.clipboardData.items || {};
  159. // 优先处理图片
  160. for (let index in items) {
  161. let item = items[index];
  162. if (/image\//.test(item.type)) {
  163. let file = item.getAsFile();
  164. return this._decodeLocal(file);
  165. }
  166. }
  167. // 然后处理url
  168. try {
  169. // 逐个遍历
  170. (async () => {
  171. for (let index in items) {
  172. let item = items[index];
  173. if (/text\/plain/.test(item.type)) {
  174. let url = await new Promise(resolve => {
  175. item.getAsString(url => resolve(url))
  176. });
  177. let flag = await new Promise(resolve => {
  178. this._qrDecode(url, flag => resolve(flag));
  179. });
  180. if (flag) break;
  181. }
  182. }
  183. })();
  184. } catch (ex) {
  185. // 只能处理一个了
  186. for (let index in items) {
  187. let item = items[index];
  188. if (/text\/plain/.test(item.type)) {
  189. return item.getAsString(url => {
  190. this._qrDecode(url);
  191. });
  192. }
  193. }
  194. }
  195. },
  196. /**
  197. * 二维码转码
  198. * @param imgSrc
  199. * @param callback
  200. */
  201. _qrDecode: function (imgSrc, callback) {
  202. let self = this;
  203. const codeReader = new ZXing.BrowserMultiFormatReader();
  204. let image = new Image();
  205. image.src = imgSrc;
  206. image.setAttribute('crossOrigin', 'Anonymous');
  207. image.onload = function () {
  208. codeReader.decodeFromImage(this).then((result) => {
  209. self._showDecodeResult(imgSrc, result.text);
  210. callback && callback(result.text);
  211. }).catch((err) => {
  212. self._showDecodeResult(imgSrc, err);
  213. callback && callback(err);
  214. });
  215. };
  216. image.onerror = function (e) {
  217. callback && callback(false);
  218. alert('抱歉,当前图片无法被解码,请保存图片再拖拽进来试试!')
  219. };
  220. },
  221. _showDecodeResult: function (src, txt) {
  222. this.previewSrc = src;
  223. this.$refs.panelBox.style.backgroundImage = 'none';
  224. this.resultContent = txt;
  225. }
  226. }
  227. });