當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JS获取鼠标光标位置并在光标位置添加内容
生活随笔
收集整理的這篇文章主要介紹了
JS获取鼠标光标位置并在光标位置添加内容
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目標需求
- 獲取鼠標光標位置,然后點擊按鈕或其他事件,在鼠標光標的位置插入需要的文字等
準備工具
- contenteditable:contenteditable屬性指定元素內(nèi)容是否可編輯。
- window.getSelection(): 獲取鼠標光標位置
- window.getSelection().getRangeAt(params):getRangeAt把鼠標光標在的位置分成前后兩端,getRangeAt得到的是一個數(shù)組,params通常是數(shù)組的下表,我們這里寫0
- createRange():返回新創(chuàng)建的Range對象,可以用來表示文檔的一個區(qū)域或與該文檔相關(guān)的 DocumentFragment 對象。
HTML
react寫法
<div id="contentTable" className={styles['infoBox']} placeholder='請輸入內(nèi)容' contentEditable suppressContentEditableWarning onblur={this.blurDiv} />注意??
- 當不寫suppressContentEditableWarning這個屬性的時候,有可能會拋出警告:Warning: A component is contentEditable and contains children managed by React.
CSS
如果我們想給我div加一個placeholder的話,如下:
.infoBox {width: 100%;height: 115px;padding: 16px;line-height: 1;outline: none;&:empty::before {content: attr(placeholder);color: #808080;}}JS
// 光標從id為content的div標簽失焦的觸發(fā)blurDivblurDiv = () => {const positionObj = window.getSelection().getRangeAt(0)// setState是react自帶的api,這里把positionObj存起來,其他方法用的到this.setState({ positionObj })}// 插入動作modalOk = () => {const { item } = this.state// item為要插入的相關(guān)信息this.insertFun(item)}// 插入某個位置insertFun = item => {const { positionObj } = this.state// contentWrap是拿到上面👆div的dom,react如果拿不到真實dom的話,可以用ref或者useRef獲取真實的domconst contentWrap = document.getElementById('contentTable')const range = document.createRange()if (contentWrap.childNodes.length == 0) {contentWrap.appendChild(this.handleCreateContent(item))} else {// 這里判斷positionObj是否為undefined,是因為第一添加的時候是undefined,第一次添加的時候直接insertNode到id為contentTable這個父節(jié)點if (positionObj == undefined) {range.setStart(contentWrap.childNodes[0], 0)range.setEnd(contentWrap.childNodes[0], 0)range.insertNode(this.handleCreateContent(item))return}range.setStart(positionObj.startContainer, positionObj.startOffset)range.setEnd(positionObj.startContainer, positionObj.startOffset)range.insertNode(this.handleCreateContent(item))}}// 處理要插入什么內(nèi)容handleCreateContent = item => {const { dropMenuType, name, pagePath } = itemconst width = this.getTextWidth(`{${name}}`)const input = document.createElement('input')input.setAttribute('class', 'input')input.setAttribute('value', `{${name}}`)input.setAttribute('disabled', false)input.style.width = `${width + 5}px`input.style.border = 'none'return input}// 獲取文字的寬度,因為input的寬度不能用width:fit-content自適應(yīng),并且這里用input標簽的原因是因為想把要插入的內(nèi)容當作一個整體(光標選不中input里面的內(nèi)容,只能選input的前后)getTextWidth = str => {let dom = document.createElement('span')dom.setAttribute('id', 'textWidth')dom.style.display = 'inline-block'dom.textContent = strdocument.body.appendChild(dom)const w = document.getElementById('textWidth').clientWidthdocument.body.removeChild(document.getElementById('textWidth'))return w}// 最后,我們插入完,獲取id為contentTable里面的內(nèi)容getContent = () => {const contentWrap = document.getElementById("contentTable");// contentWrap.childNodes(數(shù)組的格式)里面就是我們要的數(shù)據(jù),我們處理一下就可以了console.log(contentWrap.childNodes)}總結(jié)
以上是生活随笔為你收集整理的JS获取鼠标光标位置并在光标位置添加内容的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GDI对象与核心对象
- 下一篇: 二十周岁的一篇小作文