動漫屋/動漫之家/漫畫櫃/拷貝漫畫 鍵盤導覽

[a / ←]前一頁,[d / →]下一頁,[w / ↑]新一章,[s / ↓]舊一章,[q]新一頁留言,[e]舊一頁留言,[r]dm5載入全部留言_新到舊,[t]dm5載入全部留言_舊到新,[esc]中斷載入更多留言

目前為 2021-12-29 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name				dm5/dmzj/manhuagui - navigate with keyboard
// @name:zh-TW			動漫屋/動漫之家/漫畫櫃/拷貝漫畫 鍵盤導覽
// @name:zh-CN			动漫屋/动漫之家/漫画柜/拷貝漫畫 键盘导览
// @description			[a / ←]prev page,[d / →]next page,[w / ↑]next chapter,[s / ↓]prev chapter,[q]newer comments,[e]older comments
// @description:zh-TW	[a / ←]前一頁,[d / →]下一頁,[w / ↑]新一章,[s / ↓]舊一章,[q]新一頁留言,[e]舊一頁留言,[r]dm5載入全部留言_新到舊,[t]dm5載入全部留言_舊到新,[esc]中斷載入更多留言
// @description:zh-CN	[a / ←]前一页,[d / →]下一页,[w / ↑]新一章,[s / ↓]旧一章,[q]新一页留言,[e]旧一页留言,[r]dm5载入全部留言_新到旧,[t]dm5载入全部留言_旧到新,[esc]中断载入更多留言
// @author				Evan Tseng
// @namespace			https://greasyfork.org/zh-TW/users/393133-evan-tseng
// @version				1.0.10
// @match				*://*.dm5.com/*
// @match				*://*.dm5.cn/*
// @match				*://*.dmzj.com/*
// @match				*://*.dmzj1.com/*
// @match				*://*.mhgui.com/*
// @match				*://*.manhuagui.com/*
// @match				*://*.copymanga.com/*
// @match				*://*.copymanga.org/*
// @match				*://*.copymanga.info/*
// @exclude				*://*.dm5.com/manhua-new/
// @run-at				document-start
// @grant				GM.setValue
// @grant				GM.getValue
// @license				MIT
// ==/UserScript==

