y_method

ちょっとした機能

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

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

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