当前位置: 首页 > news >正文

前端如何设置模板参数

1.背景:

最近接到一个需求,在一个类似chatGpt的聊天工具中,要在对话框中设置模板,后端提供了很多模板参数,然后要求将后端返回的特殊字符转成按钮,编辑完成后在相应的位置拼接成字符串。


2.效果:

在点击发送后,页面上就是如此拼接后的字符串


当然,还进一步拓展了其功能,比如可以上传文件,解析出来后和其他字符拼接


3.实现

 要注意的是:你和后端约定好特殊字符的格式,比如我这里是的是:

text:"|`社工背景`| 根据信息介绍,请你写一封内容丰富的|`诱饵类型`|电子邮件"

 以下是完整的实现代码

// template 部分
<div id="text-container"> </div>// 功能部分,我封装成了三个函数,使用时updatePageWithText传入即可
function updatePageWithText(textData:any) {const regex = /(\|`[^`]+`\|)/g; // 匹配 |` 和 `| 之间的内容const newText = textData.replace(regex, function (match:any) {// 去除 |` 和 `|,同时为匹配文本创建一个可点击的 spanconst cleanMatch = match.replace(/\|`|`\|/g, '');return `<span class="green-text">${cleanMatch}</span>`;}).replace(/\+/g, ' '); // 把 `+` 替换为空格以正确显示文本const textContainer:any = document.getElementById('text-container');textContainer.innerHTML = newText;// 为所有绿色文本添加点击事件监听const greenTexts = textContainer.querySelectorAll('.green-text');greenTexts.forEach(function (greenText:any) {greenText.addEventListener('click', function () {convertToInput(this);});});
}function convertToInput(element:any) {const input = document.createElement('input');input.type = 'text';input.value = element.textContent;input.className = 'green-text'; // 保持输入框具有相同的类名,这样它的外观与span时相同// 添加失焦事件处理器以在输入结束时替换文本input.addEventListener('blur', function () {finishInput(element, this);});// 添加回车键事件处理器以在按下回车时替换文本input.addEventListener('keydown', function (event) {if (event.key === "Enter") {finishInput(element, this);}});element.replaceWith(input); // 替换 span 元素为输入框input.focus();
}function finishInput(spanElement:any, inputElement:any) {// 创建一个新的span元素来替换输入框const newSpan = document.createElement('span');newSpan.textContent = inputElement.value; // 使用输入框的值newSpan.className = 'green-text'; // 恢复原来的类名,以便保持外观和行为newSpan.addEventListener('click', function () {convertToInput(newSpan); // 添加点击事件,使得新的span也可以被点击并转换});inputElement.replaceWith(newSpan); // 替换输入框为新建的span元素
}

http://www.lryc.cn/news/261573.html

相关文章:

  • 06 使用v-model实现双向数据绑定
  • 【C++11特性篇】C++11中新增的initializer_list——初始化的小利器(2)
  • 计算机网络传输层(期末、考研)
  • 【STM32入门】4.1中断基本知识
  • HCIA-H12-811题目解析(3)
  • 【异步绘制】UIView刷新原理 与 异步绘制
  • [ERROR] ocp-server-ce-py_script_start_check-4.2.1 RuntimeError: ‘tenant_name‘
  • 模拟实验中经常遇到的问题和常用技巧
  • 微信小程序(二) ——模版语法1
  • 牛客小白月赛83 解题报告
  • 蓝桥杯专题-真题版含答案-【三角螺旋阵】【干支记年法】【异或加密法】【金字塔】
  • 鸿蒙篇——初次使用鸿蒙原生编译器DevEcoStudio创建一个鸿蒙原生应用遇到的坑--汇总(持续更新)
  • 细胞培养之一二三:哺乳动物细胞培养污染问题和解决方案
  • 《Linux C编程实战》笔记:文件属性操作函数
  • linux中的网络知识
  • tp中的调试模式
  • 【docker 】基于Dockerfile创建镜像
  • C# 提取PDF中指定文本、图片的坐标
  • CTF网络安全大赛是干什么的?发展史、赛制、赛程介绍,参赛需要学什么?
  • 阿里云SMC迁移RedHat/CentOS 5 内核升级
  • 无代码开发让合利宝支付与CRM无缝API集成,提升电商用户运营效率
  • 数据标注公司如何确保数据安全?景联文科技多维度提供保障
  • (C语言)精确计算程序运行时间的方法
  • 【Vulnhub 靶场】【VulnCMS: 1】【简单】【20210613】
  • 普冉(PUYA)单片机开发笔记(10): I2C通信-配置从机
  • Idea maven打包时 报错 illegalArgumentException: Malformed \uxxxx encoding 解决方法
  • Qt中槽函数在那个线程执行的探索和思考
  • C++ 类模板
  • 边缘计算系统设计与实践
  • 【Spark精讲】Spark存储原理