javascript - 搜狗输入法回车键是可以输入英文的,通过keydown去检测回车键提交,但是有的时候用户只是输出英文字母,但是表单就已经提交了。
PHP中文网
PHP中文网 2017-04-10 16:54:41
[JavaScript讨论组]

RT 如何去解决这个问题。

PHP中文网
PHP中文网

认证0级讲师

全部回复(4)
PHPz

如果是input的话,文本域另当别论。监听input keydown和keyup事件。keydown记录此时的value,keyup判断当前按下的键是否为回车键,如果是,并且value值没有改变,即提交,否则不提交。

    var input = document.querySelector('input'),
        oldValue = '';

    input.addEventListener('keydown', function(e){
        oldValue = this.value;
    }, false);

    input.addEventListener('keyup', function(e){
        var code = e.keyCode;
        if( code == 13 ){
            if( oldValue === this.value ){
                console.log('submit');
            }
        }

    }, false);

测试截图

第一次回车不会打印submit,如果再按下回车就会打印。

阿神

监听表单的onsubmit事件即可,然后把提交按钮的type设置成submit。不需要监听keydown事件。

PHPz

既然你在楼上的回答里评论说有时候可能不是表单,我觉得:
加入你的提交按钮是个A,可以在keydown的时候判断一个变量,比如 isCanSubmit 。
在表单change的时候去看一下整个form是否可以提交,可以的话把这个变量赋值为true。

具体实施可能有点复杂,效率低。

伊谢尔伦

为了测试你这问题我还专门下了一个搜狗输入法。。。

代码如下:

js:

    $(function() {

//         $(document).keyup(function(event) {
//             if (event.keyCode == 13) {
//                 console.log($('#input').val());
//             }
//         });
        document.onkeydown= function(event) {
            if (event.keyCode == 13) {
                console.log($('#input').val());
            }
        }
    });

html:

<body>
<input id="input">
</body>

结果如下:

  1. 使用原生js和使用jquery出现这个问题的概率基本无差别。

  2. 使用keydown比使用keyup更容易触发此问题。(按下面的分析应该keyup更容易触发啊,不知道是我判断错误,还是我感觉错误)

  3. 和按键的时长有关系,快速的按下松开基本不触发此问题,长按一段时间几乎必定出现触发。

  4. 此问题只在搜狗时频繁出现,win8默认拼音输入法正常使用不会触发此问题,按键时间超长则也会触发此问题。

结论:

应该是和输入法缓冲区在输出之后返回焦点的时间不一致,搜狗返回焦点比较快,导致按键时间稍长就会,就会被已获取焦点的html响应。

解决方案:

本人技术渣,未想到合适的解决方案

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号