| 
		
	
	
	
		
	Posts: 1Threads: 1
 Joined: Jul 2017
 
	
	
		希望cent手势中能添加上一页和下一页的跳转链接手势(参考Crxmouse),而并不是表现为与空格键类似的功能,仅在本页中翻页,有些工作还要把页面拉到底部,点击1、2、3.....等等按钮,略显繁琐,希望能添加
	 
		
	 
	
	
	
		
	Posts: 6,341Threads: 91
 Joined: Oct 2014
 
	
	
	
		
	Posts: 24Threads: 2
 Joined: Oct 2016
 
	
	
	
		
	Posts: 37Threads: 6
 Joined: Apr 2016
 
	
	
		有上帝赐予的回到顶部和回到底部按键,就在键盘上!Home和End
	 
		
	 
	
	
	
		
	Posts: 107Threads: 8
 Joined: May 2017
 
	
	
		这个是网页行为,并不是浏览器行为,怎么会和浏览器有关
 顶多就是在支持左右翻页的网页,把手势映射到左右方向键上
 
		
	 
	
	
	
		
	Posts: 24Threads: 2
 Joined: Oct 2016
 
	
		
		
		07-31-2017, 12:14 AM 
(This post was last modified: 07-31-2017, 01:05 AM by pomuyu.)
		
	 
		 (07-26-2017, 05:00 PM)Omaki Wrote:  有上帝赐予的回到顶部和回到底部按键,就在键盘上!Home和End 
LZ  说的是快捷键,实现 页面列表里的“下一页”,不再用鼠标“瞄准”那个链接去点击了。
 
  (07-28-2017, 01:07 AM)Storm Wrote:  这个是网页行为,并不是浏览器行为,怎么会和浏览器有关
 顶多就是在支持左右翻页的网页,把手势映射到左右方向键上
 
只要网页链接出现了相应关键字,用JS脚本就可以做到,不需要网站本身支持翻页。
 
可以简单试一下 
装一个Shortkeys (Custom Keyboard Shortcuts)
https://chrome.google.com/webstore/detai...gddngobkck 
选项里,新建一个 
Keyboard Shortcut栏输入字母't', Behavior栏拉到后,选“Run Javascript”
 
Javascript code to run 里粘上我后面贴的代码。
 
打开论坛帖子列表(已打开的话需要刷新一下)
https://www.centbrowser.com/forum/forumd...php?fid=22 
英文输入状态下,敲字母“t” 
看下效果。
 
