自动无缝翻页

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

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

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