Previews cover image when hovering over hyperlinks that lead to Novel Updates series pages & some other pages. Forked from [The Original Version Made By SZ] (https://greasyfork.org/en/scripts/26439-novelupdates-cover-preview).
The NovelUpdatesCoverPreview.user.js is a TamperMonkey script that previews covers when hovering over links to series, movies or shows.
novelupdates.com, scribblehub.com, webnovel.com, royalroad.com, mangadex.org, mangaupdates.com, tvmaze.com, imdb.com, mydramalist.com, wiki.d-addicts.com, and asianwiki.com.novelupdatesforum.com, scribblehubforum.com, and subdomains (e.g., www, m).UpdateAtCacheAge milliseconds (or until the script version changes) to ensure instant loading.| Key | Action |
|---|---|
| 1 | Switch between detailed and simple popup style |
| 2 | Switch between description and tags (detailed mode) |
| 3 | Switch between small and big popup style |
| 4 | Pause/unpause auto-scrolling content |
| 5 | Reload cover data for the currently hovered link |
| 6 | Reload all links on current page (ignore network budget) |
| 7 | Cache all non-cached links on current page (ignore network budget) |
| 9 | Clear all cached cover data |
| A | Show alternative titles (hold to view) |
| F | Freeze/unfreeze the popup (pinned for interaction) |
| I | Toggle preloading/loading state icons next to links |
| P | Toggle reading list icons and title display |
| H | Show this hotkey list (hold to view) |
The following settings can be configured at the top of the script (before // END User Settings):
syncLinksByCacheKey to
atomically update all duplicate links and preloader queues.preloaderLoop to stop cycling once discovery
exhaustion is reached.file://
URLs for development.onunload to
pagehide for more reliable observer disconnection.MaximumTotalPreloads (global) and MaximumSitePreloads (per-site) budget tracking using the Preloads state object.tv.com, mtlnovel.com, and
batoto (Bato.to).f hotkey to freeze the popup and pin it for
interaction.
MaximumTotalPreloads limit to ensure all links on the page are processed.imdb.com may fail if the browser blocks cross-origin requests to IMDB API
without a recent session.scribblehubforum.com.https://scribblehub.com/profile/13352/nazgand/https://royalroad.com/my/favoriteshttps://royalroad.com/fictions/trendinghttps://www.webnovel.com/book/26009105205673805 - the [You May Also Like]
sectionhttps://www.tvmaze.com/showsThe script uses a centralized syncLinksByCacheKey mechanism to ensure absolute
consistency across all links.
data-cache-key: During discovery, every link is tagged with its normalized
series ID (from getLinkToSeriesPage). The sanitization logic unifies legacy
domains (e.g., royalroadl.com -> royalroad.com), strips parameters, and
removes www. to ensure cache hits across inconsistent DOM hosts.data-cache-key.Preloads[siteKey].PendingNodes queue.preloadedUrlSet.The system stability depends on the interaction between three asynchronous forces: User Interaction, the Preloader Background Engine, and DOM Mutation Events.
| Force 1: User Action (Foreground) | Force 2: Preloader Engine (Background) | Force 3: DOM Mutation (Observer) |
|---|---|---|
| 1. Mouse Enter Link | 1. Loop Tick (PreloadDelayMs) per site |
1. DOM Change Detected |
2. syncLinksByCacheKey: Loading |
2. Check Per-Site & Global Budgets | 2. hidePopUp |
| 3. Fetch/Parse Page | 3. syncLinksByCacheKey: Loading |
3. Full Page Re-discovery |
4. syncLinksByCacheKey: Finished |
4. Fetch/Parse Page | |
5. syncLinksByCacheKey: Finished |
Cross-Force Synchronization & Interaction:
pendingPreloadNodes during the syncLinksByCacheKey: Loading phase to
prevent double-fetching.
preloadedUrlSet (History) upon completion via syncLinksByCacheKey: Finished.Preloads[siteKey].InProgress++ & Preloads['AllSites'].InProgress++.Preloads[siteKey].Completed++ & Preloads['AllSites'].Completed++.preloadedUrlSet to skip redundant network requests.
For Chromium optimization, the script retains rawNetworkUrl parameters
during misses to leverage native browser network cache states mapped to
original tags.Deterministic geometric constraints ensure zero-overlap and constant visibility.
.transition
CSS properties, structurally guaranteeing physically instant 1-frame native
HTML paints without sequential Javascript transition stutters.popupGap): 5px fixed gap from anchor (link) in all directions.window.innerWidth).windowMargin (9px padding) to prevent the popup from touching viewport edges.popupGap.*tryToGetTextContent recursively extracts text and links while preserving UPIB styling and converting br tags.39 ** 6 ms (~40.7 days).
Background updateStatus validation runs transparently to re-verify expired
cache objects.
drawLinkToPopupLine() bridge verifies coordinate
integrity.
cacheCurrentPage() function triggers immediately. This ensures that the
"latest version" of the content is always cached, overriding any existing
stale entries.