Show QRCode

显示网页二维码

  1. // ==UserScript==
  2. // @name Show QRCode
  3. // @name:en Show QRCode
  4. // @namespace http://tampermonkey.net/
  5. // @version 0.3
  6. // @description 显示网页二维码
  7. // @description:en show current page qrcode
  8. // @author whbb
  9. // @match http://*/*
  10. // @match https://*/*
  11. // @require https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js
  12. // @require https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js
  13. // @require https://cdn.bootcss.com/vex-js/3.0.0/js/vex.combined.min.js
  14. // @resource vexCSS https://cdn.bootcss.com/vex-js/3.0.0/css/vex.min.css
  15. // @resource vexTheme https://cdn.bootcss.com/vex-js/3.0.0/css/vex-theme-default.min.css
  16. // @grant GM_addStyle
  17. // @grant GM_getResourceText
  18. // @grant GM_setValue
  19. // @grant GM_getValue
  20. // @grant GM_registerMenuCommand
  21. // ==/UserScript==
  22.  
  23. (function () {
  24. 'use strict';
  25.  
  26. var keyboardMap = [
  27. "", // [0]
  28. "", // [1]
  29. "", // [2]
  30. "CANCEL", // [3]
  31. "", // [4]
  32. "", // [5]
  33. "HELP", // [6]
  34. "", // [7]
  35. "BACK_SPACE", // [8]
  36. "TAB", // [9]
  37. "", // [10]
  38. "", // [11]
  39. "CLEAR", // [12]
  40. "ENTER", // [13]
  41. "ENTER_SPECIAL", // [14]
  42. "", // [15]
  43. "SHIFT", // [16]
  44. "CONTROL", // [17]
  45. "ALT", // [18]
  46. "PAUSE", // [19]
  47. "CAPS_LOCK", // [20]
  48. "KANA", // [21]
  49. "EISU", // [22]
  50. "JUNJA", // [23]
  51. "FINAL", // [24]
  52. "HANJA", // [25]
  53. "", // [26]
  54. "ESCAPE", // [27]
  55. "CONVERT", // [28]
  56. "NONCONVERT", // [29]
  57. "ACCEPT", // [30]
  58. "MODECHANGE", // [31]
  59. "SPACE", // [32]
  60. "PAGE_UP", // [33]
  61. "PAGE_DOWN", // [34]
  62. "END", // [35]
  63. "HOME", // [36]
  64. "LEFT", // [37]
  65. "UP", // [38]
  66. "RIGHT", // [39]
  67. "DOWN", // [40]
  68. "SELECT", // [41]
  69. "PRINT", // [42]
  70. "EXECUTE", // [43]
  71. "PRINTSCREEN", // [44]
  72. "INSERT", // [45]
  73. "DELETE", // [46]
  74. "", // [47]
  75. "0", // [48]
  76. "1", // [49]
  77. "2", // [50]
  78. "3", // [51]
  79. "4", // [52]
  80. "5", // [53]
  81. "6", // [54]
  82. "7", // [55]
  83. "8", // [56]
  84. "9", // [57]
  85. "COLON", // [58]
  86. "SEMICOLON", // [59]
  87. "LESS_THAN", // [60]
  88. "EQUALS", // [61]
  89. "GREATER_THAN", // [62]
  90. "QUESTION_MARK", // [63]
  91. "AT", // [64]
  92. "A", // [65]
  93. "B", // [66]
  94. "C", // [67]
  95. "D", // [68]
  96. "E", // [69]
  97. "F", // [70]
  98. "G", // [71]
  99. "H", // [72]
  100. "I", // [73]
  101. "J", // [74]
  102. "K", // [75]
  103. "L", // [76]
  104. "M", // [77]
  105. "N", // [78]
  106. "O", // [79]
  107. "P", // [80]
  108. "Q", // [81]
  109. "R", // [82]
  110. "S", // [83]
  111. "T", // [84]
  112. "U", // [85]
  113. "V", // [86]
  114. "W", // [87]
  115. "X", // [88]
  116. "Y", // [89]
  117. "Z", // [90]
  118. "OS_KEY", // [91] Windows Key (Windows) or Command Key (Mac)
  119. "", // [92]
  120. "CONTEXT_MENU", // [93]
  121. "", // [94]
  122. "SLEEP", // [95]
  123. "NUMPAD0", // [96]
  124. "NUMPAD1", // [97]
  125. "NUMPAD2", // [98]
  126. "NUMPAD3", // [99]
  127. "NUMPAD4", // [100]
  128. "NUMPAD5", // [101]
  129. "NUMPAD6", // [102]
  130. "NUMPAD7", // [103]
  131. "NUMPAD8", // [104]
  132. "NUMPAD9", // [105]
  133. "MULTIPLY", // [106]
  134. "ADD", // [107]
  135. "SEPARATOR", // [108]
  136. "SUBTRACT", // [109]
  137. "DECIMAL", // [110]
  138. "DIVIDE", // [111]
  139. "F1", // [112]
  140. "F2", // [113]
  141. "F3", // [114]
  142. "F4", // [115]
  143. "F5", // [116]
  144. "F6", // [117]
  145. "F7", // [118]
  146. "F8", // [119]
  147. "F9", // [120]
  148. "F10", // [121]
  149. "F11", // [122]
  150. "F12", // [123]
  151. "F13", // [124]
  152. "F14", // [125]
  153. "F15", // [126]
  154. "F16", // [127]
  155. "F17", // [128]
  156. "F18", // [129]
  157. "F19", // [130]
  158. "F20", // [131]
  159. "F21", // [132]
  160. "F22", // [133]
  161. "F23", // [134]
  162. "F24", // [135]
  163. "", // [136]
  164. "", // [137]
  165. "", // [138]
  166. "", // [139]
  167. "", // [140]
  168. "", // [141]
  169. "", // [142]
  170. "", // [143]
  171. "NUM_LOCK", // [144]
  172. "SCROLL_LOCK", // [145]
  173. "WIN_OEM_FJ_JISHO", // [146]
  174. "WIN_OEM_FJ_MASSHOU", // [147]
  175. "WIN_OEM_FJ_TOUROKU", // [148]
  176. "WIN_OEM_FJ_LOYA", // [149]
  177. "WIN_OEM_FJ_ROYA", // [150]
  178. "", // [151]
  179. "", // [152]
  180. "", // [153]
  181. "", // [154]
  182. "", // [155]
  183. "", // [156]
  184. "", // [157]
  185. "", // [158]
  186. "", // [159]
  187. "CIRCUMFLEX", // [160]
  188. "EXCLAMATION", // [161]
  189. "DOUBLE_QUOTE", // [162]
  190. "HASH", // [163]
  191. "DOLLAR", // [164]
  192. "PERCENT", // [165]
  193. "AMPERSAND", // [166]
  194. "UNDERSCORE", // [167]
  195. "OPEN_PAREN", // [168]
  196. "CLOSE_PAREN", // [169]
  197. "ASTERISK", // [170]
  198. "PLUS", // [171]
  199. "PIPE", // [172]
  200. "HYPHEN_MINUS", // [173]
  201. "OPEN_CURLY_BRACKET", // [174]
  202. "CLOSE_CURLY_BRACKET", // [175]
  203. "TILDE", // [176]
  204. "", // [177]
  205. "", // [178]
  206. "", // [179]
  207. "", // [180]
  208. "VOLUME_MUTE", // [181]
  209. "VOLUME_DOWN", // [182]
  210. "VOLUME_UP", // [183]
  211. "", // [184]
  212. "", // [185]
  213. "SEMICOLON", // [186]
  214. "EQUALS", // [187]
  215. "COMMA", // [188]
  216. "MINUS", // [189]
  217. "PERIOD", // [190]
  218. "SLASH", // [191]
  219. "BACK_QUOTE", // [192]
  220. "", // [193]
  221. "", // [194]
  222. "", // [195]
  223. "", // [196]
  224. "", // [197]
  225. "", // [198]
  226. "", // [199]
  227. "", // [200]
  228. "", // [201]
  229. "", // [202]
  230. "", // [203]
  231. "", // [204]
  232. "", // [205]
  233. "", // [206]
  234. "", // [207]
  235. "", // [208]
  236. "", // [209]
  237. "", // [210]
  238. "", // [211]
  239. "", // [212]
  240. "", // [213]
  241. "", // [214]
  242. "", // [215]
  243. "", // [216]
  244. "", // [217]
  245. "", // [218]
  246. "OPEN_BRACKET", // [219]
  247. "BACK_SLASH", // [220]
  248. "CLOSE_BRACKET", // [221]
  249. "QUOTE", // [222]
  250. "", // [223]
  251. "META", // [224]
  252. "ALTGR", // [225]
  253. "", // [226]
  254. "WIN_ICO_HELP", // [227]
  255. "WIN_ICO_00", // [228]
  256. "", // [229]
  257. "WIN_ICO_CLEAR", // [230]
  258. "", // [231]
  259. "", // [232]
  260. "WIN_OEM_RESET", // [233]
  261. "WIN_OEM_JUMP", // [234]
  262. "WIN_OEM_PA1", // [235]
  263. "WIN_OEM_PA2", // [236]
  264. "WIN_OEM_PA3", // [237]
  265. "WIN_OEM_WSCTRL", // [238]
  266. "WIN_OEM_CUSEL", // [239]
  267. "WIN_OEM_ATTN", // [240]
  268. "WIN_OEM_FINISH", // [241]
  269. "WIN_OEM_COPY", // [242]
  270. "WIN_OEM_AUTO", // [243]
  271. "WIN_OEM_ENLW", // [244]
  272. "WIN_OEM_BACKTAB", // [245]
  273. "ATTN", // [246]
  274. "CRSEL", // [247]
  275. "EXSEL", // [248]
  276. "EREOF", // [249]
  277. "PLAY", // [250]
  278. "ZOOM", // [251]
  279. "", // [252]
  280. "PA1", // [253]
  281. "WIN_OEM_CLEAR", // [254]
  282. "" // [255]
  283. ];
  284.  
  285. const vexCss = GM_getResourceText('vexCSS')
  286. const vexTheme = GM_getResourceText('vexTheme')
  287. GM_addStyle(vexCss)
  288. GM_addStyle(vexTheme)
  289.  
  290. vex.defaultOptions.className = 'vex-theme-default'
  291. const setting = {}, defaultSetting = {
  292. keyList: '81,82'.split(','),
  293. setting: false,
  294. isCtrl: true,
  295. isAlt: true,
  296. isShift: false,
  297. settingError: false,
  298. }
  299.  
  300. function defineProperty(obj, key, onchange) {
  301. let value = obj[key]
  302. Object.defineProperty(obj, key, {
  303. get: function() { return value },
  304. set: function(val) {
  305. if(onchange) {
  306. onchange(val, value)
  307. }
  308. value = val
  309. }
  310. })
  311. }
  312.  
  313. function setInit() {
  314. Object.keys(defaultSetting).forEach(function(key) {
  315. setting[key] = GM_getValue(key, defaultSetting[key])
  316. })
  317. setting.settingError = false
  318. }
  319.  
  320. function setDefault() {
  321. Object.keys(defaultSetting).forEach(function(key) {
  322. setting[key] = defaultSetting[key]
  323. })
  324. setting.settingError = false
  325. }
  326.  
  327. for(let key in defaultSetting) {
  328. setInit()
  329. defineProperty(setting, key, function(val) {
  330. let _ = null
  331. switch(key) {
  332. case 'keyList':
  333. $('#qr-shortcut').val(val.map(function(keyCode) { return keyboardMap[keyCode] }))
  334. setting.settingError = !val.length
  335. break;
  336. case 'setting':
  337. _ = val ? $('#qr-setting').show() : $('#qr-setting').hide()
  338. $('#qr-set-button-arrow').html(val ? '▼ ' : '▶ ')
  339. break;
  340. case 'isCtrl':
  341. case 'isAlt':
  342. case 'isShift':
  343. $('#qr-' + key).css('background', val ? 'red' : '#aaa')
  344. break;
  345. case 'settingError':
  346. $('#qr-shortcut').css('border', val ? '1px solid red' : 'none')
  347. break;
  348. }
  349. })
  350. }
  351.  
  352. GM_registerMenuCommand('QrCode Default', setDefault)
  353.  
  354. let q = 0
  355. document.onkeydown = function (e) {
  356. if ((!setting.isCtrl || e.ctrlKey) && (!setting.isAlt || e.altKey) && (!setting.isShift || e.shiftKey)) {
  357. if (setting.keyList[q] == e.which && setting.keyList.length === q + 1) {
  358. vex.dialog.open({
  359. message: location.href,
  360. input: ['<div id="qr-qrcode" style="width: 256px; margin: 20px auto"></div>',
  361. '<div id="qr-set-part" style="border: 1px solid #ccc; padding-left: 10px;">',
  362. '<div id="qr-set-button" style="cursor: pointer;"><span id="qr-set-button-arrow">&#9654; </span>Setting</div>',
  363. '<div id="qr-setting" style="display: none; margin: 10px 20px; font-size: 14px;" >',
  364. '<label style=""> ',
  365. 'Shortcut: <input id="qr-shortcut" style="height: 24px;" >',
  366. '<label id="qr-isCtrl" class="qr-mod-key" style="margin: 0 5px; padding: 0 5px; border: 1px solid #aaa; background: #ccc; cursor: pointer;"> Ctrl </label>',
  367. '<label id="qr-isAlt" class="qr-mod-key" style="margin: 0 5px; padding: 0 5px; border: 1px solid #aaa; background: #ccc; cursor: pointer;"> Alt </label>',
  368. '<label id="qr-isShift" class="qr-mod-key" style="margin: 0 5px; padding: 0 5px; border: 1px solid #aaa; background: #ccc; cursor: pointer;"> Shift </label>',
  369. '</label>',
  370. '<br><label id="qr-setting-default" style="display: inline-block; line-height: 24px; margin: 20px 0 0; padding: 0 5px; border: 1px solid #aaa; background: #ccc; cursor: pointer;">default</label>',
  371. '</div>',
  372. '</div>'
  373. ].join(''),
  374. buttons: [vex.dialog.buttons.YES],
  375. onSubmit: function(e) {
  376. e.preventDefault()
  377. if(setting.keyList.length) {
  378. this.close()
  379. GM_setValue('keyList', setting.keyList)
  380. GM_setValue('isCtrl', setting.isCtrl)
  381. GM_setValue('isAlt', setting.isAlt)
  382. GM_setValue('isShift', setting.isShift)
  383. }
  384. }
  385. })
  386.  
  387. setTimeout(function () {
  388. setInit()
  389. $('#qr-qrcode').qrcode(location.href)
  390.  
  391. $('#qr-set-button').click(function(e) {
  392. setting.setting = !setting.setting
  393.  
  394. e.stopPropagation()
  395. e.preventDefault()
  396. })
  397.  
  398. $('.qr-mod-key').click(function(e) {
  399. const key = e.target.id.substr(3)
  400. setting[key] = !setting[key]
  401. })
  402.  
  403. $('#qr-shortcut').keyup(function(e) {
  404. setting.settingError = false
  405. if(e.which === keyboardMap.indexOf('BACK_SPACE')) {
  406. setting.keyList = setting.keyList.slice(0, setting.keyList.length - 1)
  407. } else if(keyboardMap[e.which]) {
  408. setting.keyList = setting.keyList.concat(e.which)
  409. }
  410. })
  411.  
  412. $('#qr-setting-default').click(function(e) {
  413. setDefault()
  414. setting.setting = true
  415. })
  416. }, 0);
  417.  
  418. e.stopPropagation()
  419. e.preventDefault()
  420. }
  421. q = setting.keyList[q] == e.which ? q + 1 : 0
  422. }
  423. }
  424. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址