(async function() {
	'use strict';
	var mySetting;
	if((mySetting=await GM.getValue("setting", false)) == false){
		mySetting={ "dm5": { "loadAllComments": false } };
		GM.setValue("setting", mySetting);
	}

	let theHost = window.location.hostname.replace(/(?:[^\.]+\.)*(dm5|dmzj\d?|manhuagui|mhgui|copymanga)\.(?:cn|com|info|org)/, "$1");

	switch(theHost) {
		case "dm5":
			//	dm5 讀取留言・改
			var loadCmts=null;
			var getAllPost2 = async function(pageindex, pagesize, tid, type, rev=false, first=false) {
				var cid = 0;
				if (typeof (DM5_CID) != "undefined") {
					cid = DM5_CID;
				}
				$.ajax({
					url: 'pagerdata.ashx?d=' + new Date().getTime(),
					data: { pageindex: pageindex, pagesize: pagesize, tid: tid, mid:tid, cid: cid, t: type },
					error: function (msg) {
						//ShowDialog("服务器出现异常请重试");
					},
					success: function (json) {
						var objs = eval(json);
						var html = "";
						for (var i = 0; i < objs.length; i++) {
							var obj = rev ? objs[objs.length-1-i] : objs[i];
							html += "<li class=\"dashed\">";
							html += "<div class=\"cover\"><img src=\"";
							html += obj.HeadUrl;
							html += "\"/></div>";
							html += "<div class=\"info\">";
							html += "<p class=\"title\">";
							html += obj.Poster;
							if (obj.VipLevel > 0) {
								html += "<span class=\"vip\">VIP" + obj.VipLevel + "</span>";
								if (obj.VipType == 1) {
									html += "<span class=\"year\">年费</span>";
								}
							}
							html += "</p>";
							if (obj.ToPostShowDataItems) {
								var topostcount = obj.ToPostShowDataItems.length;
								for (var j = 0; j < obj.ToPostShowDataItems.length; j++) {
									var topost = obj.ToPostShowDataItems[j];
									if (j == 0) {
										html += '<ul class="child-list">'
									}
									if (topostcount >= 4) {
										if (j == 1) {
											html += '<li class="open"><a href="javascript:void(0);" class="openpostbtn" id="openpostbtn' + obj.ID + '" data="' + obj.ID + '">展开全部楼层</a></li>'
										}
										if (j == 0 || j == (topostcount - 1)) {
											html += '<li>';
										}
										else {
											html += '<li class="litopost' + obj.ID + '" style="display:none;">';
										}
									}
									else {
										html += '<li>';
									}
									html += '<div class="cover"><img src="' + topost.HeadUrl + '"></div><div class="info">';
									html += '<p class="title">' + topost.Poster;
									if (topost.VipLevel > 0) {
										html += "<span class=\"vip\">VIP" + topost.VipLevel + "</span>";
										if (topost.VipType == 1) {
											html += "<span class=\"year\">年费</span>";
										}
									}
									html += '</p><p class="content">' + topost.PostContent + '</p>';
									html += '<p class="bottom">' + topost.PostTime + '<span class="right">';
									html += "<a href=\"javascript:void(0)\" data=\"1\" pid=\"" + topost.Id + "\" ";
									html += " class=\"zan";
									if (topost.IsPraise) {
										html += " active";
									}
									html += " zanbtn\">";
									if (topost.PraiseCount > 0) {
										html += topost.PraiseCount;
									}
									else {
										html += "赞";
									}
									html += "</a>";
									html += "<a href=\"javascript:void(0)\"";
									html += " data=\""
									html += topost.Poster;
									html += " \" pid=\"";
									html += topost.Id;
									html += "\" class=\"";
									html += "comment recommentbtn";
									html += "\">";
									html += "评论";
									html += "</a></span></p>";
									if (j == (obj.ToPostShowDataItems.length - 1)) {
										html += '</ul>'
									}
								}
							}
							html += "<p class=\"content\">";
							html += obj.PostContent;
							html += "</p>";
							html += " <p class=\"bottom\">";
							html += obj.PostTime;
							html += "<span class=\"right\">";
							html += "<a href=\"javascript:void(0)\" data=\"1\" pid=\"" + obj.Id + "\" ";
							html += " class=\"zan";
							if (obj.IsPraise) {
								html += " active";
							}
							html += " zanbtn\">";
							if (obj.PraiseCount > 0) {
								html += obj.PraiseCount;
							}
							else {
								html += "赞";
							}
							html += "</a>"
							html += "<a href=\"javascript:void(0)\"";
							html += " data=\""
							html += obj.Poster;
							html += " \" pid=\"";
							html += obj.Id;
							html += "\" class=\"";
							html += "comment recommentbtn";
							html += "\">";
							html += "评论";
							html += "</a></span></p>";
							html += "</div></li>";
						}
						first? $(".postlist").html(html): $(".postlist").html($(".postlist").html()+html);
						$(".postlist").find(".recommentbtn").click(function () {
							$('body').addClass('toolbar');
							reComment($(this).attr("pid"), $(this).attr("data"), $(this));
						});
						$(".postlist").find(".openpostbtn").click(function () {
							openpost($(this));
						});
						$(".postlist").find(".zanbtn").click(function () {
							praisepost($(this).attr("pid"), $(this));
						});
						if(rev) {
							if(pageindex>1)	loadCmts=setTimeout(function(){ getAllPost2(pageindex-1, pagesize, tid, type, rev); }, 600);
							else	loadCmts=null;
						}
						else {
							if(pageindex<pagesize)	loadCmts=setTimeout(function(){ getAllPost2(pageindex+1, pagesize, tid, type, rev); }, 600);
							else	loadCmts=null;
						}
					}
				});
			}

			var dm5AllComments = async function(direction){
				$('#last-mask, #last-win').hide();
				if(direction=="f") {
					if (typeof (DM5_PAGETYPE) != "undefined") {
						if (DM5_PAGETYPE == 9) {
							getAllPost2(DM5_PAGEPCOUNT>100?100:DM5_PAGEPCOUNT, DM5_PAGEPCOUNT, DM5_TIEBATOPICID, DM5_PAGETYPE, true, true);
						}
						else if (DM5_PAGETYPE == 4) {
							getAllPost2(DM5_PAGEPCOUNT>100?100:DM5_PAGEPCOUNT, DM5_PAGEPCOUNT, DM5_COMIC_MID, DM5_PAGETYPE, true, true);
						}
					}
				}
				else {
					if (typeof (DM5_PAGETYPE) != "undefined") {
						if (DM5_PAGETYPE == 9) {
							getAllPost2(1, DM5_PAGEPCOUNT, DM5_TIEBATOPICID, DM5_PAGETYPE, false, true);
						}
						else if (DM5_PAGETYPE == 4) {
							getAllPost2(1, DM5_PAGEPCOUNT, DM5_COMIC_MID, DM5_PAGETYPE, false, true);
						}
					}
				}
				$(".view-comment-main .top .page, .view-comment-main .bottom-page").hide();
			}

			document.addEventListener('readystatechange', (event) => {
				if(document.readyState == 'interactive') {
					setTimeout(function(){
						let adutBtn = document.querySelector("#checkAdult");
						if(adutBtn)	adutBtn.click();
						if(document.querySelector(".view-comment-main .postlist")) {
							switch(mySetting.dm5.loadAllComments) {
								case "backward":
									dm5AllComments("b");
									break
								case "forward":
									dm5AllComments("f")
									break;
							}
						}
					}, 200);
				}
			});
			document.addEventListener('readystatechange', (event) => {
				if(document.readyState == 'load') {
					setTimeout(function(){
						//	抓取網址再重設漫畫列表的排序方式
						if(window.location.pathname.match(/^\/manhua\-list/)){
							window.location.pathname.replace(/\//g,"").split("-").forEach( (itm) => {
								if(itm.match(/^s\d+$/)) yqdm.params.sort = itm.replace("s","");
							});
						}
					}, 100);
				}
			});

			document.addEventListener("keydown", async function(e) {
				if(document.querySelector("input:focus, textarea:focus, [contenteditable='true']:focus") || (e.shiftKey | e.ctrlKey | e.altKey | e.metaKey | e.isComposing)) return;
				var PrevC, NextC, PrevP, NextP,
					ppa = document.querySelectorAll(".view-paging>.container>a");
				PrevC = NextC = PrevP = NextP = null;
				for(let i in ppa) {
					switch(ppa[i].innerText) {
						case "上一章":	PrevC=ppa[i]; break;
						case "下一章":	NextC=ppa[i]; break;
						case "上一页":	PrevP=ppa[i]; break;
						case "下一页":	NextP=ppa[i]; break;
					}
				}

				var actP=document.querySelector(".page-pagination ul li a.active");
				e = e || window.event;
				try{
					switch(e.key.toLowerCase()) {
						case 'arrowup':
						case 'w': // 新一章
							if(NextC) NextC.click(); break;
						case 'arrowdown':
						case 's': // 舊一章
							if(PrevC) PrevC.click(); break;
						case 'arrowleft':
						case 'a': // 前一頁
							if(document.querySelector("#comicRead[style='']")) return;
							$('#last-mask, #last-win').hide();
							if(PrevP) ShowPre();
							else if(actP) actP.parentNode.previousElementSibling.querySelector('a').click();
							//											YingdmList.self.changepager(parseInt(actP.innerText)-1)
							break;
						case 'arrowright':
						case 'd': // 下一頁
							if(document.querySelector("#comicRead[style='']")) return;
							$('#last-mask, #last-win').hide();
							if(NextP) ShowNext();
							else if(actP) actP.parentNode.nextElementSibling.querySelector('a').click();
							//											YingdmList.self.changepager(parseInt(actP.innerText)+1)
							break;
						case 'e': // 載入舊一頁留言
							if(loadCmts) clearTimeout(loadCmts)
							$('#last-mask, #last-win').hide();
							var NextE=document.querySelector(".view-comment-main .top .page span.current").nextElementSibling;
							if(NextE) NextE.click();
							$(".view-comment-main .top .page, .view-comment-main .bottom-page").show();
							mySetting.dm5.loadAllComments=false;
							await GM.setValue("setting", mySetting);
							break;
						case 'q': // 載入新一頁留言
							if(loadCmts) clearTimeout(loadCmts)
							$('#last-mask, #last-win').hide();
							var PrevE=document.querySelector(".view-comment-main .top .page span.current").previousElementSibling;
							if(PrevE) PrevE.click();
							$(".view-comment-main .top .page, .view-comment-main .bottom-page").show();
							mySetting.dm5.loadAllComments=false;
							await GM.setValue("setting", mySetting);
							break;
						case 'r': // 載入全部留言,新→舊
							if(loadCmts) clearTimeout(loadCmts)
							$('#last-mask, #last-win').hide();
							if(document.querySelector(".view-comment-main .postlist")) dm5AllComments("b");
							mySetting.dm5.loadAllComments="backward";
							await GM.setValue("setting", mySetting);
							break;
						case 't': // 載入全部留言,舊→新
							if(loadCmts) clearTimeout(loadCmts)
							$('#last-mask, #last-win').hide();
							if(document.querySelector(".view-comment-main .postlist")) dm5AllComments("f");
							mySetting.dm5.loadAllComments="forward";
							await GM.setValue("setting", mySetting);
							break;
						case 'escape': // 中斷載入更多留言
							if(loadCmts) clearTimeout(loadCmts)
							$('#last-mask, #last-win').hide();
							break;
					}
				} catch(err) { console.log(err); }
			});
			break;

			//=============================================================================


		case "dmzj":
			document.addEventListener("keydown", function(e) {
				if(document.querySelector("input:focus, textarea:focus, [contenteditable='true']:focus") || (e.shiftKey | e.ctrlKey | e.altKey | e.metaKey | e.isComposing)) return;
				var elm=null;
				e = e || window.event;
				try {
					switch(e.key.toLowerCase()) {
						case 'arrowup':
						case 'w':
							elm=document.querySelector("#next_chapter, a.btm_chapter_btn.fr"); break;
						case 'arrowdown':
						case 's':
							elm=document.querySelector("#prev_chapter, a.btm_chapter_btn.fl"); break;
						case 'arrowleft':
							if(document.querySelector("#comicRead[style='']")) return;
							elm=document.querySelector(".pages a.pselected, .page a.cu");
							if(elm)	do elm=elm.previousElementSibling; while(elm.nodeName == "#text");
							break;
						case 'arrowright':
							if(document.querySelector("#comicRead[style='']")) return;
							elm=document.querySelector(".pages a.pselected, .page a.cu");
							if(elm)	do elm=elm.nextElementSibling; while(elm.nodeName == "#text");
							break;
						case 'a':
							if(document.querySelector("#comicRead[style='']")) return;
							if(elm=document.querySelector("#center_box>a.img_land_prev, .comic_wraCon>a.img_land_prev")) break;
							else {
								elm=document.querySelector("#search_list_div .pages a.pselected, .page a.cu");
								if(elm)	do elm=elm.previousElementSibling; while(elm.nodeName == "#text");
							}
							break;
						case 'd':
							if(document.querySelector("#comicRead[style='']")) return;
							if(elm=document.querySelector("#center_box>a.img_land_next, .comic_wraCon>a.img_land_next")) break;
							else {
								elm=document.querySelector("#search_list_div .pages a.pselected, .page a.cu");
								if(elm)	do elm=elm.nextElementSibling; while(elm.nodeName == "#text");
							}
							break;
						case 'escape':
							elm=document.querySelector("#close_btn");
							break;
							//	case "/": load comments page 3
							//	comment_news.getAllComment(3);
					}
					if(elm) elm.click();
				} catch(err) { console.log(err); }
			});
			break;

			//=============================================================================

		case "mhgui":
		case "manhuagui":
			document.addEventListener('readystatechange', (event) => {
				if(document.readyState == 'interactive') {
					setTimeout(function(){
						let adutBtn = document.querySelector("#checkAdult");
						if(adutBtn)	adutBtn.click();
					}, 200);
				}
			});

			document.addEventListener("keydown", function(e) {
				if(document.querySelector("input:focus, textarea:focus, [contenteditable='true']:focus") || (e.shiftKey | e.ctrlKey | e.altKey | e.metaKey | e.isComposing)) return;
				e = e || window.event;
				var curr=document.querySelector(".pager .current, .page .cu, div.flickr span.current"),
					view=document.querySelector('#mangaBox'),
					scrollMode=document.querySelector(".w980.sub-btn .support .pfunc:last-child a.current");
				try {
					$("#pb, #pb-mask").remove();
					switch(e.key.toLowerCase()) {
						case 'arrowup':
						case 'w':
							document.querySelector(".main-btn>a.nextC").click();
							break;
						case 'arrowdown':
						case 's':
							document.querySelector(".main-btn>a.prevC").click();
							break;
						case 'arrowleft':
							if(view) break;
						case 'a':
							if(document.querySelector("#comicRead[style='']")) return;
							if(curr && !scrollMode) curr.previousElementSibling.click();
							break;
						case 'arrowright':
							if(view) break;
						case 'd':
							if(document.querySelector("#comicRead[style='']")) return;
							if(curr && !scrollMode) curr.nextElementSibling.click();
							break;
					}
				} catch(err){ console.log(err); }
			});

			window.addEventListener("load", function(){
				setTimeout(function(){
					document.querySelectorAll("a.bcover img[data-src]").forEach(function(item, index, array){
						item.setAttribute("src", item.getAttribute("data-src"));
						item.removeAttribute("data-src");
					});
				}, 100);
			});
			break;

			//=============================================================================


		case "copymanga":
			document.addEventListener("keydown", function(e) {
				if(document.querySelector("input:focus, textarea:focus, [contenteditable='true']:focus") || (e.shiftKey | e.ctrlKey | e.altKey | e.metaKey | e.isComposing)) return;
				var elm=null;
				e = e || window.event;
				try {
					switch(e.key.toLowerCase()) {
						case 'arrowup':
						case 'w':
							elm=document.querySelector(".footer .comicContent-next a:not(.prev-null)");
							break;
						case 'arrowdown':
						case 's':
							elm=document.querySelector(".footer .comicContent-prev:not(.index):not(.list) a:not(.prev-null)");
							break;
						case 'arrowleft':
						case 'a':
							if(document.querySelector("#comicRead[style='']")) return;
							elm=document.querySelector(".el-pagination li.active");
							if(elm) elm=elm.previousElementSibling;
							else	elm=document.querySelector(".page-all li.prev>a, .comic-detail-page li.prev>a");
							break;
						case 'arrowright':
						case 'd':
							if(document.querySelector("#comicRead[style='']")) return;
							elm=document.querySelector(".el-pagination li.active");
							if(elm) elm=elm.nextElementSibling;
							else	elm=document.querySelector(".page-all li.next>a, .comic-detail-page li.next>a");
							break;
					}
					if(elm) elm.click();
				} catch(err) { console.log(err); }
			});
			break;
	}

})();