Greasy Fork is available in English.
Enables infinite scroll on Brave Search
// ==UserScript== // @name Brave Infinite Scroll // @description Enables infinite scroll on Brave Search // @match *://search.brave.com/search* // @run-at document-end // @version 0.0.1.20250309090434 // @namespace https://greasyfork.org/users/1435046 // ==/UserScript== let pageNumber = 1; let isLoading = false; let hasMore = true; const fetchNextPage = async () => { const baseUrl = new URL(window.location.href); baseUrl.searchParams.set('offset', pageNumber); try { const response = await fetch(baseUrl.toString()); const text = await response.text(); const newDoc = new DOMParser().parseFromString(text, 'text/html'); // Create container for new r###lts const container = document.createElement('div'); container.id = `page-${pageNumber}`; container.style.marginTop = '20px'; // Add new r###lts (adjust selector based on Brave's structure) newDoc.querySelectorAll('#r###lts > .snippet').forEach(r###lt => { container.appendChild(r###lt.cloneNode(true)); }); // Find insertion point (before pagination element) const insertionPoint = document.querySelector('#pagination-snippet') || document.querySelector('#r###lts').lastElementChild; if (insertionPoint) { insertionPoint.before(container); } // Check for more pages (look for Next button) hasMore = !!newDoc.querySelector('a[href*="offset="]:not([disabled])'); if (hasMore) pageNumber++; } catch (error) { console.error('Error fetching next page:', error); hasMore = false; } }; window.addEventListener('scroll', async () => { const scrollThreshold = 1000; const scrollPosition = window.innerHeight + window.scrollY; const scrollMax = document.documentElement.scrollHeight - scrollThreshold; if (!isLoading && hasMore && scrollPosition >= scrollMax) { isLoading = true; await fetchNextPage(); isLoading = false; } });