Android: la entrada de html pierde foco cuando se abre el teclado virtual (ASP.net)

He escrito un formulario de inicio de sesión en ASP.net.

Usando un Nexus 4, Android 4.2.1, navegador nativo de Chrome – cuando hago clic en los campos <input> , aparece el teclado virtual y luego el campo pierde inmediatamente el foco. Tengo que hacer clic de nuevo en el campo <input> con el teclado ya abierto para ingresar texto.

Esto no ocurre en Chrome en un escritorio.

Tengo el siguiente formulario de inicio de sesión en un control de usuario ASP:

 <asp:Login ID="login_form" runat="server" OnLoginError="OnFail" OnLoggedIn="OnLoggedIn" RenderOuterTable="false" RememberMeSet="True"> <LayoutTemplate> <asp:Panel runat="server" DefaultButton="LoginButton" CssClass="members-login"> <fieldset> <label for="UserName">Username</label> <asp:TextBox ID="username" placeholder="eg joebloggs12" runat="server"></asp:TextBox> <label for="Password">Password</label> <asp:TextBox ID="password" runat="server" placeholder="eg 1234" TextMode="Password"></asp:TextBox> <label id="RememberMe">Remember me</label> <asp:CheckBox ID="RememberMe" runat="server" /> <asp:Button CssClass="button" ID="LoginButton" runat="server" CommandName="Login" Text="SUBMIT" /> </fieldset> </asp:Panel> </LayoutTemplate> </asp:Login> 

Que aparece al navegador como este:

 <div class="members-login" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ContentPlaceHolderDefault_contentBody_masterContent_login_form_LoginButton')"> <fieldset> <label for="UserName">Username</label> <input name="ctl00$ctl00$ctl00$ContentPlaceHolderDefault$contentBody$masterContent$login_form$username" type="text" id="ContentPlaceHolderDefault_contentBody_masterContent_login_form_username" placeholder="eg joebloggs12" /> <label for="Password">Password</label> <input name="ctl00$ctl00$ctl00$ContentPlaceHolderDefault$contentBody$masterContent$login_form$password" type="password" id="ContentPlaceHolderDefault_contentBody_masterContent_login_form_password" placeholder="eg 1234" /> <label id="RememberMe">Remember me</label> <input id="ContentPlaceHolderDefault_contentBody_masterContent_login_form_RememberMe" type="checkbox" name="ctl00$ctl00$ctl00$ContentPlaceHolderDefault$contentBody$masterContent$login_form$RememberMe" checked="checked" /> <input type="submit" name="ctl00$ctl00$ctl00$ContentPlaceHolderDefault$contentBody$masterContent$login_form$LoginButton" value="SUBMIT" id="ContentPlaceHolderDefault_contentBody_masterContent_login_form_LoginButton" class="button" /> </fieldset> </div> 

Mi sospecha es que el ViewState está robando enfoque de alguna manera. Pero intenté event.stopPropogation() que no ayudó.


Arreglo temporal

Por ahora me he conformado con una corrección hacky, forzando el foco de nuevo sobre el elemento <input> 700 milisegundos después de un clic:

 jQuery('input').bind('click',function(evt) { var focusClosure = (function(inputElem) {return function() {console.log(inputElem.focus());}}($(evt.target))); window.setTimeout(focusClosure, 700); }); 

He descubierto que esto no tiene nada que ver con ASP.net o ViewState.

Cuando aparezca el teclado de Android, se redimensionará la ventana del navegador , desencadenando el evento de cambio de tamaño .

Yo estaba corriendo algo similar a lo siguiente:

 // Move the navigation on resize $(window).bind('resize', function() { if(maxWidth <= 710px) { $('.nav').after($('.main-content')); } }); 

Esto movió la navegación en el DOM. Supongo que esto redibuja el DOM y hace que cualquier cosa en el DOM para perder el foco. Dejé de ocurrir esto en el cambio de tamaño – haciendo que sólo ocurra en la carga de la página inicial en su lugar.

Tuve un problema similar, mi enfoque para evitar redimensionar para ejecutar si la entrada está en foco resuelto el problema:

 $(window).bind('resize', function() { if ($("input").is(":focus")) { // input is in focus, don't do nothing or input loses focus and keyboard dissapears } else { // do whatever you should do if resize happens } }); 

He encontrado otra solución

Primero tienes que crear una función

 function getFocus(campo){ $(window).bind('resize', function() { if(windowWidth <= 1025) { $(campo).focus(); } }); } 

Y cuando hace clic en una entrada que llamar a la función

 $('input').click(function(){ getFocus(this); }); 

Esto funciona para mí

  • Android inseguro: tel: con la aplicación phonegap
  • Long h1 aumenta el tamaño de la fuente de todo el texto colocado estáticamente en los navegadores móviles
  • Android: html en strings.xml
  • Reemplazar cadena en html dinámicamente en Android
  • Tipo de teclado suave en una página HTML personalizada
  • No se puede mostrar la cadena html en la vista web
  • ¿Cómo puedo eliminar el fondo blanco de una vista web?
  • Haga un subrayado rojo ondulado para algunas palabras en edittext
  • Twitter Bootstrap no funciona en Android WebView
  • Html phonegap android: teclado numérico suave tiene siguiente en lugar de ir botón
  • Android 4.1.2 navegador predeterminado - problema de reproducción con campos de entrada inhabilitados
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.