import Vditor from '../src/index' import '../src/assets/less/index.less' const bindCommentEvent = (cmtElement) => { const inputElement = cmtElement.querySelector('input') const id = cmtElement.getAttribute('data-id') inputElement.addEventListener('blur', () => { if (inputElement.value.trim() === '') { window.vditor.removeCommentIds([id]) removeComment(cmtElement, id) } }) cmtElement.querySelector('button').addEventListener('click', () => { window.vditor.removeCommentIds([id]) removeComment(cmtElement, id) }) cmtElement.addEventListener('mouseover', () => { window.vditor.hlCommentIds([id]) }) cmtElement.addEventListener('mouseout', () => { window.vditor.unHlCommentIds([id]) }) } const removeComment = (cmtElement, id) => { cmtElement.remove() let cmts = localStorage.getItem('cmts') if (!cmts) { return } else { cmts = JSON.parse(cmts) } cmts.find((item, index) => { if (item.id === id) { cmts.splice(index, 1) return true } }) localStorage.setItem('cmts', JSON.stringify(cmts)) } const renderComments = (ids) => { let cmts = localStorage.getItem('cmts') if (!cmts) { localStorage.setItem('cmts', '[]') cmts = [] } else { cmts = JSON.parse(cmts) } ids.forEach(commentData => { let text = '' cmts.find((item) => { if (item.id === commentData.id) { text = item.text return true } }) const cmtElement = document.createElement('div') cmtElement.setAttribute('data-id', commentData.id) cmtElement.setAttribute('style', `top:${commentData.top}px`) cmtElement.innerHTML = `
${text}

` cmtElement.value = text document.getElementById('comments'). insertAdjacentElement('beforeend', cmtElement) // 高度调整 const previousElement = cmtElement.previousElementSibling if (previousElement) { const previousTop = parseInt(previousElement.style.top) + previousElement.clientHeight + 20 if (previousTop > commentData.top) { cmtElement.style.top = previousTop + 'px' } } bindCommentEvent(cmtElement) }) document.getElementById('comments').addEventListener("scroll", () => { window.vditor.vditor.wysiwyg.element.scrollTop = document.getElementById('comments').scrollTop }) } const matchCommentsTop = (commentsData) => { commentsData.forEach((item) => { const commentElement = document.querySelector( `#comments div[data-id="${item.id}"]`) commentElement.setAttribute('style', `top:${item.top}px`) // 高度调整 const previousElement = commentElement.previousElementSibling if (previousElement) { const previousTop = parseInt(previousElement.style.top) + previousElement.clientHeight + 20 if (previousTop > item.top) { commentElement.style.top = previousTop + 'px' } } }) document.getElementById('comments').scrollTop = window.vditor.vditor.wysiwyg.element.scrollTop } window.vditor = new Vditor('vditor', { // _lutePath: `http://192.168.0.107:9090/lute.min.js?${new Date().getTime()}`, _lutePath: 'src/js/lute/lute.min.js', mode: 'wysiwyg', debugger: true, typewriterMode: true, placeholder: 'Hello, Vditor!', comment: { enable: true, adjustTop(commentsData) { matchCommentsTop(commentsData) }, add (id, text, commentsData) { commentsData.find((item, index) => { if (item.id === id) { const cmtElement = document.createElement('div') cmtElement.setAttribute('data-id', id) cmtElement.innerHTML = `
${text}

` cmtElement.value = text if (index === 0) { document.querySelector('#comments'). insertAdjacentElement('beforeend', cmtElement) } else { document.querySelector( `#comments div[data-id="${commentsData[index - 1].id}"]`). insertAdjacentElement('afterend', cmtElement) } bindCommentEvent(cmtElement) cmtElement.querySelector('input').focus() let cmts = localStorage.getItem('cmts') if (!cmts) { localStorage.setItem('cmts', '[]') cmts = [] } else { cmts = JSON.parse(cmts) } cmts.push({id, text}) localStorage.setItem('cmts', JSON.stringify(cmts)) return true } }) matchCommentsTop(commentsData) }, remove (ids) { ids.forEach((id) => { removeComment(document.querySelector(`#comments div[data-id="${id}"]`), id) }) matchCommentsTop(window.vditor.getCommentIds()) }, scroll (top) { document.getElementById('comments').scrollTop = top }, }, after () { renderComments(window.vditor.getCommentIds()) }, })