utils.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { ElLoading } from 'element-plus'
  2. export default {
  3. /**
  4. * 返回一个自带消抖效果的函数,用res表示。
  5. *
  6. * fn: 需要被消抖的函数
  7. * delay: 消抖时长
  8. * isImmediateCall: 是否在一组操作中的第一次调用时立即执行fn
  9. * isRememberLastCall:是否在一组中最后一次调用后等delay时长再执行fn
  10. */
  11. debounce(fn, delay = 250, isImmediateCall = true, isRememberLastCall = true) {
  12. console.assert(isImmediateCall || isRememberLastCall, 'isImmediateCall 和 isRememberLastCall 至少应有一个是true,否则没有意义!')
  13. let timer = null
  14. // 上次调用的时刻
  15. let lastCallTime = 0
  16. if (isImmediateCall && !isRememberLastCall) {
  17. return function (...args) {
  18. const currentTime = Date.now()
  19. if (currentTime - lastCallTime >= delay) {
  20. fn.apply(this, args)
  21. }
  22. lastCallTime = currentTime
  23. }
  24. } else if (!isImmediateCall && isRememberLastCall) {
  25. return function (...args) {
  26. if (timer) {
  27. clearTimeout(timer)
  28. }
  29. timer = setTimeout(() => {
  30. fn.apply(this, args)
  31. }, delay)
  32. }
  33. } else if (isImmediateCall && isRememberLastCall) {
  34. return function (...args) {
  35. const currentTime = Date.now()
  36. if (currentTime - lastCallTime >= delay) { // 一组操作中的第一次
  37. fn.apply(this, args)
  38. lastCallTime = currentTime
  39. return
  40. } else { // 一组中的后续调用
  41. if (timer) { // 在此之前存在中间调用
  42. lastCallTime = currentTime
  43. clearTimeout(timer)
  44. }
  45. timer = setTimeout(() => {
  46. fn.apply(this, args)
  47. lastCallTime = 0
  48. timer = null
  49. }, delay)
  50. }
  51. }
  52. } else {
  53. console.error('不应该执行到这里!')
  54. }
  55. },
  56. throttle(fn, interval = 250) {
  57. let lastRunTime = 0
  58. return function (...args) {
  59. let elapsedTime = Date.now() - lastRunTime
  60. if (elapsedTime < interval) {
  61. return null
  62. }
  63. let context = this
  64. lastRunTime = Date.now()
  65. return fn.apply(context, args)
  66. }
  67. },
  68. /**
  69. * 全屏相关,注意兼容性堪忧,即使这样写。
  70. */
  71. requestFullScreen(elem) {
  72. if (elem.requestFullscreen) {
  73. elem.requestFullscreen()
  74. } else if (elem.mozRequestFullScreen) {
  75. elem.mozRequestFullScreen()
  76. } else if (elem.webkitRequestFullscreen) {
  77. elem.webkitRequestFullscreen()
  78. } else if (elem.msRequestFullscreen) {
  79. elem.msRequestFullscreen()
  80. }
  81. },
  82. exitFullScreen() {
  83. if (document.exitFullScreen) {
  84. document.exitFullScreen()
  85. } else if (document.mozCancelFullScreen) {
  86. document.mozCancelFullScreen()
  87. } else if (document.webkitExitFullscreen) {
  88. document.webkitExitFullscreen()
  89. } else if (document.msExitFullscreen) {
  90. document.msExitFullscreen()
  91. }
  92. },
  93. loadUnitySceneGeneral() {
  94. // const loadingInstance = ElLoading.service({
  95. // background: 'black',
  96. // })
  97. window.onSceneLoaded = () => {
  98. console.log('unity scene loaded')
  99. }
  100. window.onRequestApiSuccess = () => { // unity模型里拿到了后端数据
  101. window.gMitt.emit('RequestApiSuccess-general', {})
  102. // loadingInstance.close()
  103. } //场景加载完毕回调
  104. window.gUnityInst && window.gUnityInst.SendMessage('SceneManager', 'LoadPage1')
  105. },
  106. loadUnitySceneMetaverse() {
  107. // const loadingInstance = ElLoading.service({
  108. // background: 'black',
  109. // })
  110. window.onSceneLoaded = () => {
  111. console.log('unity scene loaded')
  112. }
  113. window.onRequestApiSuccess = () => { // unity模型里拿到了后端数据
  114. window.gMitt.emit('RequestApiSuccess-metaverse', {})
  115. // loadingInstance.close()
  116. }
  117. window.gUnityInst && window.gUnityInst.SendMessage('SceneManager', 'LoadPage4')
  118. },
  119. }