您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
14/02/2025, 4:56:16 pm
// ==UserScript== // @name hacker news - scroll to next most outer post // @namespace Violentmonkey Scripts // @match https://news.ycombinator.com/item* // @grant none // @version 1.0 // @license MIT // @author - // @require https://cdn.jsdelivr.net/npm/@violentmonkey/shortcut@1 // @description 14/02/2025, 4:56:16 pm // ==/UserScript== const { register } = VM.shortcut; const viewportHeight = window.innerHeight const outerMostCommentElements = Array.from(document.querySelectorAll(".comment-tree>tbody>tr:has(td[indent='0'])")) VM.shortcut.register('n', () => { if(document.activeElement.type === 'textarea'){ // Is this hackey? maybe. document.activeElement.value+="n" return } const scrollY = window.scrollY || window.pageYOffset; const buffer = 50; // Buffer for invisible padding // Find the next element below viewport const nextElement = outerMostCommentElements.find(elem => { const elemTop = elem.getBoundingClientRect().top; return elemTop >= (viewportHeight - buffer); }); if (nextElement) { nextElement.scrollIntoView({ behavior: "smooth", block: "center" }); } // else { // // If no next element found, scroll to the last element // const lastElement = outerMostCommentElements[outerMostCommentElements.length - 1]; // if (lastElement && lastElement.getBoundingClientRect().top < (viewportHeight - buffer)) { // lastElement.scrollIntoView({ behavior: "smooth", block: "center" }); // } // } // for (const elem of outerMostCommentElements){ // const elemYPosition = elem.getBoundingClientRect().top // // -50 to give it a bit of a buffer as there is invisible padding and stuff. // const elemIsBelowBottomViewport = elemYPosition >= (document.body.scrollTop + (viewportHeight - 50)) // console.log(elemIsBelowBottomViewport) // console.log(elem.getAttribute("id")) // if(elemIsBelowBottomViewport){ // elem.scrollIntoView({behavior:"smooth", block:"center"}) // break // } // } });