Don't scroll on "Show Information"
- // ==UserScript==
- // @name WaniKani No Scroll
- // @namespace http://www.wanikani.com
- // @version 0.1.4
- // @description Don't scroll on "Show Information"
- // @author polv
- // @match *://www.wanikani.com/*
- // @match *://preview.wanikani.com/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=wanikani.com
- // @license MIT
- // @homepage https://github.com/patarapolw/wanikani-userscript/blob/master/userscripts/no-scroll.user.js
- // @grant none
- // ==/UserScript==
- // @ts-check
- (function () {
- 'use strict';
- const el = {
- quiz: /** @type {HTMLElement | null} */ (null),
- addtionalContent: /** @type {HTMLElement | null} */ (null),
- };
- const noScroll = ({ target }) => {
- target.scrollTop = 0;
- };
- const contentLoadedObserver = new MutationObserver((muts) => {
- const { quiz } = el;
- if (!quiz) return;
- for (const mut of muts) {
- const { target } = mut;
- if (
- target instanceof HTMLElement &&
- target.getAttribute('data-loaded') === 'true'
- ) {
- quiz.addEventListener('scroll', noScroll);
- setTimeout(() => {
- quiz.removeEventListener('scroll', noScroll);
- }, 500);
- break;
- }
- }
- });
- let intervalFindElement = 0;
- const startScript = () => {
- stopScript();
- intervalFindElement = setInterval(() => {
- el.addtionalContent = document.querySelector('turbo-frame#subject-info');
- if (!el.addtionalContent) return;
- el.quiz = document.querySelector('.quiz');
- if (!el.quiz) return;
- contentLoadedObserver.observe(el.addtionalContent, {
- attributes: true,
- attributeFilter: ['data-loaded'],
- });
- stopScript();
- }, 500);
- };
- const stopScript = () => {
- if (intervalFindElement) {
- clearInterval(intervalFindElement);
- intervalFindElement = 0;
- }
- };
- startScript();
- window.addEventListener('turbo:load', (e) => {
- // @ts-ignore
- const url = e.detail.url;
- if (!url) return;
- if (/(session|quiz|review|extra_study|subject-lessons)/.test(url)) {
- startScript();
- } else {
- stopScript();
- }
- });
- })();