自动无缝翻页

自动无缝翻页,目前支持:423Down、Apphot、不死鸟、小众软件、异次元软件、微当下载、异星软件空间、豆瓣电影、3DM、游民星空、千图网、RARBG、FitGirl Repacks、AlphaCoders、PubMed、三国杀论坛、百分浏览器论坛...

当前为 2021-07-20 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name 自动无缝翻页
  3. // @version 1.2.6
  4. // @author X.I.U
  5. // @description 自动无缝翻页,目前支持:423Down、Apphot、不死鸟、小众软件、异次元软件、微当下载、异星软件空间、豆瓣电影、3DM、游民星空、千图网、RARBG、FitGirl Repacks、AlphaCoders、PubMed、三国杀论坛、百分浏览器论坛...
  6. // @match *://www.423down.com/*
  7. // @exclude *://www.423down.com/*.html
  8. // @match *://apphot.cc/*
  9. // @exclude *://apphot.cc/*.html
  10. // @match *://iao.su/*
  11. // @match *://www.appinn.com/
  12. // @match *://www.appinn.com/*/*/
  13. // @match *://www.appinn.com/?s=*
  14. // @match *://www.iplaysoft.com/*
  15. // @match *://www.weidown.com/*
  16. // @match *://fitgirl-repacks.site/*
  17. // @match *://*.alphacoders.com/*
  18. // @match *://club.sanguosha.com/*
  19. // @match *://www.centbrowser.net/*
  20. // @match *://pubmed.ncbi.nlm.nih.gov/?term=*
  21. // @match *://movie.douban.com/*
  22. // @match *://search.douban.com/*
  23. // @match *://www.3dmgame.com/bagua/*.html
  24. // @match *://www.gamersky.com/ent/*/*.shtml
  25. // @match *://www.58pic.com/*
  26. // @match *://rarbgprx.org/torrents.php*
  27. // @match *://www.yxssp.com/*
  28. // @icon https://i.loli.net/2021/03/07/rdijeYm83pznxWq.png
  29. // @grant GM_xmlhttpRequest
  30. // @grant GM_registerMenuCommand
  31. // @grant GM_openInTab
  32. // @license GPL-3.0 License
  33. // @run-at document-end
  34. // @namespace https://github.com/XIU2/UserScript
  35. // @supportURL https://github.com/XIU2/UserScript
  36. // @homepageURL https://github.com/XIU2/UserScript
  37. // ==/UserScript==
  38.  
  39. 'use strict';
  40. (function() {
  41. // 注册脚本菜单
  42. GM_registerMenuCommand('💬 反馈 & 欢迎申请支持', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/419215/feedback', {active: true,insert: true,setParent: true});});
  43.  
  44. // 默认 ID 为 0
  45. var curSite = {SiteTypeID: 0};
  46.  
  47. // 自动翻页规则
  48. // type:1 = 脚本实现自动无缝翻页,2 = 网站自带了自动无缝翻页功能,只需要点击下一页按钮即可,这时 nextText 为按钮文本,避免一瞬间加载太多次下一页
  49. // HT_insert:1 = 插入该元素本身的前面;2 = 插入该元素当中,第一个子元素前面;3 = 插入该元素当中,最后一个子元素后面;4 = 插入该元素本身的后面;
  50. // scrollDelta:数值越大,滚动条触发点越靠上(越早开始翻页),一般是访问网页速度越慢,该值就需要越大
  51. // function:before = 插入前执行函数;after = 插入后执行函数;parameter = 参数
  52. let DBSite = {
  53. _423down_postslist: {
  54. SiteTypeID: 1,
  55. pager: {
  56. type: 1,
  57. nextLink: '//div[@class="paging"]//a[contains(text(),"下一页")][@href]',
  58. pageElement: 'css;div.content-wrap ul.excerpt > li',
  59. HT_insert: ['css;div.content-wrap ul.excerpt', 3],
  60. replaceE: 'css;div.paging',
  61. scrollDelta: 1500
  62. }
  63. },
  64. apphot_postslist: {
  65. SiteTypeID: 2,
  66. pager: {
  67. type: 1,
  68. nextLink: '//div[@class="pagination"]//a[contains(text(),"下一页")][@href]',
  69. pageElement: 'css;div.content > article.excerpt',
  70. HT_insert: ['css;div.pagination', 1],
  71. replaceE: 'css;div.pagination',
  72. scrollDelta: 1500
  73. }
  74. },
  75. iao_su_postslist: {
  76. SiteTypeID: 3,
  77. pager: {
  78. type: 1,
  79. nextLink: '//li[@class="btn btn-primary next"]//a[@href]',
  80. pageElement: 'css;#index > article, #archive > article',
  81. HT_insert: ['css;ol.page-navigator', 1],
  82. replaceE: 'css;ol.page-navigator',
  83. scrollDelta: 800
  84. },
  85. function: {
  86. before: iao_su_postslist_beforeFunction
  87. }
  88. },
  89. appinn_postslist: {
  90. SiteTypeID: 4,
  91. pager: {
  92. type: 1,
  93. nextLink: '//a[@class="next page-numbers"][@href]',
  94. pageElement: 'css;section#latest-posts > article',
  95. HT_insert: ['css;nav.navigation.pagination', 1],
  96. replaceE: 'css;div.nav-links',
  97. scrollDelta: 1500
  98. }
  99. },
  100. iplaysoft_postslist: {
  101. SiteTypeID: 5,
  102. pager: {
  103. type: 1,
  104. nextLink: '//div[@class="pagenavi"]//a[@title="下一页"][@href]',
  105. pageElement: 'css;#postlist > div.entry',
  106. HT_insert: ['css;#postlist > .pagenavi-button', 1],
  107. replaceE: 'css;.pagenavi-button, .pagenavi',
  108. scrollDelta: 1200
  109. },
  110. function: {
  111. before: iplaysoft_postslist_beforeFunction
  112. }
  113. },
  114. iplaysoft_postcomments: {
  115. SiteTypeID: 6,
  116. pager: {
  117. type: 2,
  118. nextLink: '#loadHistoryComments',
  119. nextText: '展开后面',
  120. scrollDelta: 1200
  121. }
  122. },
  123. discuz_forum: {
  124. SiteTypeID: 7,
  125. pager: {
  126. type: 2,
  127. nextLink: '#autopbn',
  128. nextText: '下一页 »',
  129. scrollDelta: 1000
  130. }
  131. },
  132. discuz_thread: {
  133. SiteTypeID: 8,
  134. pager: {
  135. type: 1,
  136. nextLink: '//a[@class="nxt"][@href]',
  137. pageElement: 'css;div#postlist > div[id^="post_"]',
  138. HT_insert: ['css;div#postlist', 3],
  139. replaceE: 'css;div.pg',
  140. scrollDelta: 1000
  141. }
  142. },
  143. discuz_search: {
  144. SiteTypeID: 9,
  145. pager: {
  146. type: 1,
  147. nextLink: '//a[@class="nxt"][@href]',
  148. pageElement: 'css;div#threadlist > ul',
  149. HT_insert: ['css;div#threadlist', 3],
  150. replaceE: 'css;div.pg',
  151. scrollDelta: 1000
  152. }
  153. },
  154. pubmed_postslist: {
  155. SiteTypeID: 10,
  156. pager: {
  157. type: 2,
  158. nextLink: 'button.load-button.next-page',
  159. nextText: 'Show more',
  160. scrollDelta: 1500
  161. }
  162. },
  163. wall_alphacoders: {
  164. SiteTypeID: 11,
  165. pager: {
  166. type: 1,
  167. nextLink: '//a[@id="next_page"][@href]',
  168. pageElement: 'css;.thumb-container-big, .avatar-thumb, .thumb-element',
  169. HT_insert: ['css;.thumb-container-big:nth-last-child(1), .avatar-thumb:nth-last-child(1), .thumb-element:nth-last-child(1)', 4],
  170. replaceE: '//div[@class="hidden-xs hidden-sm"]/..',
  171. scrollDelta: 1000
  172. }
  173. },
  174. art_alphacoders: {
  175. SiteTypeID: 12,
  176. pager: {
  177. type: 1,
  178. nextLink: '//a[@id="next_page"][@href]',
  179. pageElement: 'css;.container-masonry > div',
  180. HT_insert: ['css;.container-masonry', 3],
  181. replaceE: '//div[@class="hidden-xs hidden-sm"]/..',
  182. scrollDelta: 1000
  183. },
  184. function: {
  185. before: art_alphacoders_beforeFunction
  186. }
  187. },
  188. fitgirl: {
  189. SiteTypeID: 13,
  190. pager: {
  191. type: 1,
  192. nextLink: '//a[@class="next page-numbers"][@href]',
  193. pageElement: 'css;article[id^="post-"]',
  194. HT_insert: ['css;nav.navigation.paging-navigation', 1],
  195. replaceE: 'css;nav.navigation.paging-navigation',
  196. scrollDelta: 2000
  197. }
  198. },
  199. weidown: {
  200. SiteTypeID: 14,
  201. pager: {
  202. type: 1,
  203. nextLink: '//a[@class="nextpage"][@href]',
  204. pageElement: 'css;.articleWrapper > .itemArticle, .articleWrapper > .richTextItem.search',
  205. HT_insert: ['css;.articleWrapper', 3],
  206. replaceE: 'css;#pageGroup',
  207. scrollDelta: 1500
  208. }
  209. },
  210. weidown_search: {
  211. SiteTypeID: 14,
  212. pager: {
  213. type: 1,
  214. nextLink: '//a[@class="nextpage"][@href]',
  215. pageElement: 'css;.articleListWrapper > .richTextItem.search',
  216. HT_insert: ['css;#pageGroup', 1],
  217. replaceE: 'css;#pageGroup',
  218. scrollDelta: 700
  219. }
  220. },
  221. weidown_special: {
  222. SiteTypeID: 14,
  223. pager: {
  224. type: 1,
  225. nextLink: '//a[@class="nextpage"][@href]',
  226. pageElement: 'css;.special > .item',
  227. HT_insert: ['css;.special', 3],
  228. replaceE: 'css;#pageGroup',
  229. scrollDelta: 700
  230. }
  231. },
  232. douban_subject_comments: {
  233. SiteTypeID: 15,
  234. pager: {
  235. type: 1,
  236. nextLink: '//a[@class="next"][@href]',
  237. pageElement: 'css;#comments > .comment-item',
  238. HT_insert: ['css;#paginator', 1],
  239. replaceE: 'css;#paginator',
  240. scrollDelta: 700
  241. }
  242. },
  243. douban_subject_reviews: {
  244. SiteTypeID: 16,
  245. pager: {
  246. type: 1,
  247. nextLink: '//link[@rel="next"][@href]',
  248. pageElement: 'css;.review-list > div',
  249. HT_insert: ['css;.review-list', 3],
  250. replaceE: 'css;.paginator',
  251. scrollDelta: 700
  252. }
  253. },
  254. douban_subject_episode: {
  255. SiteTypeID: 17,
  256. pager: {
  257. type: 1,
  258. nextLink: '//link[@rel="next"][@href]',
  259. pageElement: 'css;#comments > div',
  260. HT_insert: ['css;#comments', 3],
  261. replaceE: 'css;.paginator',
  262. scrollDelta: 700
  263. }
  264. },
  265. douban_search: {
  266. SiteTypeID: 18,
  267. pager: {
  268. type: 1,
  269. nextLink: '//a[@class="next"][@href]',
  270. pageElement: 'css;#root [class^="_"] [class^="sc-"]',
  271. HT_insert: ['css;.paginator', 1],
  272. replaceE: 'css;.paginator',
  273. scrollDelta: 700
  274. }
  275. },
  276. _3dmgame: {
  277. SiteTypeID: 19,
  278. pager: {
  279. type: 1,
  280. nextLink: '//li[@class="next"]/a[@href]',
  281. pageElement: 'css;.news_warp_center > p',
  282. HT_insert: ['css;.news_warp_center', 3],
  283. replaceE: 'css;.pagewrap',
  284. scrollDelta: 1000
  285. }
  286. },
  287. gamersky: {
  288. SiteTypeID: 20,
  289. pager: {
  290. type: 1,
  291. nextLink: '//div[@class="page_css"]/a[text()="下一页"][@href]',
  292. pageElement: 'css;.Mid2L_con > p',
  293. HT_insert: ['css;.page_css', 1],
  294. replaceE: 'css;.page_css',
  295. scrollDelta: 1000
  296. }
  297. },
  298. _58pic: {
  299. SiteTypeID: 21,
  300. pager: {
  301. type: 1,
  302. nextLink: '//div[contains(@class,"page-box")]//a[text()="下一页"][@href]',
  303. pageElement: 'css;.pic-box > .qtw-card',
  304. HT_insert: ['css;.pic-box', 3],
  305. replaceE: 'css;.page-box',
  306. scrollDelta: 2000
  307. },
  308. function: {
  309. before: _58pic_beforeFunction
  310. }
  311. },
  312. _58pic_c: {
  313. SiteTypeID: 22,
  314. pager: {
  315. type: 1,
  316. nextLink: '//div[contains(@class,"page-box")]//a[text()="下一页"][@href]',
  317. pageElement: 'css;.list-box > .qtw-card',
  318. HT_insert: ['css;.list-box', 3],
  319. replaceE: 'css;.page-box',
  320. scrollDelta: 4000
  321. },
  322. function: {
  323. before: _58pic_beforeFunction
  324. }
  325. },
  326. rarbgprx: {
  327. SiteTypeID: 23,
  328. pager: {
  329. type: 1,
  330. nextLink: '(//a[@title="next page"])[1][@href]',
  331. pageElement: 'css;table.lista2t tr.lista2',
  332. HT_insert: ['css;table.lista2t > tbody', 3],
  333. replaceE: 'css;#pager_links',
  334. scrollDelta: 900
  335. }
  336. },
  337. yxssp: {
  338. SiteTypeID: 24,
  339. pager: {
  340. type: 1,
  341. nextLink: '//div[@class="page-nav td-pb-padding-side"]/a[last()][@href]',
  342. pageElement: 'css;.td-modules-container.td-module-number4 > div',
  343. HT_insert: ['css;.td-modules-container.td-module-number4', 3],
  344. replaceE: 'css;.page-nav.td-pb-padding-side',
  345. scrollDelta: 900
  346. }
  347. }
  348. };
  349.  
  350.  
  351. switch (location.host) {
  352. case "www.423down.com":
  353. curSite = DBSite._423down_postslist;
  354. break;
  355. case "apphot.cc":
  356. curSite = DBSite.apphot_postslist;
  357. break;
  358. case "iao.su":
  359. curSite = DBSite.iao_su_postslist;
  360. break;
  361. case "www.appinn.com":
  362. curSite = DBSite.appinn_postslist;
  363. break;
  364. case "www.iplaysoft.com":
  365. if (location.pathname.indexOf(".html") > -1 || location.pathname.indexOf("/p/") > -1) { // 文章内
  366. curSite = DBSite.iplaysoft_postcomments;
  367. } else { // 其他页面
  368. curSite = DBSite.iplaysoft_postslist;
  369. }
  370. break;
  371. case "www.weidown.com":
  372. if (location.pathname.indexOf("/search/") > -1) {
  373. curSite = DBSite.weidown_search;
  374. } else if (location.pathname.indexOf("/special/") > -1) {
  375. curSite = DBSite.weidown_special;
  376. } else {
  377. curSite = DBSite.weidown;
  378. }
  379. break;
  380. case "www.yxssp.com":
  381. curSite = DBSite.yxssp;
  382. break;
  383. case "fitgirl-repacks.site":
  384. curSite = DBSite.fitgirl;
  385. break;
  386. case "art.alphacoders.com":
  387. curSite = DBSite.art_alphacoders;
  388. setTimeout(art_alphacoders_beforeFunction_0, 1000);
  389. break;
  390. case "wall.alphacoders.com":
  391. case "avatars.alphacoders.com":
  392. case "mobile.alphacoders.com":
  393. curSite = DBSite.wall_alphacoders;
  394. break;
  395. case "club.sanguosha.com": // Discuz! 论坛专用
  396. case "www.centbrowser.net":
  397. if (location.pathname.indexOf('.html') > -1) { // 判断是不是静态网页(.html 结尾)
  398. if (location.pathname.indexOf('forum') > -1) { // 各版块帖子列表
  399. curSite = DBSite.discuz_forum;
  400. } else if (location.pathname.indexOf('thread') > -1) { // 帖子内
  401. curSite = DBSite.discuz_thread;
  402. hidePgbtn(); // 隐藏帖子内的 [下一页] 按钮
  403. }else if(location.pathname.indexOf('search') > -1) { // 搜索结果
  404. curSite = DBSite.discuz_search;
  405. }
  406. } else {
  407. if (location.search.indexOf('mod=forumdisplay') > -1) { // 各版块帖子列表
  408. curSite = DBSite.discuz_forum;
  409. } else if (location.search.indexOf('mod=viewthread') > -1) { // 帖子内
  410. curSite = DBSite.discuz_thread;
  411. hidePgbtn(); // 隐藏帖子内的 [下一页] 按钮
  412. } else if (location.pathname.indexOf('search') > -1) { // 搜索结果
  413. curSite = DBSite.discuz_search;
  414. }
  415. }
  416. break;
  417. case "pubmed.ncbi.nlm.nih.gov":
  418. curSite = DBSite.pubmed_postslist;
  419. break;
  420. case "movie.douban.com":
  421. if (location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/comments') > -1) { // 短评
  422. curSite = DBSite.douban_subject_comments;
  423. } else if (location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/reviews') > -1) { // 影评
  424. curSite = DBSite.douban_subject_reviews;
  425. }else if(location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/episode') > -1) { // 电视剧每集评论
  426. curSite = DBSite.douban_subject_episode;
  427. }
  428. break;
  429. case "search.douban.com":
  430. curSite = DBSite.douban_search;
  431. break;
  432. case "www.3dmgame.com":
  433. curSite = DBSite._3dmgame;
  434. document.lastChild.appendChild(document.createElement('style')).textContent = `#Comments_wrap {display: none !important;}` // 隐藏评论区
  435. break;
  436. case "www.gamersky.com":
  437. curSite = DBSite.gamersky;
  438. document.lastElementChild.appendChild(document.createElement('style')).textContent = `.Comment {display: none !important;}` // 隐藏评论区
  439. break;
  440. case "www.58pic.com":
  441. if (location.pathname.indexOf("/tupian/") > -1) {
  442. curSite = DBSite._58pic;
  443. } else if (location.pathname.indexOf("/c/") > -1) {
  444. curSite = DBSite._58pic_c;
  445. }
  446. break;
  447. case "rarbgprx.org":
  448. curSite = DBSite.rarbgprx;
  449. break;
  450. }
  451. curSite.pageUrl = ""; // 下一页URL
  452. pageLoading(); // 自动无缝翻页
  453.  
  454.  
  455. // 自动无缝翻页
  456. function pageLoading() {
  457. if (curSite.SiteTypeID > 0) {
  458. windowScroll(function (direction, e) {
  459. if (direction === "down") { // 下滑才准备翻页
  460. let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
  461. let scrollDelta = curSite.pager.scrollDelta;
  462. if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + scrollDelta) {
  463. if (curSite.pager.type === 1) {
  464. ShowPager.loadMorePage();
  465. } else {
  466. let autopbn = document.querySelector(curSite.pager.nextLink);
  467. if (autopbn) { // 如果正在加载,就不再点击
  468. if (!curSite.pager.nextText) { // 如果没有指定 nextText 就直接点击
  469. autopbn.click();
  470. } else if (autopbn.innerText.indexOf(curSite.pager.nextText) > -1){ // 如果指定了 nextText 就需要判断后再点击(避免已经在加载了,还重复点击)
  471. autopbn.click();
  472. }
  473. }
  474. }
  475. }
  476. }
  477. });
  478. }
  479. }
  480.  
  481.  
  482. // 隐藏帖子内的 [下一页] 按钮
  483. function hidePgbtn() {
  484. let style_hidePgbtn = document.createElement('style');
  485. style_hidePgbtn.innerHTML = `.pgbtn {display: none;}`;
  486. document.head.appendChild(style_hidePgbtn);
  487. }
  488.  
  489.  
  490. // iplaysoft 的插入前函数
  491. function iplaysoft_postslist_beforeFunction(pageElems) {
  492. pageElems.forEach(function (one) {
  493. let now = one.querySelector("img.lazyload")
  494. if (now && !now.getAttribute('src')) {
  495. now.setAttribute("src",now.getAttribute('data-src'))
  496. now.setAttribute("srcset",now.getAttribute('data-src'))
  497. now.setAttribute("class","lazyloaded")
  498. }
  499. });
  500. return pageElems
  501. }
  502.  
  503.  
  504. // iao.su 的插入前函数
  505. function iao_su_postslist_beforeFunction(pageElems) {
  506. pageElems.forEach(function (one) {
  507. let now = one.getElementsByClassName("post-card")[0]
  508. if (now) {
  509. now.getElementsByClassName("blog-background")[0].style.backgroundImage = 'url("' + RegExp("(?<=loadBannerDirect\\(').*(?=', '',)").exec(now.getElementsByTagName("script")[0].innerText)[0]; + '")';
  510. }
  511. });
  512. return pageElems
  513. }
  514.  
  515.  
  516. // art_alphacoders
  517. function art_alphacoders_beforeFunction_0() {
  518. let pageElems1 = document.querySelectorAll(".container-masonry > div")
  519. document.querySelector(".container-masonry").style.height = "auto"
  520. pageElems1.forEach(function (one) {
  521. one.setAttribute("style","float: left");
  522. });
  523. }
  524.  
  525.  
  526. // art_alphacoders 的插入前函数
  527. function art_alphacoders_beforeFunction(pageElems) {
  528. pageElems.forEach(function (one) {
  529. one.setAttribute("style","float: left");
  530. });
  531. return pageElems
  532. }
  533.  
  534.  
  535. // iplaysoft 的插入前函数
  536. function _58pic_beforeFunction(pageElems) {
  537. let is_one = document.querySelector(".qtw-card.place-box.is-one");
  538. if (is_one && is_one.style.display != "none") {
  539. is_one.setAttribute("style", "display: none;")
  540. }
  541. pageElems.forEach(function (one) {
  542. let now = one.querySelector("img.lazy")
  543. if (now && now.getAttribute('src') === "//icon.qiantucdn.com/static/images/qtw-card/card-place.png") {
  544. now.setAttribute("src", now.dataset.original)
  545. now.setAttribute("style", "display: block;")
  546. }
  547. });
  548. return pageElems
  549. }
  550.  
  551.  
  552. // 滚动条事件
  553. function windowScroll(fn1) {
  554. var beforeScrollTop = document.documentElement.scrollTop,
  555. fn = fn1 || function () {};
  556. setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件
  557. window.addEventListener("scroll", function (e) {
  558. var afterScrollTop = document.documentElement.scrollTop,
  559. delta = afterScrollTop - beforeScrollTop;
  560. if (delta == 0) return false;
  561. fn(delta > 0 ? "down" : "up", e);
  562. beforeScrollTop = afterScrollTop;
  563. }, false);
  564. }, 1000)
  565. }
  566.  
  567.  
  568. var ShowPager = { // 修改自 https://greasyfork.org/scripts/14178
  569. getFullHref: function (e) {
  570. if(e == null) return '';
  571. "string" != typeof e && (e = e.getAttribute("href"));
  572. var t = this.getFullHref.a;
  573. return t || (this.getFullHref.a = t = document.createElement("a")), t.href = e, t.href;
  574. },
  575. createDocumentByString: function (e) {
  576. if (e) {
  577. if ("HTML" !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, "application/xhtml+xml");
  578. var t;
  579. try {
  580. t = (new DOMParser).parseFromString(e, "text/html");
  581. } catch (e) {
  582. }
  583. if (t) return t;
  584. if (document.implementation.createHTMLDocument) t = document.implementation.createHTMLDocument("ADocument"); else try {
  585. (t = document.cloneNode(!1)).appendChild(t.importNode(document.documentElement, !1)),
  586. t.documentElement.appendChild(t.createElement("head")), t.documentElement.appendChild(t.createElement("body"));
  587. } catch (e) {
  588. }
  589. if (t) {
  590. var r = document.createRange();
  591. r.selectNodeContents(document.body);
  592. var n = r.createContextualFragment(e);
  593. t.body.appendChild(n);
  594. for (var a, o = {
  595. TITLE: !0,
  596. META: !0,
  597. LINK: !0,
  598. STYLE: !0,
  599. BASE: !0
  600. }, i = t.body, s = i.childNodes, c = s.length - 1; c >= 0; c--) o[(a = s[c]).nodeName] && i.removeChild(a);
  601. return t;
  602. }
  603. } else console.error("没有找到要转成DOM的字符串");
  604. },
  605. loadMorePage: function () {
  606. if (curSite.pager) {
  607. let curPageEle = getElementByXpath(curSite.pager.nextLink);
  608. var url = this.getFullHref(curPageEle);
  609. //console.log(`${url} ${curPageEle} ${curSite.pageUrl}`);
  610. if(url === '') return;
  611. if(curSite.pageUrl === url) return;// 避免重复加载相同的页面
  612. curSite.pageUrl = url;
  613. // 读取下一页的数据
  614. curSite.pager.startFilter && curSite.pager.startFilter();
  615. GM_xmlhttpRequest({
  616. url: url,
  617. method: "GET",
  618. timeout: 5000,
  619. onload: function (response) {
  620. try {
  621. //console.log(`${response.responseText}`)
  622. var newBody = ShowPager.createDocumentByString(response.responseText);
  623. let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody);
  624. let toElement = getAllElements(curSite.pager.HT_insert[0])[0];
  625. if (pageElems.length >= 0) {
  626. // 如果有插入前函数就执行函数
  627. if (curSite.function && curSite.function.before) {
  628. if (curSite.function.parameter) { // 如果指定了参数
  629. pageElems = curSite.function.before(curSite.function.parameter);
  630. }else{
  631. pageElems = curSite.function.before(pageElems);
  632. }
  633. }
  634. // 插入位置
  635. let addTo;
  636. switch (curSite.pager.HT_insert[1]) {
  637. case 1:
  638. addTo = "beforebegin"
  639. break;
  640. case 2:
  641. addTo = "afterbegin"
  642. break;
  643. case 3:
  644. addTo = "beforeend"
  645. break;
  646. case 4:
  647. addTo = "afterend"
  648. break;
  649. }
  650. // 插入新页面元素
  651. pageElems.forEach(function (one) {
  652. toElement.insertAdjacentElement(addTo, one);
  653. });
  654. // 替换待替换元素
  655. try {
  656. let oriE = getAllElements(curSite.pager.replaceE);
  657. let repE = getAllElements(curSite.pager.replaceE, newBody, newBody);
  658. if (oriE.length === repE.length) {
  659. for (var i = 0; i < oriE.length; i++) {
  660. oriE[i].outerHTML = repE[i].outerHTML;
  661. }
  662. }
  663. } catch (e) {
  664. console.log(e);
  665. }
  666. // 如果有插入后函数就执行函数
  667. if (curSite.function && curSite.function.after) {
  668. if (curSite.function.parameter) { // 如果指定了参数
  669. curSite.function.after(curSite.function.parameter);
  670. }else{
  671. curSite.function.after();
  672. }
  673. }
  674. }
  675. } catch (e) {
  676. console.log(e);
  677. }
  678. }
  679. });
  680. }
  681. },
  682. };
  683.  
  684.  
  685. function getElementByXpath(e, t, r) {
  686. r = r || document, t = t || r;
  687. try {
  688. return r.evaluate(e, t, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  689. } catch (t) {
  690. return void console.error("无效的xpath");
  691. }
  692. }
  693.  
  694.  
  695. function getAllElements(e, t, r, n, o) {
  696. let getAllElementsByXpath = function(e, t, r) {
  697. return r = r || document, t = t || r, r.evaluate(e, t, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  698. }
  699.  
  700. var i, s = [];
  701. if (!e) return s;
  702. if (r = r || document, n = n || window, o = o || void 0, t = t || r, "string" == typeof e) i = 0 === e.search(/^css;/i) ? function getAllElementsByCSS(e, t) {
  703. return (t || document).querySelectorAll(e);
  704. }(e.slice(4), t) : getAllElementsByXpath(e, t, r); else {
  705. if (!(i = e(r, n, o))) return s;
  706. if (i.nodeType) return s[0] = i, s;
  707. }
  708. return function makeArray(e) {
  709. var t, r, n, o = [];
  710. if (e.pop) {
  711. for (t = 0, r = e.length; t < r; t++) (n = e[t]) && (n.nodeType ? o.push(n) : o = o.concat(makeArray(n)));
  712. return a()(o);
  713. }
  714. if (e.item) {
  715. for (t = e.length; t;) o[--t] = e[t];
  716. return o;
  717. }
  718. if (e.iterateNext) {
  719. for (t = e.snapshotLength; t;) o[--t] = e.snapshotItem(t);
  720. return o;
  721. }
  722. }(i);
  723. }
  724. })();