Hacker News Infinite Scroll

Adds infinite scroll to HackerNews

  1. // ==UserScript==
  2. // @description Adds infinite scroll to HackerNews
  3. // @name Hacker News Infinite Scroll
  4. // @namespace Violentmonkey Scripts
  5. // @match https://news.ycombinator.com/
  6. // @version 1.1.0
  7. // @grant none
  8. // ==/UserScript==
  9.  
  10. const regex = new RegExp(/<center>.*(<table id="hnmain".*)<\/center>/gms);
  11. let moreLinkAnchor = document.querySelector('td.title > a.morelink');
  12. let count = 2;
  13.  
  14. function getHTML(url) {
  15. return new Promise(function (resolve, reject) {
  16. var xhr = new XMLHttpRequest();
  17. xhr.open('get', url, true);
  18. xhr.responseType = 'document';
  19. xhr.onload = function () {
  20. var status = xhr.status;
  21. if (status == 200) {
  22. resolve(xhr.response.documentElement.innerHTML);
  23. } else {
  24. reject(status);
  25. }
  26. };
  27. xhr.send();
  28. });
  29. }
  30.  
  31. let tableName = (document.querySelector('table.itemlist') === null) ? "comment-tree" : "itemlist"
  32.  
  33. const insertAfter = (el, referenceNode) => {
  34. referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);
  35. }
  36.  
  37. const isMoreLink = elm => {
  38. return [...elm.getElementsByTagName("*")].map(e => e.className).includes('morelink');
  39. }
  40.  
  41. const parseNextPage = (nextPage, tableType, moreTr) => {
  42. const page = new DOMParser().parseFromString(nextPage, 'text/html');
  43. let queryStr = (tableType === 'comment-tree') ? `table.${tableType} tr.athing` : `table.${table.class} tr`
  44. let newTrs = [...page.querySelectorAll(queryStr)];
  45. if (tableType === 'comment-tree' && newTrs.length < 259) {
  46. noMoreLeft = true;
  47. moreTr.nextElementSibling.style.display = "none";
  48. }
  49. let filteredTrs = (tableType === 'itemlist') ? newTrs.filter(e => !isMoreLink(e)) : newTrs
  50. filteredTrs.forEach(tr => {
  51. if (tr.className !== "morespace") {
  52. moreTr.parentNode.insertBefore(tr, moreTr)
  53. }
  54. });
  55. }
  56.  
  57. let noMoreLeft = false;
  58. window.onscroll = async function() {
  59. if (((window.innerHeight + Math.ceil(window.pageYOffset)) >= document.body.offsetHeight) && (noMoreLeft !== true)) {
  60. console.log('bottom of page reached');
  61. let testResponse;
  62. let parsed;
  63. if (moreLinkAnchor !== null) {
  64. //let table;
  65. let moreLink = /^(.*?p=)/.exec(moreLinkAnchor['href'])[0];
  66. let nextPage = `${moreLink}${count}`;
  67. table = document.querySelector('table.itemlist') === null ? {
  68. class: "comment-tree",
  69. element: document.querySelector('table.comment-tree')
  70. } : {
  71. class: "itemlist",
  72. element: document.querySelector('table.itemlist')
  73. };
  74. let tableRowMore = table.element.querySelector('.morespace');
  75. let pageRes = await getHTML(nextPage);
  76. parseNextPage(pageRes, table.class, tableRowMore)
  77. count++;
  78. }
  79. }
  80. };

QingJ © 2025

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