首页 > 其他分享 >输入框加表情

输入框加表情

时间:2024-01-11 15:00:53浏览次数:18  
标签:selection return 输入框 range let editor options 表情

<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
156
<view
placeholder="请输入内容"
:addImg="status"
:change:addImg="editorRender.insertImage"
@blur="blurEvent"
@focus="focusEvent"
class="editor"
contenteditable="true"
></view>
</view>
<button @click="onAdd">添加表情</button>
</view>
</template>

<script>
export default {
data() {
return {
title: 'Hello',
status: 0
};
},
onLoad() {},
methods: {
onAdd() {
this.status++;
},
blurEvent() {},
focusEvent() {}
}
};
</script>

<script module="editorRender" lang="renderjs">
export default {
name: "o-editor",
data() {
return {
enterFlag: 2
};
},
mounted() {
let editor = document.querySelector(".editor");
editor.addEventListener("keydown", this.keydownEvent);
editor.addEventListener("keyup", this.keyupEvent);
editor.addEventListener("click", this.clickInput);
},
methods: {
/**
* 清空
*/
clearContent(){
let editor = document.querySelector(".editor");
editor.innerHTML = "";
this.keyupEvent();
},
keydownEvent(e) {
if (e.keyCode === 13) {
if (++this.enterFlag < 2) {
e.preventDefault();
return false;
}
this.enterFlag = -1;
return false;
}
},
keyupEvent(e) {
let editor = document.querySelector(".editor");
let content = editor.innerHTML;
if (e && e.keyCode === 13) {
let range = window.getSelection().getRangeAt(0);
range.endContainer.setAttribute("name", "o---input---div---")
}
this.callMethod('inputContent', content)
},
callMethod(methodName, value) {
this.$ownerInstance.callMethod(methodName, {
content: value
})
},
async insertImage(newValue) {
let url = 'https://lrwuyu.shenduxr.com/10001/20230605/ceb77ce688ea9556f40a46d02268e5ff.jpg';
console.log(newValue);
if (!newValue) {
return;
}
let options = {
src: 'https://lrwuyu.shenduxr.com/10001/20230605/ceb77ce688ea9556f40a46d02268e5ff.jpg',
width: '20px',
height: '20px',
extClass: 'emoji',
data: {
name: '你好啊'
}
};
if(options.type === 'clear'){
this.clearContent();
return;
}
// if (!options.src) {
// options.fail && options.fail("src cannot be empty");
// return;
// }
let img = document.createElement("img");
img.src = options.src;
img.setAttribute("style", `width: ${options.width}; height: ${options.height};`);
img.setAttribute("alt", options.alt);
img.setAttribute("class", options.extClass);
console.log(img);
// 节点上增加标签
await this.serialization(options.data, img);
this.insertImg(img);
options.success && options.success(true);
options.complete && options.complete('end');
},
insertImg(el) {
const editor = document.querySelector(".editor");
var selection = window.getSelection(); // 获取光标
if ( // 如果没有焦点或者焦点不在输入框内,聚焦到输入框
selection.anchorNode !== editor &&
!editor.contains(selection.anchorNode)
) {
// 聚焦到输入框
selection.removeAllRanges();
editor.focus();
if (editor.lastChild)
selection.getRangeAt(0).setStartAfter(editor.lastChild);
selection.collapseToEnd();
}

let range = selection.getRangeAt(0);
range.deleteContents();

range.insertNode(el);
range = range.cloneRange();
range.setStartAfter(el);
range.collapse();
selection.removeAllRanges();
selection.addRange(range);
this.keyupEvent();
},
// 序列化字符串:key=value;key=value
serialization(data, el) {
return new Promise((resovle) => {
if (data instanceof Object) {
let str = "";
const keys = Object.keys(data);
if (!keys || keys.length == 0) {
return '';
}
for (const key of keys) {
el.setAttribute(key, data[key]);
}
}
resovle(true)
})
},
// 点击输入框内容是设置光标
clickInput(e) {
if (!(e.target instanceof HTMLImageElement)) {
return;
}
let target = e.target;
// 获取点击图片的中心位置
let targetX = target.x + Math.floor(target.width / 2);

let selection = window.getSelection(); // 获取光标
let range = selection.getRangeAt(0);

range = range.cloneRange();
if (e.x < targetX) {
range.setStartBefore(target);
range.setEndBefore(target);
} else {
range.setStartBefore(target);
range.setEndAfter(target);
}

range.collapse();
selection.removeAllRanges();
selection.addRange(range);
}
}
};
</script>

