中文输入法不触发onkeyup事件的解决办法Script

本文探讨了中文输入法环境下,onkeyup事件无法正常触发的问题,并提供了使用oninput和onpropertychange事件的解决方案。此外,文章还介绍了如何利用compositionstart和compositionend事件,结合flag变量和setTimeout函数,实现中文输入后只触发一次input事件的优化方案。

中文输入法不触发onkeyup事件的解决办法Script

    • 摘要:这两天做一个需要实时监控文本框输入的功能,碰到了中文输入法无法触发onkeyup事件的恶心问题。具体表现是这样的:当监听一个input的keyup的事件的时候,英文输入法的情况下可以实时的通过keyup事件检测到文本框value的变化,但是当输入法变成中文后,input的keyup事件就不会被正常触发。这是最先前的写法。<html><head><scripttype="text/javascript"src="htt
    • 这两天做一个需要实时监控文本框输入的功能,碰到了中文输入法无法触发onkeyup事件的恶心问题。

      具体表现是这样的:

      当监听一个input的keyup的事件的时候,英文输入法的情况下可以实时的通过keyup事件检测到文本框value的变化,但是当输入法变成中文后,input的keyup事件就不会被正常触发。这是最先前的写法。

      <html><head><script type="text/javascript" src="http://www.th7.cn/static/js/jquery-1.4.2.min.js"></script></head><body> 使用keyup事件检测文本框内容: <input type="text" name="keyup_i" id="keyup_i" autocomplete="off"/> <span id="keyup_s"> <script type="text/javascript"> $('#keyup_i').bind('keyup', function(){ $('#keyup_s').text($(this).val()); }) </script> </body></html>

      如你所见,这样的写法遇到了中文不能触发keyup事件的问题。于是寻求解决方法,想起来baidu的搜索栏提示似乎是没有这个问题的,于是开始看百度的js。百度的js比较难看...方法命名净是一个字母,最后发现大概是使用了timeout做一个定时器来定时监测input框的修改。不是很满意这样的方法。于是继续查找看有没有更好的解决办法,于是就找到了oninput和onpropertychange两个事件。

      oninput是firefox下面可用,而onpropertychange则是ie下可用。两个方法有着一些区别。

      oninput只能检测到value这个属性的变化,而onpropertychange则可以检测到包含value的所有属性的变化。于是开始改成这个样子。

      <html><head><script type="text/javascript" src="http://www.th7.cn/static/js/jquery-1.4.2.min.js"></script></head><body> 使用oninput以及onpropertychange事件检测文本框内容: <input type="text" name="inputorp_i" id="inputorp_i" autocomplete="off"/> <span id="inputorp_s"> <script type="text/javascript"> //先判断浏览器是不是万恶的IE,没办法,写的东西也有IE使用者 var bind_name = 'input'; if (navigator.userAgent.indexOf("MSIE") != -1){ bind_name = 'propertychange'; } $('#inputorp_i').bind(bind_name, function(){ $('#inputorp_s').text($(this).val()); }) </script> </body></html>

      问题这么被解决了。

      以上是

中文输入法不触发onkeyup事件的解决办法Script

    • 的内容,更多 

中文输入法 英文输入法 文本框 监控 检测 

    • 的内容,请您使用右上方搜索功能获取相关信息。

转载自:https://www.aliyun.com/jiaocheng/1076282.html

 

 

还有一个比较详细的讲解:

https://www.cnblogs.com/owenChen/p/3215421.html

这个人总结了一下,还是可以作为参考的。

 

之前的只是解决了keyup的问题。但是中文输入法的问题还是没解决。。。

中文输入法的问题这样解决:

问题描述:

  监听文本输入框的input事件,在拼写汉字(输入法)但汉字并未实际填充到文本框中(选词)时会触发input事件,如图:

 

需求:选词完成后触发input事件,只触发一次。

 

解决办法:

通过查阅资料得知在输入中文(包括语音识别时)会先后触发compositionstart、compositionend事件,类似于keydown和keyup的组合。

触发compositionstart时,文本框会填入 “虚拟文本”(待确认文本),同时触发input事件;在触发compositionend时,就是填入实际内容后(已确认文本)。

先看看 compositionstart 的描述 和 compositionend 的 描述

compositionstart 事件触发于一段文字的输入之前(类似于 keydown 事件,但是该事件仅在若干可见字符的输入之前,而这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词)。

compositionend  当文本段落的组织已经完成或取消时,会触发该事件。

个人理解:

  compositionstart 在输入一段需要确认的文本如拼音to汉字、语音时会触发

  compositionend  在拼音选词完成、语音输入完毕时会触发

 至此,思路get: 声明一个标记flag,在compositionstart、compositionend两个事件过程之间的时候flag值为false,在input事件中通过flag的值来判断当前输入的状态。

