javascript - 将鼠标悬停在 React 输入中的最后一个字符上时显示菜单
问题描述
我目前正在使用 React-Bootstrap 处理一个表单,该表单具有一个接收消息的正文。此消息应包括从下拉菜单中选择的一些标签。问题是,当用户输入 & 时,将显示此下拉菜单,然后用户从菜单中选择一个选项来替换 & 符号。除了显示菜单的部分外,我几乎处理了所有事情。如何始终在用户输入的最后一个字符处显示菜单,以及如何在悬停在该字符上时显示它。例如,
“嗨,亲爱的,今天我们要处理 &[悬停在 & 符号上时必须在此处显示菜单]”
老实说,我很困惑,我只需要弄清楚我应该如何开始。如果有任何帮助,我将不胜感激。提前致谢。
问候。
解决方案
这是我想出的东西。
为了实现这一点,我首先想到的是检测input
or内部的插入符号位置textarea
。
我找到了这个库,它运行良好。 https://github.com/bubkoo/get-cursor-position
下一个任务是弄清楚如何在input
or中放置一个菜单textarea
。为此,我简单地创建了一个父对象div
并设置100% width and height
了它的输入,然后我们可以使用该 div 内的任何 html 标签放置它position: absolute
,它就像我们在input
标签内添加东西一样工作。
菜单添加了top
&left
我使用了那个库。其余的代码是基本的,您可以简单地在下面查看它。
这是代码:
const menu = document.querySelector('.menu')
function showMenu(element) {
let lastChar = element.value[element.value.length - 1],
caret = getCaretCoordinates(element, element.selectionEnd);
if (lastChar === "&") {
menu.style.display = 'block';
menu.style.left = caret.left + 20 + 'px'
menu.style.top = caret.top + 20 + 'px'
} else {
menu.style.display = 'none'
}
}
function copyText(text) {
const input = document.querySelector('#input')
input.value += " " + text
menu.style.display = 'none'
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: Arial, Helvetica, sans-serif;
transition: all 0.3s ease;
}
body {
height: 100vh;
width: 100vw;
display: grid;
place-content: center;
background-color: blueviolet;
}
.parent {
position: relative;
width: 500px;
height: 120px;
}
#input {
background-color: white;
width: 100%;
height: 100%;
border: none;
border-radius: 10px;
padding: 20px;
}
#input:focus {
border: 0;
outline: none;
}
.menu {
display: none;
position: absolute;
background-color: black;
color: white;
width: 100px;
}
.menu li {
text-align: center;
cursor: pointer;
height: 60px;
list-style: none;
display: grid;
place-content: center;
padding: 10px;
}
li:hover {
background: white;
;
color: black;
border: 1px solid black
}
<div class="parent">
<textarea id="input" oninput="showMenu(this)"></textarea>
<div class="menu">
<li onclick='copyText(this.innerText)'>Mango</li>
<li onclick='copyText(this.innerText)'>Banana</li>
<li onclick='copyText(this.innerText)'>Apple</li>
<li onclick='copyText(this.innerText)'>Orange</li>
<li onclick='copyText(this.innerText)'>Grapes</li>
</div>
</div>
<script src="https://rawgit.com/component/textarea-caret-position/master/index.js"></script>
推荐阅读
- python - 我如何使用 for 循环,以便在它运行我的第一个列表之后,它将继续使用我的第二个 for 循环和另一个列表
- rust - 为什么特征类型为`Box
` 错误“未实现大小”但 `async fn() -> Result<(), Box >` 有效吗? - javascript - NestJS 控制器未映射
- html - 引导放大防止图像缩小以及图像顶部的顶部
- reactjs - 带标签的单选按钮垂直对齐
- swift - 我正在尝试编译我的项目它给出了一个错误,例如“找不到'GoogleUtilities/GULAppEnvironmentUtil.h'文件”
- wordpress - WordPress - 获取每个用户的帖子
- azure - 使用 Google Cloud Run 进行 Azure Active Directory 身份验证
- sql-server - 如何将 INT 参数的默认值设置为 NULL?
- python - 使用 gpio 后树莓派零 w 程序崩溃