// ==UserScript== // @name Beatsaver scroll to id // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author Dartv // @match https://beatsaver.com/browse/latest // @grant none // @downloadURL https://update.greasyfork.icu/scripts/402135/Beatsaver%20scroll%20to%20id.user.js // @updateURL https://update.greasyfork.icu/scripts/402135/Beatsaver%20scroll%20to%20id.meta.js // ==/UserScript== (function() { const createSearchInput = () => { const container = document.createElement('div'); container.innerHTML = ` `; container.style = 'position: absolute; top: 100px; right: 100px;'; document.body.appendChild(container); return document.getElementsByName('beatmapid')[0]; }; const observeLoader = (target, callback) => { const observer = new MutationObserver((mutations) => { mutations.forEach(({ type, removedNodes }) => { if (type === 'childList') { if (Array.from(removedNodes).some(node => node.classList && node.classList.contains('loader-container'))) { callback(); } } }); }); const options = { subtree: true, childList: true, }; observer.observe(target, options); return observer; }; const init = () => { let observer; const input = createSearchInput(); const target = document.getElementsByClassName('container')[1]; input.addEventListener('blur', (e) => { const id = e.target.value; if (observer) observer.disconnect(); if (id.length === 4) { const scrollToBeatmap = () => { const elem = document.getElementById(id); if (elem) { observer.disconnect(); elem.scrollIntoViewIfNeeded(); elem.style.border = '5px solid green'; return; } target.scrollIntoView(false); }; observer = observeLoader(target, scrollToBeatmap); scrollToBeatmap(); } }); }; window.addEventListener('load', init); })();