我怎样才能隐藏使用JavaScript的Android键盘?

我想隐藏JavaScript中的Android虚拟键盘。 有人build议这样做:

$('#input').focus(function() { this.blur(); }); 

但是,如果键盘已经可见,这不起作用。 这是可以做的吗?

你需要做的是创build一个新的input字段,将其附加到正文,集中它,并使用display:none 。 你将需要附上一些setTimeouts里面这些工作。

 var field = document.createElement('input'); field.setAttribute('type', 'text'); document.body.appendChild(field); setTimeout(function() { field.focus(); setTimeout(function() { field.setAttribute('style', 'display:none;'); }, 50); }, 50); 

我发现了一个简单的解决scheme,既不需要添加元素也不需要特殊的类。 find它: http : //www.sencha.com/forum/archive/index.php/t-141560.html?s=6853848ccba8060cc90a9cacf7f0cb44

并将代码转换成jquery:

 function hideKeyboard(element) { element.attr('readonly', 'readonly'); // Force keyboard to hide on input field. element.attr('disabled', 'true'); // Force keyboard to hide on textarea field. setTimeout(function() { element.blur(); //actually close the keyboard // Remove readonly attribute after keyboard is hidden. element.removeAttr('readonly'); element.removeAttr('disabled'); }, 100); } 

你通过传入键盘被打开的input来调用函数,或者传递$('input')也可以。

这是一个适用于Android 2.3.x和4.x的booletprouf方法

您可以使用以下链接testing此代码: http : //jsbin.com/pebomuda/14

 function hideKeyboard() { //this set timeout needed for case when hideKeyborad //is called inside of 'onfocus' event handler setTimeout(function() { //creating temp field var field = document.createElement('input'); field.setAttribute('type', 'text'); //hiding temp field from peoples eyes //-webkit-user-modify is nessesary for Android 4.x field.setAttribute('style', 'position:absolute; top: 0px; opacity: 0; -webkit-user-modify: read-write-plaintext-only; left:0px;'); document.body.appendChild(field); //adding onfocus event handler for out temp field field.onfocus = function(){ //this timeout of 200ms is nessasary for Android 2.3.x setTimeout(function() { field.setAttribute('style', 'display:none;'); setTimeout(function() { document.body.removeChild(field); document.body.focus(); }, 14); }, 200); }; //focusing it field.focus(); }, 50); } 

如果你没有find一个简单的解决scheme来做到这一点,你总是可以从JavaScript调用Java代码。 教程和例子在这里 。 在这里隐藏软键盘。

 ... WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); .... public class JavaScriptInterface { Context mContext; /** Instantiate the interface and set the context */ JavaScriptInterface(Context c) { mContext = c; } /** Show a toast from the web page */ public void hideKeyboard() { InputMethodManager imm = (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE); ... } } 

JavaScript的

 <script type="text/javascript"> function hideAndroidKeyboard() { Android.hideKeyboard(); } </script> 

需要注意的事项:

JavaScript到本地Java不能在模拟器版本2.3 +。 http://code.google.com/p/android/issues/detail?id=12987

我不确定,但是当hideKeyboard被调用时你可能不在主线程中。

当然,如果你找不到一个简单的解决scheme。

只是模糊积极的焦点input领域:

 $(document.activeElement).filter(':input:focus').blur(); 

rdougan的post没有为我工作,但这是我的解决scheme的一个很好的起点。

 function androidSoftKeyHideFix(selectorName){ $(selectorName).on('focus', function (event) { $(selectorName).off('focus') $('body').on('touchend', function (event) { $('body').off('touchend') $('.blurBox').focus(); setTimeout(function() { $('.blurBox').blur(); $('.blurBox').focus(); $('.blurBox').blur(); androidSoftKeyHideFix(selectorName); },1) }); }); } 

你需要一个input元素在身体的顶部,我分类为“blurBox”。 它不能显示:无。 所以给它不透明度:0,位置:绝对。 我试着把它放在身体的底部,它不起作用。

我发现有必要在blurBox上重复.focus().blur()序列。 我尝试了没有,它不工作。

这适用于我的2.3 Android。 我想象自定义的键盘应用程序可能仍然有问题。

在到达此之前,我遇到了一些问题。 随后的重点突然出现了一个模糊/焦点,这看起来像一个Android的错误是一个奇怪的问题。 我使用了一个touchend监听器而不是一个模糊监听器,以避免在初始打开后立即closures键盘的function。 我也有一个键盘打字的问题,使滚动跳转…这是一个家长使用的3d变换。 这是从试图解决模糊问题的尝试中产生出来的,在这个问题中,我并没有将blurBox放在最后。 所以这是一个微妙的解决scheme。

我用这个“$(input).prop('readonly',true)来解决这个问题, 在展前

例如:

 $('input.datepicker').datepicker( { changeMonth: false, changeYear: false, beforeShow: function(input, instance) { $(input).datepicker('setDate', new Date()); $(input).prop('readonly',true); } } ); 
 View view = this.getCurrentFocus(); if (view != null) { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } 

我进入这个有点晚,但我想分享一个在Android 2.5.x +和iOS 7上为我工作的解决scheme。

我的重点是closures方向改变的键盘。 这会导致任何浏览器方向更改后的可恢复(意思是优雅)状态。

这是coffeeScript:

 @windowRepair: (mobileOS) -> activeElement = document.activeElement.tagName if activeElement == "TEXTAREA" or activeElement == "INPUT" $(document.activeElement).blur() #alert "Active Element " + activeElement + " detected" else $('body').focus() #alert "Fallback Focus Initiated" if mobileOS == "iOS" window.scrollTo(0,0) $('body').css("width", window.innerWidth) $('body').css("height", window.innerHeight) 

我希望这有助于某人。 我知道我花了很多时间搞清楚了。

HTML

 <input type="text" id="txtFocus" style="display:none;"> 

脚本

 $('#txtFocus').show().focus().hide(); $.msg({ content : 'Alert using jquery msg' }); 

给软键盘一些时间来closures我的作品。

 $('#ButtonCancel').click(function () { document.body.focus(); setTimeout(function () { //close the dialog, switch to another screen, etc. }, 300); }); 

我设法让它与以下工作

 document.body.addEventListener( 'touchend', function(){ if( document.getElementById('yourInputFiled') ) document.getElementById('yourInputFiled').blur(); }); 

并在您的input字段的侦听器中的preventDefault()和stopPropagation()

我做了一个jQuery插件的QuickFix的答案

 (function ($) { $.fn.hideKeyboard = function() { var inputs = this.filter("input").attr('readonly', 'readonly'); // Force keyboard to hide on input field. var textareas = this.filter("textarea").attr('disabled', 'true'); // Force keyboard to hide on textarea field. setTimeout(function() { inputs.blur().removeAttr('readonly'); //actually close the keyboard and remove attributes textareas.blur().removeAttr('disabled'); }, 100); return this; }; }( jQuery )); 

用法示例:

 $('#myInput').hideKeyboard(); $('#myForm input,#myForm textarea').hideKeyboard(); 

只要随意点击任何非input项目。 键盘将消失。