wait-for-selector

要素がDOMに出現するまで待つユーティリティです。

目前为 2022-04-09 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/443087/1038171/wait-for-selector.js

  1. // ==UserScript==
  2. // @name wait-for-selector
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0.0
  5. // @license MIT
  6. // @description 要素がDOMに出現するまで待つユーティリティです。
  7. // @author You
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. 'use strict'
  12. /**
  13. * @param {string} selectors
  14. * @param {number} [timeout=Infinity]
  15. * @param {ParentNode} [context=document.body]
  16. * @returns {Promise<Element>}
  17. */
  18. const waitForSelector = (selectors, timeout = Infinity, context = document.body) => {
  19. const element = context.querySelector(selectors)
  20.  
  21. if (element) {
  22. return Promise.resolve(element)
  23. }
  24.  
  25. return new Promise((resolve, reject) => {
  26. const observer = new MutationObserver(records => {
  27. for (const { addedNodes } of records) {
  28. if (!addedNodes.length) {
  29. continue
  30. }
  31.  
  32. const element = context.querySelector(selectors)
  33.  
  34. if (!element) {
  35. continue
  36. }
  37.  
  38. observer.disconnect()
  39. resolve(element)
  40. }
  41. })
  42.  
  43. observer.observe(context, {
  44. childList: true,
  45. subtree: true
  46. })
  47.  
  48. if (Number.isFinite(timeout)) {
  49. setTimeout(() => {
  50. observer.disconnect()
  51. reject(new Error('Element not found'))
  52. }, timeout)
  53. }
  54. })
  55. }
  56.  
  57. unsafeWindow.waitForSelector = waitForSelector