我正在try 为一个打字网站实现这一功能,以便输入的每个字符都将包含在一个范围内.然而,我无法想出如何将可编辑文本的自定义文本设置为<div>,而不是<textarea>.

下面是输出的样子.

<div className="typableCustomDiv">
    <span>H</span>
    <span>E</span>
    <span>L</span>
    <span>L</span>
    <span>O</span>
</div>

我之所以想要将它们包含在一个跨度中以模拟<textarea>,原因如下:

  1. 不正确的字符将带有删除线并显示为红色.
  2. 绿色将用于突出显示正确的字符.
  3. 创建一个过渡,使您键入的每个字符都应该逐渐显示,从不透明度0到1的过渡时间为0.25秒.

推荐答案

前面的代码文本输入顺序错误,光标位于左侧的固定和退格位置

const typableCustomDiv = document.getElementById('typableCustomDiv');
let inputText = '';

typableCustomDiv.addEventListener('input', handleInput);
typableCustomDiv.addEventListener('keydown', handleKeyDown);

function handleInput(event) {
  const typedCharacter = event.data;

  if (typedCharacter) {
    inputText += typedCharacter;
  }

  updateDisplayedContent();
}

function handleKeyDown(event) {
  //backspace cleanup
  if (event.key === 'Backspace') {
    // Handle backspace key
    inputText = inputText.slice(0, -1);
    updateDisplayedContent();
    event.preventDefault();
  }
}

function updateDisplayedContent() {
  typableCustomDiv.innerHTML = '';

  for (let i = 0; i < inputText.length; i++) {
    const charSpan = document.createElement('span');
    charSpan.textContent = inputText[i];

    // Let's demonstrate, every 3rd char is wrong
    const isIncorrect = i % 3 === 0;
    const isCorrect = !isIncorrect;

    if (isCorrect) {
      charSpan.classList.add('correct', 'fade-in');
    } else {
      charSpan.classList.add('incorrect', 'fade-in');
    }

    typableCustomDiv.appendChild(charSpan);
  }
}
body {
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

.typableCustomDiv {
  border: 1px solid #ccc;
  padding: 10px;
  font-size: 18px;
  display: inline-block;
  height: 1.5rem;
  direction: rtl;
}

.correct {
  color: green;
}

.incorrect {
  text-decoration: line-through;
  color: red;
}

.fade-in {
  opacity: 0;
  animation: fadeIn 0.25s ease forwards;
}

@keyframes fadeIn {
  to {
    opacity: 1;
  }
}
<div id="typableCustomDiv" class="typableCustomDiv" contenteditable="true"></div>

Javascript相关问答推荐

如何解决这个未能在响应上执行json:body stream已读问题?

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

node TS:JWT令牌签名以验证客户端和后台问题之间的身份验证

MongoDB中的引用

如何在Javascript中的控制台上以一行形式打印循环的结果

为什么我的列表直到下一次提交才更新值/onChange

在nextjs服务器端api调用中传递认证凭证

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

查找最长的子序列-无法重置数组

Web Crypto API解密失败,RSA-OAEP

环境值在.js文件/Next.js中不起作用

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

从另一个数组中的对应行/键值对更新数组中的键值对对象

将多个文本框中的输出合并到一个文本框中

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

表单数据中未定义的数组键

将字体样式应用于material -UI条形图图例

找不到处于状态的联系人

MUI-TABLE:MUI表组件中交替行的不同 colored颜色 不起作用

打字脚本中的函数包装键入