自动无缝翻页

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

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

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