String.fromCharCode函数在HTML输入框移动端键盘的适配问题
解决移动端键盘无法通过String.fromCharCode获取输入字符的问题
问题根源
移动端虚拟键盘的键码(e.which/e.keyCode)和物理键盘的键码体系不兼容,且输入法输入时,键盘事件的键码往往不等于实际输入字符的Unicode值,导致String.fromCharCode无法正确转换出输入的字符。
解决方案
方案1:使用input事件直接获取输入内容(推荐)
input事件会在输入框内容实际变化时触发,不管是虚拟键盘输入、粘贴还是输入法联想输入,都能准确获取最新内容。如果只需要当前输入的单个字符,可以取内容的最后一位:
$(".inputsmeter").on('input', function() { const fullContent = $(this).val(); // 获取最后输入的字符 const inputChar = fullContent.slice(-1); alert(inputChar); });
如果需要精准对比输入前后的内容差异(比如处理删除操作),可以保存上一次的内容进行对比:
let prevContent = ''; $(".inputsmeter").on('input', function() { const currentContent = $(this).val(); let inputChar = ''; // 新增字符的情况 if (currentContent.length > prevContent.length) { inputChar = currentContent.slice(prevContent.length); } // 删除字符的情况(可选) else if (currentContent.length < prevContent.length) { inputChar = '已删除字符'; } alert(inputChar); prevContent = currentContent; });
方案2:改用e.key获取输入字符(键盘事件场景)
如果必须使用键盘事件(比如需要监听特定按键),可以直接使用e.key属性,它会返回实际输入的字符(而非键码),移动端主流浏览器均支持:
$(".inputsmeter").keyup(function(e) { const inputChar = e.key; // 过滤功能键(如回车、退格等,这类键的key值长度大于1) if (inputChar.length === 1) { alert(inputChar); } });
注意事项
- 避免依赖
keyCode/which这类过时的键码属性来转换字符,无论是移动端还是桌面端,e.key或input事件都是更可靠的选择。 - 处理中文等需要输入法候选的输入时,
input事件是唯一能准确获取最终输入内容的方式,键盘事件可能在候选词确认前就触发,无法拿到正确结果。
内容的提问来源于stack exchange,提问作者mutahir
相关产品推荐
相关产品推荐

