JS操作文本域获取光标/指定位置插入

学习链接

js 如何获取与设置光标在input框的位置

在输入框/文本域中光标位置插入字符串

Web 中的“选区”和“光标”

可参考另外一篇:vue.js支持表情输入,这个比操作 div简单多了。

效果图

JS操作文本域获取光标/指定位置插入_第1张图片

代码

<style scoped>
textarea {
    outline: none;
    resize: none;
    border: 1px solid red;
    width: 400px;
    height: 200px;
    margin: 0;
    padding: 0;
    font-size: 16px;
    padding: 10px;
    font-family: monospace;
}
style>

<template>
    <div class="commennt-wrapper">
        <el-button type="primary" size="mini" @click="getSelection">getSelectionel-button>
        <el-button type="primary" size="mini" @click="setSelection">setSelectionel-button>
        <el-button type="primary" size="mini" @click="restoreSelection">restoreSelectionel-button>
        <el-button type="primary" size="mini" @click="replaceSpecified">replaceSpecifiedel-button>
        <br/>
        <br/>
        <textarea ref="textarea" v-model="content" id="textarea" cols="30" rows="10">textarea>
    div>
template>

<script>

export default {
    name: 'Comment',
    data() {
        return {
            content: '诺艾尔邀约任务截图',
        }
    },
    mounted() {
    },
    methods: {

        getSelection() {
            
            let textarea = this.$refs['textarea'];

            // 获取文本域光标光标的开始位置和结束位置

            // 1. 位置定义:文本框中有文字的话,第一个文字的左边是0,右边是1,第二个文字的左边是1,右边是2
            // 2. 当页面刚加载完,文本域中有默认文字,那么selectionStart和selectionEnd都是相同的数值,都是最后一个位置,即有多少个文字,数值就是多少
            // 3. 如果是选中了文本,那么selectionStart就是被选中文字最左边开始的位置的数值(上面已说明),selectionEnd就是被选中文字最右边结束的位置的数值(上面已说明)
            // 4. 注意:当点击了文本域某个位置(或选择了一段文字),然后又失去焦点,仍然可以通过下面的方法获取到光标之前的位置
            console.log(textarea.selectionStart,textarea.selectionEnd,'start,end');


        },

        setSelection() {

            let textarea = this.$refs['textarea'];

            // 调用setSelectionRange方法去选中文本前,一定要先focus
            textarea.focus();
            // 将光标选中指定的文字,如果指定的selectionStart和selectionEnd相同,那就是选择固定的某个位置。如果不同,那就是选择一段文字。
            textarea.setSelectionRange(1,2)
        },

        restoreSelection() {
            /* 可以直接获取文本域最后一次失焦的位置,然后通过这个位置恢复之前的选择 */
            let textarea = this.$refs['textarea'];
            console.log(textarea.selectionStart,textarea.selectionEnd,'start,end');
            
            // 调用setSelectionRange方法去选中文本前,一定要先focus
            textarea.focus();
            textarea.setSelectionRange(textarea.selectionStart,textarea.selectionEnd)
        },

        replaceSpecified() {
            // 将选中的文字替换掉,或者是在指定的位置插入文字

            let textarea = this.$refs['textarea'];

            console.log(textarea.selectionStart,textarea.selectionEnd,'start,end');

            // 最开始的位置要记录下,后面要根据它来设置插入文本后,设置光标的位置
            let selectionStart1 = textarea.selectionStart 

            let txtArr =  textarea.value.split('')
            txtArr.splice(textarea.selectionStart,textarea.selectionEnd - textarea.selectionStart,'love')
            textarea.value = txtArr.join('')

            // 替换文本后, 需要把光标,再次定位到替换后的那个位置,否则,它会回到最前面
            textarea.focus()
            textarea.setSelectionRange(selectionStart1 + 'love'.length,selectionStart1 + 'love'.length)
        }

    },
    components: {
    }
}
script>

你可能感兴趣的:(前端学习,javascript,前端,开发语言)