OK,接下来贴出示例代码

复制代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
        <title></title>
    </head>
    <body>
    <input id="txt" type="text">
    <script>
        var flag = true;
        $('#txt').on('compositionstart',function(){
            flag = false;
        })
        $('#txt').on('compositionend',function(){
            flag = true;
        })
        $('#txt').on('input',function(){
            var _this = this;
            setTimeout(function(){
                if(flag){
                    console.log($(_this).val());
                }
            },0)
        })
    </script>
    </body>
</html>
复制代码

 

 

效果图:

 

 

tips:
  为什么使用延时器?
  因为选词结束的时候input会比compositionend先一步触发,此时flag还未调整为true,所以不能触发到console,故用setTimeout将其优先级滞后。

 

 

转载自:https://www.cnblogs.com/lonhon/p/7643095.html

转载于:https://www.cnblogs.com/benbendu/p/10282228.html

在Web开发中,`onkeyup` 事件用于监听用户释放键盘按键的动作。此事件常用于需要实时响应用户输入的场景,例如输入框的自动补全、实时搜索、表单验证等。 ### `onkeyup` 事件的基本用法 `onkeyup` 事件可以通过HTML属性或JavaScript代码绑定到特定的元素,例如 `<input>` 或 `<textarea>`。以下是一个简单的示例: ```html <input type="text" id="searchInput" onkeyup="handleSearch()" /> ``` 在JavaScript中定义对应的 `handleSearch` 函数: ```javascript function handleSearch() { const input = document.getElementById('searchInput').value; console.log('用户输入的内容:', input); // 在此处执行搜索或其他逻辑 } ``` ### `onkeyup` 的常见问题 1. **性能问题** 如果在 `onkeyup` 事件中执行复杂的操作(例如频繁的网络请求或DOM操作),可能会导致性能下降。为了避免这种情况,可以使用**防抖(debounce)**技术来限制事件处理函数的执行频率。例如: ```javascript.com function debounce(func, delay) { let timer; return function() { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, arguments); }, delay); }; } document.getElementById('searchInput').addEventListener('keyup', debounce(function() { console.log('防抖后的搜索请求:', this.value); }, 300)); ``` 2. **与 `onkeydown` 和 `onkeypress` 的区别** - `onkeydown`: 在用户按下任意键时触发,包括功能键(如 Shift、Ctrl)。 - `onkeypress`: 在用户按下字符键时触发包括功能键)。 - `onkeyup`: 在用户释放按键时触发,通常用于获取最终的输入值。 3. **跨浏览器兼容性** 虽然现代浏览器普遍支持 `onkeyup` 事件,但在某些旧版浏览器中可能存在兼容性问题。为了确保兼容性,可以使用 `addEventListener` 来绑定事件: ```javascript const inputElement = document.getElementById('searchInput'); if (inputElement.addEventListener) { inputElement.addEventListener('keyup', handleSearch, false); } else if (inputElement.attachEvent) { inputElement.attachEvent('onkeyup', handleSearch); // 适用于旧版IE } ``` 4. **移动端输入法兼容性** 在移动设备上,由于输入法的特性,`onkeyup` 事件可能无法准确捕获用户输入的每个字符。例如,某些输入法在预测输入时可能触发 `onkeyup`。为了解决这个问题,可以结合 `oninput` 事件来确保获取最新的输入值: ```javascript document.getElementById('searchInput').addEventListener('input', function() { console.log('移动端兼容的输入:', this.value); }); ``` ### 示例:结合 `onkeyup` 实现实时搜索 以下是一个完整的示例,展示如何使用 `onkeyup` 事件实现一个简单的实时搜索功能: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>实时搜索示例</title> <style> #results { border: 1px solid #ccc; margin-top: 10px; padding: 10px; } </style> </head> <body> <input type="text" id="searchInput" placeholder="输入搜索内容..." /> <div id="results"></div> <script> const inputElement = document.getElementById('searchInput'); const resultsElement = document.getElementById('results'); inputElement.addEventListener('keyup', debounce(fetchResults, 300)); function debounce(func, delay) { let timer; return function() { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, arguments); }, delay); }; } function fetchResults() { const query = this.value.trim(); if (query.length === 0) { resultsElement.innerHTML = ''; return; } // 模拟搜索结果 const mockResults = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'].filter(item => item.toLowerCase().includes(query.toLowerCase()) ); if (mockResults.length > 0) { resultsElement.innerHTML = '<ul>' + mockResults.map(item => `<li>${item}</li>`).join('') + '</ul>'; } else { resultsElement.innerHTML = '未找到匹配结果。'; } } </script> </body> </html> ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值