Greasy Fork is available in English.
For Mangakakalot & Manganelo
当前为
// ==UserScript==
// @name Chapter Changer + Smooth Scrolling
// @description For Mangakakalot & Manganelo
// @version 0.7
// @namespace http://greasyfork.icu/en/users/55535-sllypper
// @author sllypper
// @match https://mangakakalot.com/chapter/*
// @match https://manganelo.com/chapter/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
let scrollAmount = 32;
let scrollFreq = 16;
let shiftSpeedMod = 2;
const states = {
NONE: 0,
UP: 1,
SHIFTUP: 2,
DOWN: 3,
SHIFTDOWN: 4
}
let scrollState = states.NONE;
let currScrollAction = null;
let buttons = document.getElementsByClassName('navi-change-chapter-btn');
if (buttons.length === 0) {
buttons = document.getElementsByClassName('btn-navigation-chap');
if (buttons.length === 0) return;
}
buttons = buttons[0].childNodes;
let prevButton = buttons[0];
let nextButton = buttons[buttons.length-1];
// if there's only one button
if (buttons.length != 2) {
// check if it's the next button
// mangakakalot has "back" and "next" button classes are switched around
if (buttons[0].classList.contains("back") || buttons[0].classList.contains("navi-change-chapter-btn-next")) {
// then we're in chapter 1 and there's no prev button
prevButton = null;
} else {
// else we're in the last chapter and there's no next button
nextButton = null;
}
}
document.addEventListener("keydown", event => {
if (event.code === "KeyW" || event.code === "KeyK") {
if (scrollState !== states.UP && !event.shiftKey) {
clearScrollAction();
scrollState = states.UP;
scrollAction(-scrollAmount, scrollFreq);
} else if (scrollState !== states.SHIFTUP && event.shiftKey) {
clearScrollAction();
scrollState = states.SHIFTUP;
scrollAction(-scrollAmount*shiftSpeedMod, scrollFreq);
}
} else if (event.code === "KeyS" || event.code === "KeyJ") {
if (scrollState !== states.DOWN && !event.shiftKey) {
clearScrollAction();
scrollState = states.DOWN;
scrollAction(scrollAmount, scrollFreq);
} else if (scrollState !== states.SHIFTDOWN && event.shiftKey) {
clearScrollAction();
scrollState = states.SHIFTDOWN;
scrollAction(scrollAmount*shiftSpeedMod, scrollFreq);
}
} else if (event.code === "KeyC" && nextButton != null) {
nextButton.click();
} else if (event.code === "KeyZ" && prevButton != null) {
prevButton.click();
}
});
document.addEventListener("keyup", event => {
if (event.code === "KeyW" || event.code === "KeyK") {
clearScrollAction();
} else if (event.code === "KeyS" || event.code === "KeyJ") {
clearScrollAction();
} else if (event.key === "Shift") {
clearScrollAction();
}
});
function scrollAction(amount, freq) {
currScrollAction = setInterval(() => {
window.scrollBy(0, amount);
}, freq)
}
function clearScrollAction() {
clearInterval(currScrollAction);
currScrollAction = null;
scrollState = states.NONE;
}
})();