y_method

dom取得等の機能追加

当前为 2022-04-24 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/419955/1043484/y_method.js

  1. // ==UserScript==
  2. // @name y_method
  3. // @version 0.2
  4. // @description dom取得等の機能追加
  5. // @author y_kahou
  6. // ==/UserScript==
  7.  
  8.  
  9. const y_method = {
  10. /**
  11. * スタイルを追加する
  12. * @param id {string} - スタイルのID
  13. * @param css {string} - css本体
  14. */
  15. addStyle: function(id, css) {
  16. let style = document.createElement('style')
  17. style.id = id
  18. style.setAttribute('type', 'text/css')
  19. style.textContent = css
  20. document.querySelector('head').appendChild(style)
  21. },
  22. /**
  23. * 対象までスクロールせずにクリックする
  24. * @param selector {string} - 取得対象のセレクタ
  25. */
  26. click_: function(element) {
  27. let x = window.scrollX, y = window.scrollY
  28. element.click()
  29. window.scrollTo(x, y)
  30. },
  31. /**
  32. * 対象までスクロールせずにフォーカスする
  33. * @param selector {string} - 取得対象のセレクタ
  34. */
  35. focus_: function(element) {
  36. let x = window.scrollX, y = window.scrollY
  37. element.focus()
  38. window.scrollTo(x, y)
  39. },
  40. /**
  41. * 対象のdomを取得できるまで取得を挑戦する
  42. * @param selector {string} - 取得対象のセレクタ
  43. * @param interval {number} - 次の挑戦までの時間ms
  44. * @param repeat {number} - 繰り返し回数
  45. */
  46. repeatGetElements: function(selector, interval = 500, repeat = 60) {
  47. return new Promise(function(resolve, reject) {
  48. let cnt = 0
  49. let it = setInterval(function() {
  50. if (++cnt > repeat) {
  51. clearInterval(it)
  52. reject("Could'n get " + selector)
  53. }
  54. let ret = document.querySelectorAll(selector)
  55. if (ret.length > 0) {
  56. clearInterval(it)
  57. resolve(ret)
  58. }
  59. }, interval)
  60. })
  61. },
  62. /**
  63. * src込みのvideo要素の取得
  64. */
  65. getVideo: async function(selector = 'video') {
  66. let video
  67. for (var i = 0; i < 60; i++) {
  68. video = await repeatGetElements(selector)
  69. if (video[0].getAttribute('src'))
  70. break
  71. await wait(500)
  72. }
  73. return video
  74. },
  75.  
  76. /**
  77. * ファイル名に使えない文字を半角から全角へ変換する
  78. * @param name {string} - ファイル名
  79. */
  80. filenameEscape: function(name) {
  81. const target = ['\\', '/', ':', '*', '?', '"', '<', '>', '|', ]
  82. const rep = ['\', '/', ':', '*', '?', '”', '<', '>', '|', ]
  83. let ename = name
  84. for (let i = 0; i < target.length; i++) {
  85. ename = ename.replaceAll(target[i], rep[i])
  86. }
  87. return ename
  88. },
  89.  
  90. /**
  91. * SPA等のページ遷移をイベントで検知できるようにする
  92. * Event: pagetransition
  93. */
  94. DetectPagetransition: function() {
  95. let agoHref = location.href;
  96. new MutationObserver(() => {
  97. if (agoHref != location.href) {
  98. const event = new CustomEvent('pagetransition', { detail: location.href });
  99. document.dispatchEvent(event);
  100. agoHref = location.href;
  101. }
  102. })
  103. .observe(document.body, { childList: true, subtree: true ,attributes: true })
  104. },
  105. }
  106.  
  107. if (window.jQuery) (function($) {
  108. /**
  109. * 対象までスクロールせずにクリックする
  110. */
  111. $.fn.click_ = function() {
  112. y_method.click_(this[0])
  113. return this
  114. }
  115. /**
  116. * 対象までスクロールせずにフォーカスする
  117. */
  118. $.fn.focus_ = function() {
  119. y_method.focus_(this[0])
  120. return this
  121. }
  122. })(window.jQuery);