您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Preloads the next image/tease
// ==UserScript== // @name Milovana Preload // @namespace https://greasyfork.org/en/users/167665-zoecl // @description Preloads the next image/tease // @include https://milovana.com/webteases/showtease.php?id=* // @version 1.0.0 // @grant GM_addStyle // ==/UserScript== let preload = { init: function () { this.current_tease = document.getElementById('cm_wide'); this.next_page = this.get_next_page(); if (!this.next_page) { console.log('Could not find next page.'); return; } this.preload(); this.add_event_listeners(); }, get_next_page: function () { return document.getElementById('continue').href; }, preload: function () { this.preloading = 1; fetch(this.next_page, { credentials: 'include' }) .then(function (response) { return response.text(); }) .then(this.got_response.bind(this)); }, add_event_listeners: function () { for (let link of document.links) { if (link.href == this.next_page) { link.addEventListener('click', this.init_insert_tease.bind(this)); } } }, got_response: function (response) { let doc = new DOMParser().parseFromString(response, 'text/html'); this.next_tease = document.importNode(doc.getElementById('cm_wide'), 1); this.next_image = this.next_tease.getElementsByClassName('tease_pic')[0]; this.next_image.addEventListener('load', this.finish_preload.bind(this)); }, finish_preload: function (event) { this.preloading = 0; if (this.insert_asap) { this.insert_asap = 0; document.body.classList.remove('preloading'); if (this.fallback) { this.fallback = window.clearTimeout(this.fallback); } this.insert_tease(); } }, init_insert_tease: function (event) { event.preventDefault(); if (this.preloading) { this.insert_asap = 1; /* change cursor */ document.body.classList.add('preloading'); /* add timer in case preloading fails */ if (!this.fallback) { this.fallback = window.setTimeout(this.force_next.bind(this), 1000); } return; } this.insert_tease(); }, insert_tease: function (tease) { window.history.pushState(this.next_page, document.title, this.next_page); this.current_tease.replaceWith(this.next_tease); this.init(); }, force_next: function () { window.location = this.next_page; }, popstate: function (event) { /* force reload */ window.location.reload(1); }, }; try { preload.init(); window.addEventListener('popstate', preload.popstate); GM_addStyle('body.preloading * { cursor: progress; }'); } catch (error) { console.log(error); }