- // ==UserScript==
- // @name 漫画下一话
- // @namespace http://tampermonkey.net/
- // @version 0.24
- // @description x键下一话,滑轮到底下一话,支持非下拉式转下拉式阅读
- // @author You
- // @match https://www.2mzx.com/manhua/*
- // @match https://manga.bilibili.com/*
- // @match http://www.6mh7.com/*
- // @match http://www.manhuaju.com/*
- // @match https://www.kanbl.cc/chapter/*
- // @license MIT
- // @grant unsafeWindow
- // @run-at document-end
- // ==/UserScript==
-
- (function() {
- let window = unsafeWindow
- //对应域名规则
- let ruler={
- //优先用button,然后是url切换下一话
- 'www.2mzx.com':{//下拉式
- 'add_button':"body > div:nth-child(14) > a.next",//修改某个按钮为下一话,可选
- 'next_button_or_function':'',//已有的下一话button或者函数,没有为空,如果是函数,结尾必须为(),用于切换下一页时点击或执行,与url至少有一个
- 'url':/(\d+)\.html/,//下一话url,用于切换下一页,没有为空,与next_button至少有一个
- 'min_height':10000,//最小文档高度,小于此高度时,认为没有划到底
- 'observer':'',//出现时换页 [出现的对象,另外的验证方法]
- },
- 'manga.bilibili.com':{//自建frame
- 'add_button':"",
- 'next_button_or_function':"div.load-next-btn-container > button",
- 'url':/\/(\d+)/,
- 'min_height':0,
- 'observer':["div.load-next-btn-container > button",function(){return(/\d+/.exec(document.querySelector(" div.ps__rail-y > div").style.top)[0]>200)}] //出现时换页 [出现的对象,另外的验证方法] 弃用 ->//监控scroll无效时[对象,属性,值]
- },
- 'www.6mh7.com':{//下拉式
- 'add_button':"",
- 'next_button_or_function':"#mainControlNext",
- 'url':/(\d+)\.html/,
- 'min_height':0,
- 'observer':["#mainControlNext",function(){return(document.querySelector("#comicContain").childElementCount>=1)}] //出现时换页 [下页按钮出现时,已经加载至少1张图片] 弃用 ->//监控scroll无效时[对象,属性,值]
- },
- 'www.manhuaju.com':{//单页阅读式漫画
- 'init':function(){//初始化函数,页面加载后将先进行,将单页阅读的漫画改为下拉式阅读
- let urls = window.qTcms_S_m_murl;
- urls=urls.split("$qingtiandy$")
- let s=''
- for(let i of urls){
- s+='<img width="1200" src="'+i+'">'
- }
- document.querySelector("#qTcms_Pic_middle > tbody > tr > td").innerHTML=s},
- 'add_button':"",
- 'next_button_or_function':"a_f_qTcms_Pic_nextarr_Href()",//下一话为执行函数
- 'url':'',
- 'min_height':0,
- 'observer':["div.footer",function(){return(document.querySelector("#qTcms_Pic_middle > tbody > tr > td").childElementCount>=2)}] //出现时换页 [下页按钮出现时,已经加载至少2张图片] 弃用 ->//监控scroll无效时[对象,属性,值]
- },
- 'www.kanbl.cc':{
- // 'init':function(){alert(1)},//不需要初始化
- 'add_button':"",
- 'tmpfunction': function(){//因为这个网站比较复杂,写个函数来操作下一页,函数名随意,在next_button_or_function调用
- let page = document.querySelector("body > div.container > div.footpage > select");
- if(page.childElementCount == Number(page.value)){
- //最後一頁
- document.querySelector("body > div.container > div.footpage > a.btn.nextpage").click();
- }else{
- let url = window.location.origin+window.location.pathname;
- let nexturl = url+'?page='+(Number(page.value)+1);
- window.location.href = nexturl;
- }
- },
- 'next_button_or_function':"ruler['www.kanbl.cc']['tmpfunction']()",//下一话为执行函数
- 'url':'',
- 'min_height':0,
- 'observer':["div.footpage",function(){return(document.querySelector("#content > div.comiclist").childElementCount>=1)}] //出现时换页 [下页按钮出现时,已经加载至少2张图片]
- },
- }
-
-
-
- ///////////////////////////////////////////////// main ///////////////////////////////////////////////////////
- // 滚动条在Y轴上的滚动距离
- function getScrollTop() {
- var scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0;
- if (document.body) {
- bodyScrollTop = document.body.scrollTop;
- }
- if (document.documentElement) {
- documentScrollTop = document.documentElement.scrollTop;
- }
- scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop;
- return scrollTop;
- }
-
- // 文档的总高度
- function getScrollHeight() {
- var scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0;
- if (document.body) {
- bodyScrollHeight = document.body.scrollHeight;
- }
- if (document.documentElement) {
- documentScrollHeight = document.documentElement.scrollHeight;
- }
- scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight;
- return scrollHeight;
- }
-
- // 浏览器视口的高度
- function getWindowHeight() {
- var windowHeight = 0;
- if (document.compatMode == "CSS1Compat") {
- windowHeight = document.documentElement.clientHeight;
- } else {
- windowHeight = document.body.clientHeight;
- }
- return windowHeight;
- }
-
- // 距离底部 px 距离返回 true
- function ifBottom() {
- if (getScrollTop() + getWindowHeight()>= getScrollHeight()) {
- return true;
- }
- return false;
- }
- function isString(str){
- return (typeof str=='string')&&str.constructor==String;
- }
- function checkInPage(){//是否出现在页面上
- let el = document.querySelector(data.observer[0])
- const pageHeight = document.documentElement.clientHeight
-
- const contentTop = el.getBoundingClientRect().top
- const contentHeight = el.offsetHeight
- return (contentTop<pageHeight && contentTop>=0) || (contentTop<0 && (contentTop+contentHeight>0));
- }
- function wheel(event){
- var delta = 0;
- if (!event) event = window.event;
- if (event.wheelDelta) {//IE、chrome浏览器使用的是wheelDelta,并且值为“正负120”
- delta = event.wheelDelta/120;
- if (window.opera) delta = -delta;//因为IE、chrome等向下滚动是负值,FF是正值,为了处理一致性,在此取反处理
- } else if (event.detail) {//FF浏览器使用的是detail,其值为“正负3”
- delta = -event.detail/3;
- }//上下滚动时的具体处理函数
- if(delta){
- if(checkInPage() &&data.observer[1]()){
- window.nextp()
-
- }
- };
- }
- function observe_wheel(){ //监控滚轮,出现某对象时调用方法
- if(window.addEventListener)//FF,火狐浏览器会识别该方法
- {window.addEventListener('DOMMouseScroll', wheel, false);
- window.onmousewheel = document.onmousewheel = wheel;//W3C
- }
- }
- /* 弃用--->>>>> setTimeout(()=>{//延时加载监控某属性值
- let item=data.observer
- var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
- let pass = setInterval(function() {
- var element = document.querySelector(item[0]);
- if (element) {
- clearInterval(pass)
- var observer = new MutationObserver(function(mutations) {
- console.log(element.style.top)
- if(isString(item[2])){
- if(element.style.top==item[2]){//达到监控值
- window.next()
- }
- }else{
- if(element.style.top>=item[2]){//达到监控值
- window.next()
- }
- }
- });
- observer.observe(element, {
- attributes: true,
- attributeFilter: ['style']
- });
- }})
- },3000) */
- ///////////////////////////////////////////////// 开始执行 ///////////////////////////////////////////////////////
- let data = ruler[window.location.hostname]
- //执行初始化函数,如将原先单页阅读的改为下拉式的
- if(data.init){data.init()}
-
- window.nextp = function(){//注册(不可用)全局方法
- //通过点击button或者改变url来换下一页
- if(data.next_button_or_function){
- if(data.next_button_or_function.indexOf('()')>-1){//function
- eval(data.next_button_or_function)
- }else{//btn
- document.querySelector(data.next_button_or_function).click()
- }
- }else if(data.url){
- let tmp = data.url.exec(window.location.href)[1] //去除要改变的url
- window.location.href = window.location.href.replace(tmp,String(parseInt(tmp)+1))//数字加一,下一话
- }else{
- console.log('!!!!!!!!!!!!error:没有配置下一话的操作')
- return
- }
- }
- //统一处理滚轮滚动事件
- //滑到底加载下一话,有的需要监控某值,其他默认为监控scroll划到底
- if(data.observer){
- setTimeout(
- observe_wheel//滚轮出现某元素时下一话
- ,5000)
- }else{
- window.document.addEventListener("scroll", function(){
- console.log(ifBottom(),getScrollHeight(),data.min_height)
- if(ifBottom() && (getScrollHeight()>=(data.min_height|| 1))){
- window.nextp()
- }
- })
- }
-
-
- //改变button
- if(data.add_button){
- document.querySelector(data.add_button).href = "javascript:nextp()"
- }
- //添加按键侦听 x键下一话
- window.document.addEventListener("keydown", function(event){
- if(window.event.keyCode==88){
- window.nextp()
- }
- }
-
- )
- })();