2013-02-13 2 views
14

Я написал форму входа в веб-страницу в ASP.net.Android - вход html теряет фокус при открытии открытой клавиатуры (ASP.net)

Использование Nexus 4, акции Android 4.2.1, собственный браузер Chrome - когда я нажимаю на поля <input>, появляется мягкая клавиатура, а затем поле сразу теряет фокус. Я должен снова нажать поле <input>, и клавиатура уже открыта, чтобы на самом деле ввести текст.

Этого не происходит в Chrome на рабочем столе.

У меня есть следующие формы входа в элементе управления пользователя 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> 

, которая появляется в браузере, как это:

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

Мое подозрение, что ViewState крадет фокус как-то. Но я попробовал event.stopPropogation(), который не помог.


Временное исправление

На данный момент я остановился на Hacky исправить, заставляя фокус обратно на <input> элемент 700 миллисекунд после щелчка:

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

Я нашел упоминание [подобные проблемы] (http://stackoverflow.com/questions/9147400/edittext-steals-focus), но все они, как представляются, Java, связанными - в родных приложениях. Я не могу найти никаких других упоминаний об этой проблеме на веб-странице. –

ответ

31

Я обнаружил это ничего общего с ASP.net или ViewState.

При появлении Android клавиатуры, окно браузера изменяется - запуская событие изменения размера.

я бегу что-то похожее на следующее:

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

Это переместил навигации в DOM. Я предполагаю, что это перерисовывает DOM и поэтому вызывает что-либо в DOM, чтобы терять фокус. Я прекратил это из-за изменения размера - это происходит только при загрузке начальной страницы.

+1

Ответ - спасатель. Примечание. По моему опыту, на Android 4.0.4 эта проблема затрагивает собственный браузер, но не другие браузеры (Chrome, Firefox, а возможно и другие). –

+0

спасибо миллион! –

2

меня найти другое решение

Сначала вы должны создать функцию

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

} 

и при нажатии на входе вы вызываете функцию

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

Это работает для меня

7

У меня была аналогичная проблема, мой подход, чтобы предотвратить изменение размера, если вход находится в фокусе решить эту проблему:

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

Если у вас есть новый вопрос, обратитесь к нему, нажав кнопку [Ask Question] (http://stackoverflow.com/questions/ask). Включите ссылку на этот вопрос, если это поможет обеспечить контекст. - [Из обзора] (/ review/low-quality-posts/10812017) –

+0

@fish_ball, похоже, что вопрос был сформулирован плохо, это должно быть «у меня была аналогичная проблема», это не новый вопрос, это является действительным ответом. –

+0

Работает как очарование, спасибо! –

0

Требует JQuery

Я с этой проблемой самостоятельно, и в конечном итоге с помощью этого решения. Это может быть полезно кому-то другому. В моем случае изменение размера сделало его таким, чтобы поисковая панель потеряла фокус.

// 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, вставьте следующий код в заголовок.

<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> 
Смежные вопросы