8***@qq.com
8***@qq.com
  • 发布:2017-09-08 14:17
  • 更新:2022-04-01 16:00
  • 阅读:9555

如何强制禁用软键盘

分类:MUI

我在用mui界面布局中;有时候场景需要输入框不需要弹出软键盘输入法;如何强制关闭呢?请各位同仁们讨教;谢谢啦

2017-09-08 14:17 负责人:无 分享
已邀请:
8***@qq.com

8***@qq.com (作者)

你好;这样的话;我文本框就没办法获取光标;我的目的禁用系统自带的软键盘;但是input 文本框还是可以通过其他方式输入值的

1***@qq.com

1***@qq.com - 90后

disabled="disabled"

回梦無痕

回梦無痕 - 暂停服务

之前见到过一个做计算器的也差不多是这个需求,
是通过div仿造input,然后监听这个仿造的input的tap事件,控制弹出自制的键盘,
然后在自制键盘的js控制输入数字和仿造input的显示数字

8***@qq.com

8***@qq.com (作者)

<div contenteditable="true" id="t"> 你意思这种方式吗;或者你有更好的方案;给个代码参考一下啊

回梦無痕

回梦無痕 - 暂停服务

contenteditable的话,还是会弹出键盘的,要用div伪装一个input,然后监听这个div触摸事件,然后弹出自己的键盘,你既然不想弹出系统键盘,肯定有自己做的键盘吧?然后放一个宽度2px的div到伪装input上,给他一个闪烁动画,然后根据自己的键盘输入,插入到伪装input中,这就完成了。
这是一个思路,我没有现成的代码,你自己写吧。

8***@qq.com

8***@qq.com (作者)

目前我这个需求都不需要软键盘;因为我是通过扫描枪扫描;扫描条形码方式;把值传递到文本框中的

  • 回梦無痕

    那就直接放一个div,js把数值插入到这个div就行了

    2017-09-08 16:55

  • 8***@qq.com (作者)

    你说的我有个疑问;就是放一个div;然后怎么获取外部扫描枪扫的条形码的“值”;一般要光标在文本框中有焦点了;才能把值放到那个地方去;所以怎么用js填充到div 中呢;我有点没明白;谢谢

    2017-09-08 17:02

  • 回梦無痕

    回复 8***@qq.com:楼下有代码。

    2017-09-08 17:49

1***@qq.com

1***@qq.com - 90后

你的意思是通过js填值是吧,很简单啊

<input disabled="disabled" id="test" />
<script>
document.getElementById("test").value = "你要填入的值";
</script>

8***@qq.com

8***@qq.com (作者)

我这个是一个pda自带扫描枪;光标焦点在什么地方;值就会填充在什么地方;所以js应该是无法这么写的

  • 回梦無痕

    这个需求肯定能实现的,要看具体代码。因为总要有代码填充数值的

    2017-09-08 18:04

  • 上海Allen

    你这个和我的需求差不多,我的是领料单扫描输入

    2017-09-27 15:26

  • ivan8015

    这个问题我也想解决,这样方便一些蓝牙的扫描头接入APP,如果Plus API能控制软键盘弹出和禁用就好了,现在只能够PDA扫描事件去控制了,一般PDA都会发扫描到条码就会发送一个广播的,APP就可以监听广播的方式获取扫描头返回值。

    2017-10-09 10:45

1***@qq.com

1***@qq.com - 90后

我刚刚测试了,软键盘是可以禁止,但是如果把软键盘给禁止掉的话,input框是获取不到焦点的,所以还是得研究研究pad 扫描枪怎么填充值的;

6***@qq.com

6***@qq.com

