自动无缝翻页

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

当前为 2021-06-22 提交的版本,查看 最新版本

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