就像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,貌似位置以正确了
这种封装好的组件只能看组件文档 uni-easyinput 增强输入框 | uni-app官网
事件称名 | 说明 | 返回值 |
---|---|---|
@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
这个属性。
在 uni-app 中,uni-easyinput
组件并不是 uni-app 官方提供的原生组件,而是可能来自某个第三方的库或者自定义组件。由于 uni-easyinput
不是官方组件,其行为和事件可能会与官方组件有所不同,且可能不支持直接监听光标位置移动的事件。
不过,基于你尝试的 uni.getSelectedTextRange
API,这是一个在原生小程序中用于获取文本输入框(如 input
、textarea
)的光标位置的方法。在 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
组件的 input
、focus
和 blur
事件来更新光标位置。然后,我们有一个 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