2013-02-13 28 views
14

ASP.NET'de bir web sayfası giriş formu yazdım.Android - yumuşak klavye açıldığında html girişi odağı kaybediyor (ASP.net)

Nexus 4 kullanma, Android 4.2.1, yerel Chrome tarayıcısı - <input> alanlarına tıkladığımda, yazılım klavyesi görünür ve alan hemen odağı kaybeder. Metin girmek için zaten açık olan klavye ile tekrar <input> alanına tıklamam gerekiyor.

Bu, bir masaüstünde Chrome'da gerçekleşmez.

<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> 

böyle tarayıcıya görünür:

<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> 

Benim şüphe ViewState nasılsa odak çalmak olmasıdır

Ben bir ASP kullanıcı denetimi aşağıdaki giriş formu var. Ama ben yardımcı olmadı event.stopPropogation() denedim. Ben bu keşfetti

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

[benzer sorunlar] (http://stackoverflow.com/questions/9147400/edittext-steals-focus) bahseder ama bunlar tüm Java alakalı gibi görünen - yerli uygulamalarda yayınlanır. Bir web sayfasında bu sorunun başka bir ifadesini bulamıyorum. –

cevap

31

: Şimdilik


Geçici düzeltme

ben 700 milisaniye bir tıklama sonrasında geri <input> elemanı üzerine odağı zorlayarak, Bir Hacky düzeltme için kıldım ASP.net veya ViewState ile ilgisi yok.

Android klavyesi görünür

, tarayıcı penceresi boyutlandırılır - resize olayı tetikleme. Aşağıdaki benzer bir şey koşuyordu

:

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

Bu DOM gezinmeyi taşındı. Sanırım bu DOM'yi yeniden çiziyor ve DOM'daki bir şeyin odaklanmasına neden oluyor. Bunu yeniden boyutlandırmaktan vazgeçtim - bunun yerine yalnızca ilk sayfa yüklemesinde olmasını sağladım.

+1

Cevap bir cankurtaran. Not: Android 4.0.4'teki deneyimlerimde bu sorun yerel tarayıcıyı etkiliyor, ancak diğer tarayıcıları etkilemiyor (Chrome, Firefox, belki başkaları). –

+0

milyona teşekkürler! –

2

Sana bir işlev

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

} 

oluşturmak zorunda ve bir girişteki tıkladığınızda fonksiyonunu Bu benim

için çalışıyor

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

diyoruz Başka bir çözüm

İlk bulmak zorunda

7

Benzer bir sorunla karşılaştım, girişimi yeniden boyutlandırmayı engelleyen yaklaşım benimse odakta olan sorunu çözüldü:

$(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

Yeni bir sorunuz varsa, lütfen [Soru Sor] (http://stackoverflow.com/questions/ask) düğmesini tıklayarak sorun. İçerik sağlamaya yardımcı olursa, bu soruya bir bağlantı ekleyin. - [Yorum yaz] (/ review/düşük kaliteli yazılar/10812017) –

+0

@fish_ball, sorunun kötü dolduruyormuş gibi görünüyor, "Benzer bir sorunum vardı" olmalı, bu yeni bir soru değil, bu geçerli bir cevaptır. –

+0

Bir çekicilik gibi çalışır, teşekkürler! –

0

jQuery

bu sorunu kendim sahip oldum gerektirir ve bu çözüm kullanarak sona erdi. Bir başkası için yararlı olabilir. Benim durumumda, yeniden boyutlandırma, arama çubuğunun odağı kaybetmesini sağladı.

// 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

WordPress'te bu sorunu yaşayanlar için, aşağıdaki kodu başlığa ekleyin. Bulduğum

<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> 
İlgili konular