我也做过这样的扫描功能,解决方案是获取焦点后,用plus调用系统,强制隐藏键盘,其实键盘在弹出来的时候隐藏,前台会有一个延迟,但是影响不大,能够满足要求

  • 8***@qq.com (作者)

    你好;楼上的;你这个解决方案案例可以供参考一下么;感激不尽

    2017-09-15 16:40

  • isnotnull

    有示例么 也是这个问题 NI个 LI 放input 而且每次扫完 聚焦到另外的LI的input 他们的的DIV 伪装完全都是不是很适合。

    2017-10-26 12:05

b***@163.com

b***@163.com

獲取焦點,然後調用imm.hideSoftInputFromWindow(nativeWebview.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);強制隱藏軟鍵盤,不過效果就是軟鍵盤會閃燈一下。

  • 8***@qq.com (作者)

    这个方法我试过;我这里没试成功

    2017-09-16 15:19

  • 8***@qq.com (作者)

    var main = plus.android.runtimeMainActivity();

    var Context = plus.android.importClass("android.content.Context");

    InputMethodManager = plus.android.importClass("android.view.inputmethod.InputMethodManager");

    imm = main.getSystemService(Context.INPUT_METHOD_SERVICE);

    imm.toggleSoftInput(nativeWebview.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS); 代码是否这样的;因为我是运行这个的时候 “nativeWebview.getWindowToken(),” 这个一直报错误


    Uncaught TypeError: Cannot call method 'getWindowToken' of undefined at template/quarantdetail.html:122

    2017-09-16 17:34

  • b***@163.com

    nativeWebview = plus.webview.currentWebview().nativeInstanceObject(); openWindow打開當前頁面,要傳唯一ID過來

    2018-12-05 15:01

uniapper

uniapper - abc

做个假的input,希望能帮到你

    <style type="text/css">  
        .field {  
            height:30px;  
            width:200px;  
            border: 1px solid ;  
            padding:5px;  
            line-height: 30px;  
        }  
        .field .pointer  {  
            height:100%;  
        }  
        .field .pointer.focus {  
            border-left: 1px solid;  
        }  
    </style>  
    <div class='field'>  
        <div class="pointer focus"></div>  
    </div>  
    <button id="scan">模拟扫描显示</button>  
    <script src="js/zepto.min.js" type="text/javascript" charset="utf-8"></script>  
    <script type="text/javascript">  
        (function($){  
            var oPointer = $(".field .pointer");  
            var flash = setInterval(function(){  
                if(oPointer.hasClass('focus')){  
                    oPointer.removeClass('focus');  
                }else{  
                    oPointer.addClass('focus');  
                }  

            }, 600);  

        $('#scan').on('click', function(e){  
            clearInterval(flash);  
            $('.field').text('77777777777');  
        });  
        })(Zepto);  
    </script>
  • 8***@qq.com (作者)

    怎么获取扫描枪的值呢

    2017-09-28 15:39

uniapper

uniapper - abc

没弄过扫描枪,不过猜测是否系统就是将它认为是键盘??如果是的花那么下面的改进的代码应该可以。


    <style type="text/css">  
        .field {  
            height:30px;  
            width:200px;  
            border: 1px solid ;  
            padding:5px;  
            line-height: 30px;  
        }  
        .field .pointer  {  
            height:100%;  
        }  
        .field .pointer.focus {  
            border-left: 1px solid;  
        }  

    </style>  
    <div id="ipt" class='field'>  
        <div class="pointer focus"></div>  
    </div>  
    <input type="hidden" name="scanRs"  />  
    <button id="temp" style="width:0; height:0; padding:0; border:0"></button>  

    <script src="js/zepto.min.js" type="text/javascript" charset="utf-8"></script>  
    <script type="text/javascript">  
        (function($){  
            var flash = null;  

            var flashFn = function(domObj){  

                    console.log(domObj);  
                    if(flash !== null){  
                        return ;  
                    }   
                    console.log(flash);  
                    flash = setInterval(function( ){  
                                                console.log('Flashing... ' (  new Date()));   
                        if(domObj.hasClass('focus')){  
                            domObj.removeClass('focus');  
                        }else{  
                            domObj.addClass('focus');  
                        }  

                    }, 600);  
                }  

            flashFn($('.field .pointer'));  

            $('#temp').focus();  

            $('#ipt').on('click', function(e){  
                clearInterval(flash);   
                $('#temp').focus();   
                $(this).html('<div class="pointer focus"></div>');    
            })  

            $('#temp').on('keyup', function(e){   
                clearInterval(flash);   
                var val = $('#ipt').text();  
                val  = e.key;  
                $('#ipt').text(val);  
                console.log(e.key);  
            })  
        })(Zepto);  
    </script>
