2013-02-13 18 views
14

Napisałem formularz logowania do strony internetowej w ASP.net.Android - wejście html traci fokus po otwarciu miękkiej klawiatury (ASP.net)

Korzystanie z Nexusa 4, system Android 4.2.1, przeglądarka Chrome - po kliknięciu na pola <input> pojawia się klawiatura ekranowa, a następnie pole natychmiast traci ostrość. Muszę ponownie kliknąć pole <input> z klawiaturą już otwartą, aby faktycznie wprowadzić tekst.

To nie dzieje się w Chrome na komputerze.

Mam następujący formularz logowania użytkownika w kontrolce 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="e.g. joebloggs12" runat="server"></asp:TextBox> 

       <label for="Password">Password</label> 
       <asp:TextBox ID="password" runat="server" placeholder="e.g. 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> 

który pojawia się w przeglądarce tak:

<div class="members-login" onkeypress="javascript:return WebForm_FireDefaultButton(event, &#39;ContentPlaceHolderDefault_contentBody_masterContent_login_form_LoginButton&#39;)"> 

    <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="e.g. 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="e.g. 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> 

Podejrzewam, że ViewState jest kradzież ostrość jakoś. Ale spróbowałem event.stopPropogation(), które nie pomogło.


Temporary fix

Na razie mam rozstrzygane przez Hacky fix, zmuszając ostrość z powrotem na element <input> 700 milisekund po kliknij:

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

znalazłem wzmianki o [podobne problemy] (http://stackoverflow.com/questions/9147400/edittext-steals-focus), ale wszystkie one wydają się być związane z Java - w ramach natywnych aplikacji. Nie mogę znaleźć żadnych innych wzmianek o tym problemie na stronie internetowej. –

Odpowiedz

31

odkryłem to nie ma nic wspólnego z ASP.net lub ViewState.

Gdy pojawi się klawiatura Android, okno przeglądarka jest zmieniany - wyzwolenie zdarzenia zmiany rozmiaru.

biegałam coś podobnego do następującego:

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

ten przeniósł Nawigacja w DOM. Domyślam się, że to przerysowuje DOM i powoduje, że wszystko w DOM traci koncentrację. Zaprzestałem tego przy zmianie rozmiaru - co oznacza, że ​​dzieje się tak tylko przy początkowym ładowaniu strony.

+1

Odpowiedź to ratownik. Uwaga: z mojego doświadczenia wynika, że ​​w systemie Android 4.0.4 problem dotyczy rodzimej przeglądarki, ale nie innych przeglądarek (Chrome, Firefox, być może innych). –

+0

dzięki milion! –

2

muszę znaleźć inne rozwiązanie

najpierw trzeba utworzyć funkcję

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

} 

i po kliknięciu w wejście wywołać funkcję

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

Działa to dla mnie

7

Miałem podobny problem, moje podejście do zapobiegania zmianie rozmiaru, jeśli wejście jest ostry rozwiązał problem:

$(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 
    } 
}); 
+0

Jeśli masz nowe pytanie, zadaj je, klikając przycisk [Zadaj pytanie] (http://stackoverflow.com/questions/ask). Dodaj link do tego pytania, jeśli pomoże to w zapewnieniu kontekstu. - [Z recenzji] (/ review/low-quality-posts/10812017) –

+0

@fish_ball, wydaje się, jakby pytanie było źle sformułowane, powinno być "miałem podobny problem", to nie jest nowe pytanie, to jest poprawną odpowiedzią. –

+0

Działa jak urok, dzięki! –

0

wymaga jQuery

byłem ten problem samodzielnie, a zakończył się korzystania z tego rozwiązania. To może być przydatne dla kogoś innego. W moim przypadku zmiana rozmiaru spowodowała, że ​​pasek wyszukiwania stracił ostrość.

// Makes it so that click events are fired on a mobile device. 
$('#searchbar').each(function(){ 
    this.onclick = function() {} 
}); 

// Runs an interval 10 times with a 50ms delay. Forces focus. 
$("#searchbar").click(function() { 
    var i = 0; 
    var interval = window.setInterval(function(){ 
     if(i > 10) { 
      clearInterval(interval); 
     } 
     $("#searchbar").focus(); 
     i++; 
    }, 50); 
}); 
0

Dla tych, którzy zmagają się z tym problemem w WordPress, wstaw następujący kod do nagłówka.

<script type="text/javascript"> 
jQuery(function($) { 
$(window).bind('resize', function() { 
if ($("input").is(":focus")) { 
var focusClosure = (function(inputElem) {return function() 
{console.log(inputElem.focus());}}($(evt.target))); 
window.setTimeout(focusClosure, 700); 
} else { 
    // Other resize functions 
} 
}); 
}); 
</script> 
Powiązane problemy