scroll.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. var scroll = (() => {
  2. function race (done) {
  3. Promise.race([
  4. Promise.all([
  5. new Promise((resolve) => {
  6. var images = Array.from(document.querySelectorAll('img'))
  7. if (!images.length) {
  8. resolve()
  9. }
  10. else {
  11. var loaded = 0
  12. images.forEach((img) => {
  13. img.addEventListener('load', () => {
  14. if (++loaded === images.length) {
  15. resolve()
  16. }
  17. }, {once: true})
  18. })
  19. }
  20. }),
  21. new Promise((resolve) => {
  22. var diagrams = Array.from(document.querySelectorAll('code.mermaid'))
  23. if (!state.content.mermaid || !diagrams.length) {
  24. resolve()
  25. }
  26. else {
  27. var timeout = setInterval(() => {
  28. var svg = Array.from(document.querySelectorAll('code.mermaid svg'))
  29. if (diagrams.length === svg.length) {
  30. clearInterval(timeout)
  31. resolve()
  32. }
  33. }, 50)
  34. }
  35. }),
  36. new Promise((resolve) => {
  37. if (!state.content.mathjax) {
  38. resolve()
  39. }
  40. else {
  41. var timeout = setInterval(() => {
  42. if (mj.loaded) {
  43. clearInterval(timeout)
  44. resolve()
  45. }
  46. }, 50)
  47. }
  48. })
  49. ]),
  50. new Promise((resolve) => setTimeout(resolve, 500))
  51. ])
  52. .then(done)
  53. }
  54. function debounce (container, done) {
  55. var listener = /html|body/i.test(container.nodeName) ? window : container
  56. var timeout = null
  57. listener.addEventListener('scroll', () => {
  58. clearTimeout(timeout)
  59. timeout = setTimeout(done, 100)
  60. })
  61. }
  62. function listen (container, prefix) {
  63. var key = prefix + location.origin + location.pathname
  64. try {
  65. container.scrollTop = parseInt(localStorage.getItem(key))
  66. debounce(container, () => {
  67. localStorage.setItem(key, container.scrollTop)
  68. })
  69. }
  70. catch (err) {
  71. chrome.storage.local.get(key, (res) => {
  72. container.scrollTop = parseInt(res[key])
  73. })
  74. debounce(container, () => {
  75. chrome.storage.local.set({[key]: container.scrollTop})
  76. })
  77. }
  78. }
  79. return () => {
  80. var loaded
  81. race(() => {
  82. if (!loaded) {
  83. loaded = true
  84. var container = ((html = $('html')) => (
  85. html.scrollTop = 1,
  86. html.scrollTop ? (html.scrollTop = 0, html) : $('body')
  87. ))()
  88. if (state.content.scroll) {
  89. listen(container, 'md-')
  90. }
  91. else if (location.hash && $(location.hash)) {
  92. container.scrollTop = $(location.hash).offsetTop
  93. }
  94. if (state.content.toc) {
  95. setTimeout(() => listen($('#_toc'), 'md-toc-'), 10)
  96. }
  97. }
  98. })
  99. }
  100. })()