Last active
August 29, 2015 14:04
-
-
Save wenketel/e892dd3bd0758e442481 to your computer and use it in GitHub Desktop.
FireGestures脚本上一页和下一页
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
var checked = false; | |
var delay = false; | |
var next = { | |
}; | |
var previous = { | |
}; | |
// 下一页链接里的文字 | |
next.texts = [ | |
'next', | |
'next page', | |
'old', | |
'older', | |
'older Posts', | |
'earlier', | |
'较旧的帖子', | |
'較舊的文章', | |
'下页', | |
'下頁', | |
'下一页', | |
'下一頁', | |
'后一页', | |
'后一頁', | |
'翻下页', | |
'翻下頁', | |
'后页', | |
'后頁', | |
'下翻', | |
'下一个', | |
'下一回', | |
'下一张', | |
'下一幅', | |
'下一节', | |
'下一章', | |
'下一篇', | |
'后一章', | |
'后一篇' | |
]; | |
// 上一页链接里的文字 | |
previous.texts = [ | |
'previous', | |
'prev', | |
'previous page', | |
'new', | |
'newer', | |
'newer posts', | |
'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 = window._content.document.links; | |
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 each(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++) { | |
if (regexp.compile(preRegexp + next.texts[j] + nextRegexp, 'i') .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++) { | |
if (regexp.compile(preRegexp + previous.texts[j] + nextRegexp, 'i') .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++) { | |
if (regexp.compile(preRegexp + next.texts[j] + nextRegexp, 'i') .test(text)) { | |
// 检测到“下一页”的按钮 | |
next.link = but; | |
next.found = found = true; | |
break; | |
} | |
} | |
} | |
if (!found && !previous.found) { | |
for (var j = 0; j < previous.texts.length; j++) { | |
if (regexp.compile(preRegexp + previous.texts[j] + nextRegexp, 'i') .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(); | |
window._content.document.location = linkNode.href; | |
//location.assign(linkNode.href); | |
} | |
else { | |
} | |
} | |
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) | |
{ | |
if (getBrowser() .canGoBack) { | |
mgB_Back(); | |
} | |
else | |
{ | |
return ; | |
} | |
} | |
if (!checked) { | |
checkLinks(); | |
checked = true; | |
} | |
openLink(previous.link); | |
}) (); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
var checked = false; | |
var delay = false; | |
var next = { | |
}; | |
var previous = { | |
}; | |
// 下一页链接里的文字 | |
next.texts = [ | |
'next', | |
'next page', | |
'old', | |
'older', | |
'older posts', | |
'earlier', | |
'较旧的帖子', | |
'較舊的文章', | |
'下页', | |
'下頁', | |
'下一页', | |
'下一頁', | |
'后一页', | |
'后一頁', | |
'翻下页', | |
'翻下頁', | |
'后页', | |
'后頁', | |
'下翻', | |
'下一个', | |
'下一回', | |
'下一张', | |
'下一幅', | |
'下一节', | |
'下一章', | |
'下一篇', | |
'后一章', | |
'后一篇' | |
]; | |
// 上一页链接里的文字 | |
previous.texts = [ | |
'previous', | |
'prev', | |
'previous page', | |
'home', | |
'new', | |
'newer', | |
'newer posts', | |
'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 = window._content.document.links; | |
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 each(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++) { | |
if (regexp.compile(preRegexp + next.texts[j] + nextRegexp, 'i') .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++) { | |
if (regexp.compile(preRegexp + previous.texts[j] + nextRegexp, 'i') .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++) { | |
if (regexp.compile(preRegexp + next.texts[j] + nextRegexp, 'i') .test(text)) { | |
// 检测到“下一页”的按钮 | |
next.link = but; | |
next.found = found = true; | |
break; | |
} | |
} | |
} | |
if (!found && !previous.found) { | |
for (var j = 0; j < previous.texts.length; j++) { | |
if (regexp.compile(preRegexp + previous.texts[j] + nextRegexp, 'i') .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(); | |
window._content.document.location = linkNode.href; | |
//location.assign(linkNode.href); | |
} | |
else { | |
} | |
} | |
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) | |
{ | |
if (getBrowser() .canGoBack) { | |
mgB_Back(); | |
} | |
else | |
{ | |
return ; | |
} | |
} | |
if (!checked) { | |
checkLinks(); | |
checked = true; | |
} | |
openLink(next.link); | |
}) (); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment