当前位置: 首页 > 知识库问答 >
问题:

javascript - 各位大佬们, uni-app 中可以监听 uni-esayinput 的光标移动事件吗?

郑星辰
2024-07-01

就像QQ的聊天输入框一样,我先输入十个字,然后把光标移动到第三个字后面,这时候我想记录一下光标的位置,然后在当前位置插入一个emoji表情,
请问有这种事件吗?
今天我尝试了focue和input事件,貌似都不太行!
主要的代码:

      <uni-easyinput
        v-if="sendMsgWay === 0"
        class="builder-main__content"
        confirmType="send"
        ref="easyInput"
        :placeholder="placeholder"
        :clearable="false"
        v-model="message"
        @input="onInput"
        @focus="onInputFocus"
        @blur="onInputBlur"
        @confirm="onSendMessage"
      />
const cursorPosition = ref({})
//记录光标位置
const updateCursorPosition = ()=>{
  uni.getSelectedTextRange({
    success: res => {
      cursorPosition.value = {...res}
    }
  })
}
function onInputFocus(e) {
  updateCursorPosition();
}
function onInputBlur(){
  updateCursorPosition();
}
function onInput(){
  updateCursorPosition();
}

一个主要的现象就是,文字输入完成,移动光标到某个字后面,emoji表情就会插入到文字的最后,这时候我再移动光标,再插入emoji,貌似位置以正确了

共有2个答案

明阳旭
2024-07-01

这种封装好的组件只能看组件文档 �� uni-easyinput 增强输入框 | uni-app官网

Easyinput Events

事件称名 说明 返回值
@input 输入框内容发生变化时触发 -
@focus 输入框获得焦点时触发 -
@blur 输入框失去焦点时触发 -
@confirm 点击完成按钮时触发 -
@iconClick 点击图标时触发 prefix/suffix

很明显没有提供你需要的API,不过我看组件的源码是有抛出很多不在文档上的事件 �� uni-ui/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue at master · dcloudio/uni-ui

那么如果你是 HBX 创建的项目,可以自己修改 uni_modules 目录下的 uni-easyinput 组件源码。或者不是 HBX 创建的项目也可以自己监听 input 元素的 keydown 事件通过 selectionStart 属性来获取光标位置。

<script setup>
import { ref } from 'vue'

const msg = ref('Hello World!')
const cursorPosition = ref('blur')

const getCursorPosition = (e) => {
  cursorPosition.value = e.target?.selectionStart
}
const handleBlur = () => {
  cursorPosition.value = 'blur'
}
</script>

<template>
  <input v-model="msg" @keydown="getCursorPosition" @focus="getCursorPosition" @blur="handleBlur"/>
  <h2>当前光标位置:{{ cursorPosition }}</h2>
</template>

但是我不太确定 uni-app 的场景下是否有 selectionStart 这个属性。

闻人越
2024-07-01

在 uni-app 中,uni-easyinput 组件并不是 uni-app 官方提供的原生组件,而是可能来自某个第三方的库或者自定义组件。由于 uni-easyinput 不是官方组件,其行为和事件可能会与官方组件有所不同,且可能不支持直接监听光标位置移动的事件。

不过,基于你尝试的 uni.getSelectedTextRange API,这是一个在原生小程序中用于获取文本输入框(如 inputtextarea)的光标位置的方法。在 uni-app 中,如果你想要模拟这样的行为,你可能需要在自定义的 uni-easyinput 组件中增加对光标位置的支持,或者直接使用原生的 textarea 组件(如果 uni-easyinput 允许的话)。

以下是一个基于 textarea 的例子,演示了如何获取和更新光标位置,并在光标位置处插入文本(如 emoji 表情):

<template>
  <view>
    <textarea 
      ref="myTextarea" 
      v-model="message" 
      @input="handleInput" 
      @focus="handleFocus"
      @blur="handleBlur"
      placeholder="请输入内容..."
    ></textarea>
    <button @click="insertEmoji">插入 Emoji</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      message: '',
      cursorPosition: { start: 0, end: 0 },
    };
  },
  methods: {
    handleInput(e) {
      this.updateCursorPosition();
    },
    handleFocus(e) {
      this.updateCursorPosition();
    },
    handleBlur(e) {
      this.updateCursorPosition();
    },
    updateCursorPosition() {
      uni.getSelectedTextRange({
        success: (res) => {
          this.cursorPosition = res;
        },
      });
    },
    insertEmoji() {
      const emoji = '��'; // 假设这是你想要插入的 emoji
      const startPos = this.cursorPosition.start;
      const endPos = this.cursorPosition.end;
      // 插入 emoji 到光标位置
      this.message = this.message.slice(0, startPos) + emoji + this.message.slice(endPos);
      // 更新光标位置到 emoji 后面
      this.cursorPosition = { start: startPos + emoji.length, end: startPos + emoji.length };
      // 触发 textarea 重新聚焦,以便光标位置更新
      this.$nextTick(() => {
        this.$refs.myTextarea.focus({ success: () => {
          uni.setSelectionRange({
            inputId: this.$refs.myTextarea.getInputId(),
            start: startPos + emoji.length,
            end: startPos + emoji.length,
          });
        }});
      });
    },
  },
};
</script>

在上面的代码中,我们使用了 textarea 组件的 inputfocusblur 事件来更新光标位置。然后,我们有一个 insertEmoji 方法,它在当前光标位置插入一个 emoji,并更新光标位置到 emoji 后面。

注意,你可能需要根据实际的 uni-easyinput 组件的特性和 API 来调整上面的代码。如果 uni-easyinput 组件不支持类似的功能,你可能需要考虑替换为原生组件或者修改 uni-easyinput 组件的源码来添加这些功能。

 类似资料:
  • uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 DCloud公司拥有600万开发者用户,几十万应用案例、12亿手机端月活用户,数千款uni-app插件、70+微信/qq群。阿里小程序工具官方内置uni-app(详见),腾讯课堂官方

  • 1. 配置安全域名 需要在小程序的安全域名设置中,添加诸葛域名为安全域名,默认域名为: https://u.zhugeapi.net https://ubak.zhugeio.com 注意:如果通过load函数修改了默认数据上传地址,则需要将修改后的数据上传地址,设置为安全域名。 2. 安装sdk 2.1 在小程序中执行命令安装sdk包 npm install --production zg-sd

  • JeeSite Mobile Uni-App 是 JeeSite 手机端框架/移动端框架,基于 uni-app、uView UI 实现。 uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web、 以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 uView UI,是 uni-app 生态最优秀的

  • 使用 uni-app 的 renderjs,监听逻辑层的数据: 更新任何一个逻辑层的变量,updateXXX 都会被调用。请教这是什么原因?

  • 一、创建应用 注册/登录 sharetrace控制台 并创建应用。 二、导入插件 在 Dcloud 插件市场购买 sharetrace 免填邀请码 插件(免费)。 按照Dcloud 官方教程 导入插件,并配置 sharetrace_key,sharetrace_key 即是你在 sharetrace 官网创建 App 后,系统为你分配的appKey。 三、获取参数 插件导入后,在需要获取安装参数的

  • 一、配置微信小程序 配置小程序服务域名、获取小程序ID和密钥 二、uni-app开源版 1、打开商城后台下载小程序开源版代码,然后解压 2、下载hbuilder软件([https://www.dcloud.io/hbuilderx.html])该软件可以开发uni-app 3、下载完成后解压、然后打开软件并且选择你解压出来的小程序源码导入 4、修改文件的api路径 示例(https://baidu