文本字段

type属性为textpassword<input>标签和textarea标签组成的字段有相同的接口。其 DOM 元素都有一个value属性,保存了为字符串格式的当前内容。将这个属性更改为另一个值将改变字段的内容。

文本字段selectionStartselectEnd属性包含光标和所选文字的信息。当没有选中文字时,这两个属性的值相同,表明当前光标的信息。例如,0 表示文本的开始,10 表示光标在第十个字符之后。当一部分字段被选中时,这两个属性值会不同,表明选中文字开始位置和结束位置。

和正常的值一样,这些属性也可以被更改。

想象你正在编写关于 Knaseknemwy 的文章,但是名字拼写有一些问题,后续代码将<textarea>标签和一个事件处理器关联起来,当点击F2时,插入 Knaseknemwy。

  1. <textarea></textarea>
  2. <script>
  3. let textarea = document.querySelector("textarea");
  4. textarea.addEventListener("keydown", event => {
  5. // The key code for F2 happens to be 113
  6. if (event.keyCode == 113) {
  7. replaceSelection(textarea, "Khasekhemwy");
  8. event.preventDefault();
  9. }
  10. });
  11. function replaceSelection(field, word) {
  12. let from = field.selectionStart, to = field.selectionEnd;
  13. field.value = field.value.slice(0, from) + word +
  14. field.value.slice(to);
  15. // Put the cursor after the word
  16. field.selectionStart = from + word.length;
  17. field.selectionEnd = from + word.length;
  18. }
  19. </script>

replaceSelection函数用给定的字符串替换当前选中的文本字段内容,并将光标移动到替换内容后让用户可以继续输入。change事件不会在每次有输入时都被调用,而是在内容在改变并失焦后触发。为了及时的响应文本字段的改变,则需要为input事件注册一个处理器,每当用户有输入或更改时就被触发。

下面的例子展示一个文本字段和一个展示字段中的文字的当前长度的计数器。

  1. <input type="text"> length: <span id="length">0</span>
  2. <script>
  3. let text = document.querySelector("input");
  4. let output = document.querySelector("#length");
  5. text.addEventListener("input", () => {
  6. output.textContent = text.value.length;
  7. });
  8. </script>