<style>
.text-area {
background-color: red;
}
.editor {
width: 600rpx;
}
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}

.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}

.text-area {
display: flex;
justify-content: center;
}

.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>

标签:selection,return,输入框,range,let,editor,options,表情
From: https://www.cnblogs.com/symlove/p/17958600

相关文章

  • AI壁纸画展头像表情包流量主微信抖音小程序开源版开发
    AI壁纸画展头像表情包流量主微信抖音小程序开源版开发以下是AI壁纸画展头像表情包流量主微信抖音小程序开源版的开发功能列表:用户注册和登录:实现用户注册和登录功能,包括手机号登录、第三方登录等方式。图片上传和展示:用户可以上传自己的图片或选择系统提供的图片进行展示,支持图片......
  • 去掉bootstrap4自带的input输入框半透明阴影
    bootstrap 输入框等输入时会自带蓝色阴影效果,有时候我们并不需要。button同理查看bootstrap.css代码,搜索focus,找到相关内容。所以我们再写css,把它原来的覆盖掉就可以啦/*去掉bootstrap自带的input输入框半透明阴影*/.form-control:focus{ box-shadow:none;}......
  • Avatar虚拟人(一):如何实时驱动虚拟人表情口型
    语音驱动虚拟人功能简介ZEGOAvatarSDK提供了语音驱动功能,通过声音的声波信息,实时驱动当前虚拟人物的嘴形变化,使得虚拟形象能够和真人一样进行自然的情绪表达。可广泛应用于社交互动、语聊直播等场景中。虚拟人语音驱动的前提条件在实现虚拟人“语音驱动”功能之前,请确保:已在项目......
  • 封装一个表情包组件(支持自定义表情图片)(基于vue3语法)
    效果图文件图直接贴代码emotion.vue<template><divclass="emotion-containerbeauty-scroll-livechat"><divclass="emotion-btn"@click="toggleEmotionShow"><spanclass="iconfonticon-biaoqing1&quo......
  • 如何实现自定义表情?
    1、继承实现协议RCEmoticonTabSource2、在实现的代理方法loadEmoticonView返回View,(返回的以下图中红框区域,里面的视图及逻辑需要自己来添加实现)3、在会话页面viewdidLoad里添加表情包示例代码(Demo源码2中的类RCDCustomerEmoticonTab):RCDCustomerEmoticonTab.h@inter......
  • 输入工具栏修改样式、emoji 表情栏修改背景色
    问题1解决方案:修改输入框的调用的setInputBarType:style:请在聊天页面所在的控制器viewDidLoad中调用;在创建聊天页面的时候调用是没有效果的问题2解决方案:在聊天页面调用下面两行代码self.chatSessionInputBarControl.emojiBoardView.emojiBackgroundView.backgroundColor......
  • js表格输入框
    <!DOCTYPEhtml><htmllang="en"> <!----这里通过原生js实现了表格输入功能,总体分为一下步骤1,创建一个表格2,event.srcElement获取激活事件的对象,获取已经点击的单元格索引3,通过处理函数abc()判断输入内容并将内容显示在新的表格中。--><head>  <metacharset="UTF-......
  • element-ui实现输入框千分位
    需求:1.支持v-model。2.支持el-input所有属性。2.失去焦点添加千位符。3.获取焦点去掉千位符。组件一组件GalaxyNumberInput<template><el-inputclass="galaxy-num-input"v-model="displayValue":size="size":clearable......
  • 在输入框里直接粘贴图片的实现方式
    有很多Web编辑器支持直接复制粘贴图片,记录一下这种效果是怎么实现的拿到粘贴板上的imagefile对象document.querySelector('textarea').addEventListener('paste',e=>{constfile=Array.from(e.clipboardData.items).find(v=>v.type.includes('image'))......
  • 在输入框里直接粘贴图片
    有很多Web编辑器支持直接复制粘贴图片,记录一下这种效果是怎么实现的拿到粘贴板上的imagefile对象document.querySelector('textarea').addEventListener('paste',e=>{constfile=Array.from(e.clipboardData.items).find(v=>v.type.includes('image'))......