comment.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import Vditor from '../src/index'
  2. import '../src/assets/less/index.less'
  3. const bindCommentEvent = (cmtElement) => {
  4. const inputElement = cmtElement.querySelector('input')
  5. const id = cmtElement.getAttribute('data-id')
  6. inputElement.addEventListener('blur', () => {
  7. if (inputElement.value.trim() === '') {
  8. window.vditor.removeCommentIds([id])
  9. removeComment(cmtElement, id)
  10. }
  11. })
  12. cmtElement.querySelector('button').addEventListener('click', () => {
  13. window.vditor.removeCommentIds([id])
  14. removeComment(cmtElement, id)
  15. })
  16. cmtElement.addEventListener('mouseover', () => {
  17. window.vditor.hlCommentIds([id])
  18. })
  19. cmtElement.addEventListener('mouseout', () => {
  20. window.vditor.unHlCommentIds([id])
  21. })
  22. }
  23. const removeComment = (cmtElement, id) => {
  24. cmtElement.remove()
  25. let cmts = localStorage.getItem('cmts')
  26. if (!cmts) {
  27. return
  28. } else {
  29. cmts = JSON.parse(cmts)
  30. }
  31. cmts.find((item, index) => {
  32. if (item.id === id) {
  33. cmts.splice(index, 1)
  34. return true
  35. }
  36. })
  37. localStorage.setItem('cmts', JSON.stringify(cmts))
  38. }
  39. const renderComments = (ids) => {
  40. let cmts = localStorage.getItem('cmts')
  41. if (!cmts) {
  42. localStorage.setItem('cmts', '[]')
  43. cmts = []
  44. } else {
  45. cmts = JSON.parse(cmts)
  46. }
  47. ids.forEach(commentData => {
  48. let text = ''
  49. cmts.find((item) => {
  50. if (item.id === commentData.id) {
  51. text = item.text
  52. return true
  53. }
  54. })
  55. const cmtElement = document.createElement('div')
  56. cmtElement.setAttribute('data-id', commentData.id)
  57. cmtElement.setAttribute('style', `top:${commentData.top}px`)
  58. cmtElement.innerHTML = `<div>
  59. ${text}<br>
  60. <button>删除</button><br>
  61. <input>
  62. </div>`
  63. cmtElement.value = text
  64. document.getElementById('comments').
  65. insertAdjacentElement('beforeend', cmtElement)
  66. // 高度调整
  67. const previousElement = cmtElement.previousElementSibling
  68. if (previousElement) {
  69. const previousTop = parseInt(previousElement.style.top) +
  70. previousElement.clientHeight + 20
  71. if (previousTop > commentData.top) {
  72. cmtElement.style.top = previousTop + 'px'
  73. }
  74. }
  75. bindCommentEvent(cmtElement)
  76. })
  77. document.getElementById('comments').addEventListener("scroll", () => {
  78. window.vditor.vditor.wysiwyg.element.scrollTop = document.getElementById('comments').scrollTop
  79. })
  80. }
  81. const matchCommentsTop = (commentsData) => {
  82. commentsData.forEach((item) => {
  83. const commentElement = document.querySelector(
  84. `#comments div[data-id="${item.id}"]`)
  85. commentElement.setAttribute('style', `top:${item.top}px`)
  86. // 高度调整
  87. const previousElement = commentElement.previousElementSibling
  88. if (previousElement) {
  89. const previousTop = parseInt(previousElement.style.top) +
  90. previousElement.clientHeight + 20
  91. if (previousTop > item.top) {
  92. commentElement.style.top = previousTop + 'px'
  93. }
  94. }
  95. })
  96. document.getElementById('comments').scrollTop = window.vditor.vditor.wysiwyg.element.scrollTop
  97. }
  98. window.vditor = new Vditor('vditor', {
  99. // _lutePath: `http://192.168.0.107:9090/lute.min.js?${new Date().getTime()}`,
  100. _lutePath: 'src/js/lute/lute.min.js',
  101. mode: 'wysiwyg',
  102. debugger: true,
  103. typewriterMode: true,
  104. placeholder: 'Hello, Vditor!',
  105. comment: {
  106. enable: true,
  107. adjustTop(commentsData) {
  108. matchCommentsTop(commentsData)
  109. },
  110. add (id, text, commentsData) {
  111. commentsData.find((item, index) => {
  112. if (item.id === id) {
  113. const cmtElement = document.createElement('div')
  114. cmtElement.setAttribute('data-id', id)
  115. cmtElement.innerHTML = `<div>
  116. ${text}<br>
  117. <button>删除</button><br>
  118. <input>
  119. </div>`
  120. cmtElement.value = text
  121. if (index === 0) {
  122. document.querySelector('#comments').
  123. insertAdjacentElement('beforeend', cmtElement)
  124. } else {
  125. document.querySelector(
  126. `#comments div[data-id="${commentsData[index - 1].id}"]`).
  127. insertAdjacentElement('afterend', cmtElement)
  128. }
  129. bindCommentEvent(cmtElement)
  130. cmtElement.querySelector('input').focus()
  131. let cmts = localStorage.getItem('cmts')
  132. if (!cmts) {
  133. localStorage.setItem('cmts', '[]')
  134. cmts = []
  135. } else {
  136. cmts = JSON.parse(cmts)
  137. }
  138. cmts.push({id, text})
  139. localStorage.setItem('cmts', JSON.stringify(cmts))
  140. return true
  141. }
  142. })
  143. matchCommentsTop(commentsData)
  144. },
  145. remove (ids) {
  146. ids.forEach((id) => {
  147. removeComment(document.querySelector(`#comments div[data-id="${id}"]`),
  148. id)
  149. })
  150. matchCommentsTop(window.vditor.getCommentIds())
  151. },
  152. scroll (top) {
  153. document.getElementById('comments').scrollTop = top
  154. },
  155. },
  156. after () {
  157. renderComments(window.vditor.getCommentIds())
  158. },
  159. })