代码如下:
 Code: (function() {var checked = false;
 var delay = false;
 var next = {};
 var previous = {};
 // 下一页链接里的文字
 next.texts      = [ 'next','Next','Next »',
 'next page',
 'old',
 'older',
 'Older Entries',
 'earlier',
 '下页',
 '下頁',
 '下一页',
 '下一頁',
 '后一页',
 '后一頁',
 '翻下页',
 '翻下頁',
 '后页',
 '后頁',
 '下翻',
 '下一个',
 '下一张',
 '下一幅',
 '下一节',
 '下一章',
 '下一篇',
 '后一章',
 '后一篇'
 ];
 // 上一页链接里的文字
 previous.texts  = [ 'previous',
 'prev',
 'previous page',
 'new',
 'newer',
 'later',
 '上页',
 '上頁',
 '上一页',
 '上一頁',
 '前一页',
 '前一頁',
 '翻上页',
 '翻上頁',
 '前页',
 '前頁',
 '上翻',
 '上一个',
 '上一张',
 '上一幅',
 '上一节',
 '上一章',
 '上一篇',
 '前一章',
 '前一篇'
 ];
 // 可能会误判的关键词
 next.miswords   = { "下一章": 30,
 "下一篇": 30,
 "后一章": 30,
 "后一篇": 30,
 "下一节": 30,
 ">>": 2000,
 "?": 2000
 }
 previous.miswords = { "上一章": 30,
 "上一篇": 30,
 "前一章": 30,
 "前一篇": 30,
 "上一节": 30,
 "<<": 2000,
 "?": 2000
 }
 
 // 最后添加一些论坛使用的翻页符号
 next.texts.push(">>");
 next.texts.push(">");
 next.texts.push("?");
 next.texts.push("?");
 previous.texts.push("<<");
 previous.texts.push("<");
 previous.texts.push("?");
 previous.texts.push("?");
 
 // 翻页文字的前面和后面可能包含的字符(正则表达式)
 var preRegexp  = '(^\\s*(?:[<??]*|[>??]*|[\\(\\[『「[【]?)\\s*)';
 var nextRegexp = '(\\s*(?:[>??]*|[\\)\\]』」]】]?)\\s*$)';
 
 function checkLinks() {
 var link, text, ldnc, lnc, ldpc, lpc, num, digCurFound, linkNumber, found, tmpNode;
 var regexp = new RegExp();
 // 查找相应的链接
 var links = document.getElementsByTagName('A');
 for (var i = 0; i < links.length; i++) {
 link = links[i];
 
 // 跳过不起作用的链接
 if (!link.offsetParent || link.offsetWidth == 0 || link.offsetHeight == 0 || !link.hasAttribute("href") && !link.hasAttribute("onclick"))
 continue;
 // 跳过日历
 if (/(?:^|\s)(?:monthlink|weekday|day|day[\-_]\S+)(?:\s|$)/i.test(link.className))
 continue;
 
 if (/^nextlink/i.test(link.id) || /^linknext/i.test(link.id) ||
 /(^|\s)nextlink/i.test(link.className) || /(^|\s)linknext/i.test(link.className))
 next.link = link;
 if (/^prev(ious)?link/i.test(link.id) || /^linkprev(ious)?/i.test(link.id) ||
 /(^|\s)prev(ious)?link/i.test(link.className) || /(^|\s)linkprev(ious)?/i.test(link.className))
 previous.link = link;
 
 text = link.textContent;
 if (!text) {
 // 若链接中没有文字,则检查图片的alt属性、链接或图片的title
 for (var img in link.childNodes) {
 if (img.localName == "IMG") {
 text = img.alt || link.title || img.title;
 if (text) break;
 }
 }
 if (!text) continue;
 }
 text = text.toLowerCase().replace(/^\s+|\s+$/g, "");
 if (!text) continue;
 
 // 纯数字链接
 if (isDigital(text)) {
 if (digCurFound) continue;
 linkNumber = parseInt(RegExp.$1);
 
 // 检测下一个位置是否是当前页面的页数
 if ((tmpNode = getCurrentPageNode(link, linkNumber, 1)) && tmpNode) {
 digCurFound = true;
 previous.link = link;
 previous.found = true;
 previous.pos = i;
 // 再检测下下一个位置是否是“下一页”的链接
 if (getNextLink(tmpNode, linkNumber+2, true))
 break;
 // 设置往后的30个位置以内为“下一页”的可能链接,以提高检测速度。
 ldnc = i + 30;
 }
 // 检测上一个位置是否是当前页面的页数
 else if (getCurrentPageNode(link, linkNumber, -1)) {
 digCurFound = true;
 next.link = link;
 next.found = true;
 next.pos = i;
 ldpc = i + 30;
 continue;
 }
 // 检测自身是否是当前页面的页数
 else if (getCurrentPageNode(link, linkNumber, 0)) {
 digCurFound = true;
 // 再检测下一个位置是否是“下一页”的链接
 if (getNextLink(link, linkNumber+1, true)) {
 next.pos = i;
 ldpc = i + 30;
 continue;
 }
 // 设置往后的30个位置以内为“下一页”的可能链接,以提高检测速度。
 ldnc = i + 30;
 }
 continue;
 }
 else {
 found = false;
 if (!next.found && !(lnc < i) && !(ldnc < i)) {
 for (var j = 0; j < next.texts.length; j++) {
 regexp.compile(preRegexp + next.texts[j] + nextRegexp, 'i');
 if (regexp.test(text)) {
 // 检测到“下一页”的链接
 found = true;
 next.link = link;
 num = next.miswords[next.texts[j]];
 // 若“下一页”的词语有可能会误判时,最多再检测预定个数的链接。
 (num == null) ? next.found = true : lnc = i + num;
 break;
 }
 }
 }
 if (!next.digital && lnc < i) next.found = true;
 
 if (!found && !previous.found && !(lpc < i) && !(ldpc < i)) {
 for (var j = 0; j < previous.texts.length; j++) {
 regexp.compile(preRegexp + previous.texts[j] + nextRegexp, 'i');
 if (regexp.test(text)) {
 // 检测到“上一页”的链接
 previous.link = link;
 num = previous.miswords[previous.texts[j]];
 // 若“上一页”的词语有可能会误判时,最多再检测预定个数的链接。
 (num == null) ? previous.found = true : lpc = i + num;
 break;
 }
 }
 }
 if (lpc < i) previous.found = true;
 // 重新设置纯数字链接未被检查
 digCurFound = null;
 }
 
 // 找到“上一页”和“下一页”的链接或找到其中一个而另一个超过规定范围没找到,将不再查找。
 if (next.found && previous.found ||
 next.found && i > next.pos + 30 ||
 previous.found && i > previous.pos + 30)
 break;
 }
 // 通过以上方法没有找到“下一页”的,把第一次检测出来的数字1的链接作为当前页,2作为“下一页”。
 if (!next.found /*&& !next.link*/ && next.digital)
 next.link = next.digital;
 
 if (next.link) next.found = true;
 if (previous.link) previous.found = true;
 
 if (!next.found && !previous.found)
 checkButtons();
 }
 
 // 检查翻页按钮
 function checkButtons() {
 var but, text, found;
 var regexp = new RegExp();
 var buts = document.getElementsByTagName('INPUT');
 for (var i = 0; i < buts.length; i++) {
 but = buts[i];
 if (but.hasAttribute("disabled") || !(/^button$/i.test(but.type) && but.getAttribute("onclick"))) continue;
 
 text = but.value;
 found = false;
 if (!next.found) {
 for (var j = 0; j < next.texts.length; j++) {
 regexp.compile(preRegexp + next.texts[j] + nextRegexp, 'i');
 if (regexp.test(text)) {
 // 检测到“下一页”的按钮
 next.link = but;
 next.found = found = true;
 break;
 }
 }
 }
 
 if (!found && !previous.found) {
 for (var j = 0; j < previous.texts.length; j++) {
 regexp.compile(preRegexp + previous.texts[j] + nextRegexp, 'i');
 if (regexp.test(text)) {
 // 检测到“上一页”的按钮
 previous.link = but;
 previous.found = true;
 break;
 }
 }
 }
 if (next.found && previous.found) break;
 }
 }
 
 // 取得相邻的纯数字节点,type: 1 下一个;-1 上一个
 function getSiblingNode(node, type) {
 if (!node) return null;
 node = getSibling(node, type);
 while (node && (node.nodeName == "#coment" ||
 (/^\s*[\]]】]?[,\|]?\s*[\[[【]?\s*$/.test(node.textContent))))
 node = getSibling(node, type);
 return node;
 }
 function getSibling(aNode, type) {
 if (!aNode) return null;
 if (isOnlyNode(aNode)) {
 try {
 aNode = (type == 1 ? aNode.parentNode.nextSibling : aNode.parentNode.previousSibling);
 if (skipNode(aNode))
 aNode = (type == 1 ? aNode.nextSibling : aNode.previousSibling);
 aNode = aNode.childNodes[0];
 if (skipNode(aNode))
 aNode = aNode.nextSibling;
 }
 catch (e) {return null;}
 }
 else {
 aNode = (type == 1 ? aNode.nextSibling : aNode.previousSibling);
 }
 return aNode;
 }
 function isOnlyNode(n) {
 return !n.nextSibling && !n.previousSibling ||
 !n.nextSibling && skipNode(n.previousSibling) && !n.previousSibling.previousSibling ||
 !n.previousSibling && skipNode(n.nextSibling) && !n.nextSibling.nextSibling ||
 skipNode(n.previousSibling) && !n.previousSibling.previousSibling &&
 skipNode(n.nextSibling) && !n.nextSibling.nextSibling;
 }
 function skipNode(sNode) {
 return sNode && /*sNode.nodeName == "#text" &&*/ (/^\s*$/.test(sNode.textContent));
 }
 
 // 检测是否有下一页的纯数字链接,number:页数
 function getNextLink(node, number, set) {
 var tNode = getSiblingNode(node, 1);
 if (tNode && tNode.nodeName == "A" && isDigital(tNode.textContent)) {
 if (RegExp.$1 == number) {
 // 找到纯数字链接
 if (set) {
 next.link = tNode;
 next.found = true;
 }
 return tNode;
 }
 }
 return null;
 }
 
 function isDigital(str, t) {
 str = str.replace(/^\s+|\s+$/g, "");
 if (t == -1)
 str = str.split(/\s+/).pop();
 else if (t == 1)
 str = str.split(/\s+/)[0];
 return (/^(\d+)$/.test(str)) ||
 (/^\[\s?(\d+)\s?\]$/.test(str)) ||
 (/^【\s?(\d+)\s?】$/.test(str)) ||
 (/^[\s?(\d+)\s?]$/.test(str)) ||
 (/^<\s?(\d+)\s?>$/.test(str));
 }
 
 // 判断是否是当前页面的数字,type:-1,0,1 分别是要判别的上一个、当前、下一个节点
 function getCurrentPageNode(node, linkNum, type) {
 var tNode;
 if (type == 0) {
 tNode = getSiblingNode(node, 1) || getSiblingNode(node, -1);
 if (!tNode) return null;
 if (!node.hasAttribute("onclick") && node.href != tNode.href &&
 (!node.hasAttribute("href") && isDigital(node.textContent, type) ||
 !(/\/#[^\/]+$/.test(node.href)) && node.href == location.href && isDigital(node.textContent, type))) {
 if (linkNum > 0 && RegExp.$1 == linkNum) return node;
 }
 // 某些论坛处在第一页时,实际链接和当前页链接不符,只有和其余纯数字链接的结构或颜色不同时,
 // 才使用纯数字的“2”作为“下一页”的链接。
 else if (!next.digital && (/^\s*[\[[【]?1[\]]】]?\s*$/.test(node.textContent))) {
 var two = getNextLink(node, 2);
 if (two && difDigital(node, two))
 next.digital = two;
 }
 }
 else {
 tNode = getSiblingNode(node, type);
 if (!tNode) return null;
 if (tNode.nodeName != "A" && isDigital(tNode.textContent, type) ||
 tNode.nodeName == "A" && !tNode.hasAttribute("onclick") && node.href != tNode.href &&
 (!tNode.hasAttribute("href") && isDigital(tNode.textContent, type) ||
 !(/\/#[^\/]+$/.test(tNode.href)) && tNode.href == location.href && isDigital(tNode.textContent, type))) {
 var n = linkNum + type;
 if (n > 0 && RegExp.$1 == n) {
 if (next.digital) next.digital = null;
 return tNode;
 }
 }
 }
 return null;
 }
 
 function difDigital(node1, node2) {
 if (getStructure(node1) == getStructure(node2) && getStyleColor(node1) == getStyleColor(node2))
 return false;
 return true;
 }
 function getStructure(aNode) {
 return aNode.innerHTML.replace(/\d+/, "");
 }
 function getStyleColor(aNode) {
 return document.defaultView.getComputedStyle(aNode, null).getPropertyValue("color");
 }
 
 function openLink(linkNode) {
 if (!linkNode) return;
 var hf = linkNode.getAttribute("href");
 if (!linkNode.hasAttribute("onclick") && hf && !(/^#/.test(hf)) && linkNode.href != location.href) {
 cleanVars();
 location.assign(linkNode.href);
 }
 else {
 // 有些4D鼠标摆动一下滚轮会触发多下的方向键,故增设一个延迟参数,使它只翻一页。
 delay = true;
 setTimeout(cleanVars, 300);
 var e = document.createEvent("MouseEvents");
 e.initMouseEvent("click", 1, 1, window, 1, 0,0,0,0,0,0,0,0,0, linkNode);
 linkNode.dispatchEvent(e);
 }
 }
 function cleanVars() {
 try {
 checked = false;
 delay = false;
 next.link = next.found = next.digital = null;
 previous.link = previous.found = previous.digital = null;
 delete next.pos;
 delete previous.pos;
 } catch(e) {}
 }
 
 // 检查过且没有发现上一页或下一页的连接,则退出
 if (checked && !next.found && !previous.found)
 return;
 
 if (!checked) {
 checkLinks();
 checked = true;
 }
 
 openLink(next.link);
 })();
 
		
	 |