isnotnull

isnotnull

困扰我2天了。也是这个问题

8***@qq.com

8***@qq.com (作者)

关于mui 禁用软键盘;目前有更好的解决方案吗

8***@qq.com

8***@qq.com (作者)

有一起解决的吗

8***@qq.com

8***@qq.com (作者)

欢迎探讨

  • 1***@163.com

    上边说的问题 解决了么

    2018-09-27 14:33

1***@163.com

1***@163.com - 游刃于It

楼主解决了么

n***@qq.com

n***@qq.com

楼主解决了么

6***@qq.com

6***@qq.com

楼主解决了吗? 要是解决了请告诉小弟怎么解决的 感激不尽

zhagons

zhagons

给<input type="text" >设置readonly="readonly",点击这个input,这个input就获取焦点了,不会弹出键盘,用js 加个闪动的边框或者其他的标识,表示这个input focus,pad扫到的值会填充到里边的。
如果需要既可扫描,又可输入,那就在输入框旁边做一个按钮,点击改变是否readonly,不是readonly,就可以手动输入,是readonly,就扫描 不弹出键盘。

  • zhagons

    我自己试过 ,真实可行

    2019-08-14 16:30

  • 翻皮的鱼

    回复 zhagons: 你 这个 输入框 都 readonly了 扫描条码,值怎么填充到 输入框的?能说的具体点吗 ,我最近也做一个pda 的入库页面,遇到这个问题

    2019-08-17 16:26

  • zhagons

    回复 翻皮的鱼: 输入框 readonly 状态 ,focus 状态 还是有的,点击readonly 状态的输入框 ,然后用的pda的扫描条码,条码内容 就自动到了 输入框内

    2019-08-19 08:55

  • 红发海贼

    回复 zhagons: 我信你个鬼,不行的

    2019-12-11 09:32

  • zhagons

    回复 红发海贼: 你试了 没有 我们公司仓库 已经用了 几年了

    2020-06-10 08:38

  • 落魄实习生

    回复 zhagons: 是点击关闭readonly?然后开启对焦?

    2020-07-03 09:21

  • netlock

    有联系方式吗 想问问你咋做的

    2020-07-16 14:53

翻皮的鱼

翻皮的鱼 - 80后IT男

和楼主同样的需求,也是做的pda 扫描相关的功能

1***@qq.com

1***@qq.com

大家好,请问怎么解决啊?我也遇到了这个问题

不名用户_蒋某

不名用户_蒋某

关于PDA扫描枪:
1、input在当前为监听状态的情况下,扫描获取到的值会自动添加到input中,如果用blur(),那么也会移除掉监听,其实readonly也跟blur差不多,在JS中我试过很多方式,效果都不是很理想。
2、最好的处理方法是开发原生模块,市场上大多数PDA都为android版,对应的PDA都有模块开发文档,我封装过的PDA模块有世麦C5000,新大陆MT66,原生模块流程从注册服务--接收广播--在到发送给前端,代码不过100行。

    var uzScannerModule = api.require('ScannerModule');  
    var param = {  
        type: obj  
    };  
    uzScannerModule.showAlert(param, function(ret, err) {  
        console.log(ret.content); //扫描获取到的值  
    });
  • 不名用户_蒋某

    QQ:1282771577,微信:18229911633,欢迎大家添加探讨

    2020-03-30 16:24

skysowe

skysowe

