要想通过事件实时获取文本框文本,一开始是想到下面的方法,但实际效果都存在一定的缺点。


通过change/blur事件获取

  1. change事件只有在选中点击或者失焦的时候,才能够触发。
  2. blur事件则是只能在失焦才能除法。

我最初选择的是change事件,而这样显然是不符合实时获取的要求的。

然后在查找文档的时候,发现了input事件,这里的input指的是事件的名字。mdn对于input事件的解释是:

每当<input>元素的value值改变时,都会触发这个事件。

这个显然很适合我们的需求,先写个例子看一下效果。

<span>name:</span>
<span id="txt"></span><br/>
<label for="lastName"></label>
<input id="lastName" type="text"><br/>
let txt = document.getElementById('txt');
let lastName = document.getElementById('lastName');
let num = 0;
lastName.addEventListener('input', ()=>{
txt.innerText = lastName.value;
console.log(num++);
});

试了一下,效果的确很好,实时显示。

对于一般的普通文本框实时获取,input事件的确合适。但特殊情况下依然存在一些问题:

输入法的待选文本(拼音)也会同时获取显示,并且每一次输入都会触发事件。这会让显示的结果不够美观,同时,如果是需要实时获取并进行其它操作的话,比如模糊查询等,这会在输入时就产生很多次请求。(当然也可以使用防抖解决)

所以继续查找是否有更优的解决方案,于是发现了以下几种事件:

  1. compositionstart 事件触发于一段文字的输入之前
  2. compositionend 事件触发于当文本段落的组成完成或取消时
  3. compositionupdate 事件触发于字符被输入到一段文字的时候,在 compositionstart 事件之后不会立即执行

这些是MDN上找到的解释,很明显可以看出,这几个事件特别是前两个,是针对于有输入法候选词情况下产生的,很适合我们这种场景。有趣的是在MDN中,这几个事件被列在 Element 节点下,而不是事件节点下。

首先要实时获取文本框数据,在输入法状态输入完成后获取,使用 compositionend 事件。 但是在不使用输入法,或者删除输入的字符,是无法触发事件的,那么可以结合一下 input 事件使用。大致思路就是这样。示例:

let type = true;
lastName.addEventListener('compositionstart', ()=> type = false);
lastName.addEventListener('compositionend', ()=> type = true);
lastName.addEventListener('input', ()=>{
window.setTimeout(()=>{
if(type) txt.innerText = lastName.value;
}, 0);
});

加定时器是为了保证 compositionend 事件执行后 type 状态改变成功,否则 input 事件触发时,type 可能仍为false。

测试效果:

效果差不多已经达到了。

兼容性:

input 事件只适合 ie9 以上版本,且只支持文本和密码输入框。

composition~ 事件 MDN 上是支持 ie 的,但并未写清版本。

案例代码 es5 语法时最低支持 ie9。

参考:

动态获取input内容文本(排除候选拼音文本) - js事件的更多相关文章

  1. 微信小程序 --- 动态获取input的value

    这里对 input 使用的是 bindinput 方法: <input type="text" bindinput="input"> <but ...

  2. 后台拼接input 后,动态获取input的值

    //前台 <input id=" /> //后台 string text = request.form["text"].toString();

  3. 文本框变更值触发js事件

    //输入数量更新,不需要失去焦点才触发 $(document).on('input', "input[id^='itemquantity']", function () { sav ...

  4. 使用vue-element-admin框架从后端动态获取菜单

    1.前言 ​ vue-element-admin是一个纯前端的框架,左侧菜单是根据路由生成的.实际开发中经常需要根据当前登陆人员的信息从后端获取菜单进行展示,本文将详细介绍如何实现该功能. 2.详解 ...

  5. 微信小程序之动态添加、删除指定内容(view)和获取input值

    这次遇到个问题: 1. 动态的添加指定的view内容..嗯..很简单..wx:for就搞定 2. 动态添加的内容中有input,最终获取值的时候,要获取到所有input的值并且是一个数组..嗯.. 3 ...

  6. 获取input type=file 的文件内容(纯文本)

    一.获取input type=file 的文件内容(纯文本) 1.需求一 通过点击其他事件,来触发 文件选择框(限定格式为 .c 文件),而不是手动鼠标点击触发. [思路:] step1:将 inpu ...

  7. WebDriver获取table的内容(通过动态获取Table单元格的TagName对其innerHTML值进行获取)

    import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedHashMap;import java.util ...

  8. 获取input标签中file的内容

    1.直接获取文件中的内容: <form id="form" method="post" enctype="multipart/form-data ...

  9. appium如何获取conten-desc内容文本

    如何获取conten-desc内容文本 定位到该元素,通过getAttribute("name");来获取内容如:媒体报道 总结: 思路和selenium一样,可以理解为获取它的v ...

  10. 使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析

    使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析 因为我在前台使用了jquery的text()方法,而不是html ...

随机推荐

  1. Liunx常用操作(三)-如何忽略大小写查找

    1.vim 中的查找 搜索文件内容时加上 /c 参数可以忽略搜索字符的大小写 正常搜索:/helloworld 忽略操作:/helloworld/c 2.find 查找 使用find命令搜索文件时如果 ...

  2. ava进阶(39)--守护线程与定时器

    文档目录: 一.守护线程 二.定时器 ---------------------------------------分割线:正文------------------------------------ ...

  3. 第65篇 AJAX初识 校验用户名 登录示例 文件上传 csrftoken

    1, 知识储备 2. AJAX的定义 异步的JavaScript和XML 使用场景: JavaScript和后端的数据传递 2.1原生的JavaScript实现AJAX 2.2 JQuery实现 2. ...

  4. DataGrip连接MySql数据库失败:dataGrip java.net.ConnectException: Connection refused: connect.

    1.问题 报错:dataGrip java.net.ConnectException: Connection refused: connect. 详细错误:[08S01] Communications ...

  5. 2023第十四届极客大挑战 — RE WP

    RE方向出自:队友. Shiftjmp 去花后按p然后再反编译 最后flag为SYC{W3lc0me_tO_th3_r3veR5e_w0r1d~} 点击就送的逆向题 gcc 1.s -o 1` 生成e ...

  6. Python Code_03数据类型

    数据类型 author : 写bug的盼盼 development time : 2021/8/27 19:59 变量定义 name = '阿哈' print(name) print('标识',id( ...

  7. [转帖]Oracle 性能优化 之 游标及 SQL

    https://www.cnblogs.com/augus007/articles/9273236.html 一.游标 我们要先说一下游标这个概念. 从 Oracle 数据库管理员的角度上说,游标是对 ...

  8. 是否开启raid卡缓存的影响

    开启raid卡缓存 Write back 对IO性能的影响 背景 公司买了一台服务器. 想进行一下升级 但是因为管理员担心数据丢失, 使用了write through + (raid6 + hotsp ...

  9. 【网络流,dp】Gym102220A Apple Business

    Problem Link 有一棵 \(n\) 个点的完全二叉树(点 \(i\) 的父亲是 \(\lfloor i/2\rfloor\)),第 \(i\) 个点有 \(a_i\) 个苹果.现在有 \(m ...

  10. 机器学习从入门到放弃:卷积神经网络CNN(一)

    一.前言 在上一篇中我们使用全连接网络,来构建我们的手写数字图片识别应用,取得了很好的效果.但是值得注意的是,在实验的最后,最后我们无论把 LOSS 优化到如何低,似乎都无法在测试数据集 test d ...