2013-10-01 9 views
6

Mam okno dialogowe interfejsu użytkownika jQuery zawierające formularz jedno pole, a właściwość autoOpen jest ustawiona na wartość false na początku. Na stronie jest inne menu interfejsu jQuery, a otwarta funkcja okna dialogowego jest powiązana ze zdarzeniem kliknięcia pozycji menu. Próbowałem ustawić fokus na jedyne pole formularza w oknie dialogowym, gdy okno dialogowe jest otwarte po kliknięciu pozycji menu jakoś nie ma szczęścia. Aby wskazać przyczynę, dodałem kolejny przycisk testowy i klikając ten przycisk, mogę ustawić ostrość na polu formularza. Jestem więc pewien, że to menu interfejsu jQuery zapobiega ustawianiu ostrości w polu. Zastanawiam się, czy istnieje jakiś sposób na obejście tego ograniczenia. Wszelkie docenienia jest doceniane. Dzięki!Nie można ustawić fokusu na pole formularza w oknie dialogowym interfejsu użytkownika jQuery po kliknięciu elementu menu jQueryUI.

html:

<ul id="menu"> 
    <li><a href="#">Item 1</a></li> 
    <li><a href="#">Item 2</a></li> 
</ul> 
</br> 
<button id="btn">Open the dialog</button> 

<div id="dialog" title="Basic dialog"> 
    <form> 
     <input type="text" id="fld" /> 
    </form> 
</div> 

javascript:

$("#dialog").dialog({ 
    autoOpen: false, 
    open: function(event, ui){ 
     $('#fld').focus(); 
    } 
}); 

$('#btn').click(function(e){ 
    $("#dialog").dialog('open'); 
}); 

$('#menu li a').click(function(){ 
    $("#dialog").dialog('open'); 
}) 

$("#menu").menu({ 
    select: function(event, ui) { 
     $("#dialog").dialog('open'); 
    } 
}); 

Oto js fiddle

Odpowiedz

9

Interesujące.

Jakimś sposobem menu jQuery wpływa na ostrość. Patrzyłem na twoje skrzypce i odkryłem, że nawet jeśli opóźnisz fokus 1 milisekundę, to działa.

Spójrz na to.

$("#dialog").dialog({ 
    autoOpen: false, 
    open: function(event, ui){ 
     setTimeout(function(){$('#fld').focus();},1); 
    } 
}); 

$('#btn').click(function(e){ 
    $("#dialog").dialog('open'); 
}); 

$('#menu li a').click(function(){ 
    $("#dialog").dialog('open'); 
}) 

$("#menu").menu(); 

http://jsfiddle.net/XMEWu/1/

+0

Hi @Trevor, testowałem swoje skrzypce się trochę i wydaje się za każdym razem, gdy strona jest załadowany, pierwsze kliknięcie na pozycji menu nie ustawia ostrość i wszystkie kliknięcia potem działać idealnie. Jest zdecydowanie bliżej tego, co chcę. Doceniam Twoją pomoc. – aarryy

+0

Witam @Trevor, przetestowałem twoje rozwiązanie z moim prawdziwym obejściem i zadziwiająco zadziałało. Nie widać logiki za tym. Prawdopodobnie dlatego, że rzeczywiste obejście nie używa dokładnie tej samej wersji interfejsu jquery i jquery. W każdym razie dziękuję za całą pomoc. – aarryy

+0

Twoje powitanie, to dziwne na moim skrzypcach, działa po raz pierwszy dla mnie. Domyśl. – Trevor

1

Zastosowanie w oknie dialogowym Page

$(window).load(function() { 
    //Use Focus as $("#stsr").focus(); 
} 
+0

To także dobre rozwiązanie. Kilka wyjaśnień: otwarte okno dialogowe nie "czeka" na wczytanie html, zostaje wykonane natychmiast po otwarciu okna dialogowego i to jest tutaj prawdziwy problem. Dodanie funkcji na $ (okno).load lub $ (document) .ready do html okna dialogowego czeka, aż kod zostanie w pełni załadowany przed wywołaniem funkcji, rozwiązując w ten sposób problem z ustawieniem ostrości, który jeszcze nie istnieje. Myślę, że to może być jeszcze lepsze rozwiązanie niż ustawienie limitu czasu. – vove

1

Ten doprowadzało mnie do szału. Oto, co naprawiłem dla mnie (bardziej ogólna wersja odpowiedzi @ Trevora).

$('#element').dialog({ 
    open: function() {       
    //focus fix 
    $('textarea, input', $(this)).click(function() { 
     var $inp = $(this); 
     setTimeout(function() { 
      $inp.focus(); 
     }, 1); 
    });       
    } 
}); 
Powiązane problemy