同样遇到这个问题,尝试各种方法,最后只好宣告放弃了。

最大的问题是,设置焦点,而在移动端,input框的焦点通常会触发软键盘事件,怎么解决这二者之间的纠缠,就成了大问题。。。

尝试做过简单demo,就2个页面,第一个页面有一个input框,调用了focus()默认获得焦点,然后有一个按钮打开一个新页面

在第一个框里输入了内容,然后点击按钮,打开一个新页面,接受键盘输入,然后返回上页,让之前的input框还获得焦点,同时不弹出软键盘,以期可以让扫描枪连续工作。

当只有2个页面时,此时工作是正常的,,如果在这两个页面之前再加一个页面,用button来打开input框的那个页面,focus就失效了,,后来改成a标签模拟成按钮,focus又正常了,但是第三个页面返回到第二个页面时,focus又获取不到焦点了。settimeout之类的延时也用了,根本不管用。

input框除了接收扫描输入外,还要接受手动输入,此时如果绑定了键盘回车事件,focus又不灵了,哪怕是在绑定之后再加focus也不管用。

只有一种方法管用,就是input框加一个 onblur="this.focus();",这种方法管用,但是我这个页面不止一个input框呀,这样一来其他input框就无法输入了,当页面只有一个input框时(比如IM聊天界面),这个方法可以用,其他情况都不适用。

也设想过拦截安卓扫描枪的广播,因为不了解相关的底层内容,手边也没有相关设备,而且不同厂家的安卓扫描枪不知道是否不一样。

所以最后只能放弃了。

PS.奇怪的是,在安卓平台focus总是时不时失灵的情况,在iPhone上却总是工作正常,当然iOS很霸道,只要有了焦点就强制弹软键盘。

skysowe

skysowe

我是在关闭最后一个页面之前,用一个evalJS回调来让上一个页面的setfocus函数来让input框获得焦点的,然后plus.webview.currentWebview().close()关闭当前页面;延时什么的也都用过了,不管用。

多次反复实验的时候,其实input是获得了焦点的,肉眼能够看到热点的那根竖线,但是马上就失去了,不知道是不是plus.webview.currentWebview().close()关闭页面时,拿走了焦点。

但是很奇怪的是,如果只有最简单两个页面,则永远是正确的!!!只要页面多于2个,就over了。

  • 回梦無痕

    安卓上有效,ios还没找到方法, onfocus事件中执行:


    inputElement.setAttribute('readonly', 'readonly');//inputElement就是对应的input  
    setTimeout(() => {
    inputElement.removeAttribute('readonly');
    }, 100);

    2020-04-03 15:22

前端小白q

前端小白q

我想问一下解决了吗,我也碰到了这个问题,头大!!!

6***@qq.com

6***@qq.com - 清风徐来

<input
type="text"
v-model="result.scanCode"
readonly
ref="input"
class="input">

我也遇到了楼主的问题,最后这样解决的。
直接给input 设置readonly,扫码后值自动通过v-model同步到结果中去,再通过watch 去做操做

  • 浙江小牛寻宝

    我用Uniapp写的app app里面不生效啊,我看了input原生的才有readonly uni自己的Input都没有readonly属性,头大

    2022-04-01 14:53

  • 1***@qq.com

    回复 浙江小牛寻宝: 解决了吗

    2022-06-22 16:50

a***@hotmail.com

a***@hotmail.com

我来终结一下彻底禁用软键盘的办法
https://ask.dcloud.net.cn/article/39281

浙江小牛寻宝

浙江小牛寻宝

找到解决方法了兄弟们,我找了半天https://ext.dcloud.net.cn/plugin?id=2548
当写入值的时候,会出发键盘事件。不需要用input焦点来获取值了

  • 1***@qq.com

    这个键盘事件只能获取到英文和数字吧 如果是中文怎么办呢

    2022-06-22 16:51

该问题目前已经被锁定, 无法添加新回复