知乎键盘快捷键

给知乎 Nweb 页面增加键盘快捷键,方便使用

  1. // ==UserScript==
  2. // @name 知乎键盘快捷键
  3. // @namespace https://www.zhihu.com/people/yin-xiao-bo-11
  4. // @version 0.1
  5. // @description 给知乎 Nweb 页面增加键盘快捷键,方便使用
  6. // @author Veg
  7. // @include *.zhihu.com/*
  8. // @grant none
  9. // ==/UserScript==
  10. (function() {
  11. setTimeout(function() {
  12. proc(document);
  13. amo(proc);
  14. }, 10);
  15. function proc(d) {
  16. var url = window.location.href;
  17. var tokens = url.substring(20);
  18. var token = tokens.split('/');
  19. //回答页快捷键
  20. if (token[1] == 'question') {
  21. var answer = document.querySelectorAll('div.AnswerItem');
  22. for (var i = 0, l = answer.length; i < l; i++) {
  23. var pq = answer[i].querySelector('p.p-serialNumber');
  24. if (pq == null) {
  25. var p = document.createElement("p");
  26. p.innerHTML = i + 1;
  27. p.className = 'p-serialNumber';
  28. answer[i].insertBefore(p, answer[i].firstChild);
  29. }
  30. answer[i].setAttribute('focuss', i);
  31. var tabindex = answer[i].getAttribute('tabindex');
  32. if (tabindex == null) {
  33. answer[i].setAttribute('tabindex', '-1');
  34. answer[i].addEventListener("keydown", shortcutKey, null);
  35. }
  36. }
  37. }
  38.  
  39. if (token[1] !== 'question') {
  40. //非问答页快捷键
  41. var timeline = document.querySelectorAll('div.TopstoryItem,div.List-item');
  42. for (var i = 0, l = timeline.length; i < l; i++) {
  43. var pq = timeline[i].querySelector('p.p-serialNumber');
  44. if (pq == null) {
  45. var p = document.createElement("p");
  46. p.innerHTML = i + 1;
  47. p.className = 'p-serialNumber';
  48. timeline[i].insertBefore(p, timeline[i].firstChild);
  49. }
  50. timeline[i].setAttribute('focuss', i);
  51. var tabindex = timeline[i].getAttribute('tabindex');
  52. if (tabindex == null) {
  53. timeline[i].setAttribute('tabindex', '-1');
  54. timeline[i].addEventListener("keydown", shortcutKey, null);
  55. }
  56. }
  57. }
  58.  
  59. }
  60. function amo(processFunction) {;
  61. var mcallback = function(records) {
  62. records.forEach(function(record) {
  63. if (record.type == 'childList' && record.addedNodes.length > 0) {
  64. var newNodes = record.addedNodes;
  65. for (var i = 0, len = newNodes.length; i < len; i++) {
  66. if (newNodes[i].nodeType == 1) {
  67. processFunction(newNodes[i]);
  68. }
  69. }
  70. }
  71. });
  72. };
  73. var mo = new MutationObserver(mcallback);
  74. mo.observe(document.body, {
  75. 'childList': true,
  76. 'subtree': true
  77. });
  78. }
  79. })();
  80.  
  81. //导航和操作快捷键函数
  82. function shortcutKey(k) {
  83. if (k.target == this) {
  84. if (k.keyCode == 13) {
  85. var name = this.innerText;
  86. navigator.clipboard.writeText(name);
  87. }
  88. }
  89. var focusElement = document.activeElement;
  90. var role = focusElement.getAttribute('role');
  91. if (role == 'textbox' || k.altKey || k.ctrlKey) return false;
  92. var feed = document.querySelectorAll('div[focuss]');
  93. var focussValue = this.getAttribute('focuss');
  94. var number = parseInt(focussValue);
  95. if (k.keyCode == 65) {
  96. if (focussValue !== null) {
  97. k.stopPropagation();
  98. feed[number + 1].focus();
  99. }
  100. }
  101. if (k.keyCode == 90) {
  102. if (focussValue !== null) {
  103. k.stopPropagation();
  104. feed[number - 1].focus();
  105. }
  106. }
  107. if (k.keyCode == 87) {
  108. if (this.querySelector('button.ContentItem-rightButton') == null) {
  109. this.querySelector('button.ContentItem-more').click();
  110. this.focus();
  111. } else {
  112. var x = this.querySelector('button.ContentItem-rightButton');
  113. x.focus();
  114. x.click();
  115. this.focus();
  116. }
  117. }
  118. if (k.keyCode == 86) {
  119. if (this.querySelector('button.VoteButton--up') == null) {
  120. this.querySelector('button.LikeButton').click();
  121. this.querySelector('button.LikeButton').focus();
  122. } else {
  123. this.querySelector('button.VoteButton--up').click();
  124. this.querySelector('button.VoteButton--up').focus();
  125. }
  126. }
  127. if (k.keyCode == 68) {
  128. this.querySelector('button.VoteButton--down').click();
  129. this.querySelector('button.VoteButton--down').focus();
  130. }
  131. var operation = this.querySelectorAll('button.Button--withLabel');
  132. if (k.keyCode == 67) {
  133. if (this.querySelector('div.Comments-container') == null) {
  134. operation[0].click();
  135. } else {
  136. operation[0].click();
  137. operation[0].focus();
  138. }
  139. }
  140. if (k.keyCode == 70) {
  141. operation[1].focus();
  142. operation[1].click();
  143. }
  144. if (k.keyCode == 83) {
  145. operation[2].focus();
  146. operation[2].click();
  147. }
  148. if (k.keyCode == 84) {
  149. operation[3].focus();
  150. operation[3].click();
  151. }
  152.  
  153. }
  154.  
  155. //导航快捷键在非内容区的功能
  156. document.body.addEventListener("keydown",
  157. function(k) {
  158. var focusElement = document.activeElement;
  159. var role = focusElement.getAttribute('role');
  160. var input = focusElement.tagName;
  161. if (role == 'textbox' || input == 'INPUT' || input == 'TEXTAREA' || role == 'combobox') return false;
  162. var content = document.querySelectorAll('div[focuss]');
  163. for (var i = 0, l = content.length; i < l; i++) {
  164. if (k.keyCode == 65) {
  165. content[0].focus();
  166. }
  167. if (k.keyCode == 90) {
  168. content[l - 1].focus();
  169. }
  170. }
  171. var downReason = document.querySelectorAll('div.VoteDownReasonMenu-reason');
  172. for (var i = 0; i < downReason.length; i++) {
  173. if (k.keyCode == 49) {
  174. downReason[0].click();
  175. }
  176. if (k.keyCode == 50) {
  177. downReason[1].click();
  178. }
  179. if (k.keyCode == 51) {
  180. downReason[2].click();
  181. }
  182. if (k.keyCode == 52) {
  183. downReason[3].click();
  184. }
  185. }
  186. globalShortcutKey(k);
  187. },
  188. null);
  189.  
  190. //全局快捷键函数
  191. function globalShortcutKey(k) {
  192. if (k.keyCode == 113) {
  193. var x = document.querySelector("div.CommentItem"); {
  194. x.setAttribute("tabindex", "-1");
  195. x.focus();
  196. }
  197. }
  198. if (k.altKey && k.keyCode == 81) {
  199. var gb = document.querySelectorAll("button.ContentItem-action");
  200. for (var i = 0; i < gb.length; i++) {
  201. var gbName = gb[i].innerText;
  202. if (gbName == "收起评论" || gbName == "​收起评论") {
  203. gb[i].click();
  204. gb[i].focus();
  205. }
  206. }
  207. }
  208. if (k.altKey && k.keyCode == 49) {
  209. var f = document.querySelectorAll("a.QuestionMainAction,a.NumberBoard-item,a[href='/lives'],button.follow-button,button.NumberBoard-itemWrapper"); {
  210. f[0].focus();
  211. }
  212. }
  213. if (k.altKey && k.keyCode == 50) {
  214. document.querySelector("button.PaginationButton-prev").focus();
  215. }
  216. if (k.altKey && k.keyCode == 51) {
  217. document.querySelector("button.PaginationButton-next").focus();
  218. }
  219. if (k.altKey && k.keyCode == 52) {
  220. var gd = document.querySelector('a.zu-button-more'); {
  221. gd.setAttribute('tabindex', '0');
  222. gd.focus();
  223. }
  224. }
  225. if (k.ctrlKey && k.keyCode == 81) {
  226. document.querySelector('a[href="/watch"]').focus();
  227. }
  228. if (k.altKey && k.keyCode == 88) {
  229. document.querySelector('button.NumberBoard-item').focus();
  230. document.querySelector('button.QuestionHeader-edit').focus();
  231. }
  232. }

QingJ © 2025

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