Skonfigurowałem modalne okno dialogowe interfejsu użytkownika jQuery, które będzie wyświetlane, gdy użytkownik kliknie łącze. Istnieją dwa pola tekstowe (pokazuję tylko kod 1 dla zwięzłości) w tym znaczniku div okna dialogowego i zmienia się na pole tekstowe DatePicker interfejsu jQuery, które reaguje na fokus.
Problem polega na tym, że okno dialogowe interfejsu użytkownika jQuery („otwórz”) w jakiś sposób powoduje, że pierwsze pole tekstowe ma fokus, które następnie powoduje natychmiastowe otwarcie kalendarza DatePicker.
Dlatego szukam sposobu, aby zapobiec automatycznemu ustawianiu ostrości.
<div><a id="lnkAddReservation" href="#">Add reservation</a></div>
<div id="divNewReservation" style="display:none" title="Add reservation">
<table>
<tr>
<th><asp:Label AssociatedControlID="txtStartDate" runat="server" Text="Start date" /></th>
<td>
<asp:TextBox ID="txtStartDate" runat="server" CssClass="datepicker" />
</td>
</tr>
</table>
<div>
<asp:Button ID="btnAddReservation" runat="server" OnClick="btnAddReservation_Click" Text="Add reservation" />
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
var dlg = $('#divNewReservation');
$('.datepicker').datepicker({ duration: '' });
dlg.dialog({ autoOpen:false, modal: true, width:400 });
$('#lnkAddReservation').click(function() { dlg.dialog('open'); return false; });
dlg.parent().appendTo(jQuery("form:first"));
});
</script>
javascript
jquery
jquery-ui
slolife
źródło
źródło
Odpowiedzi:
jQuery UI 1.10.0 Changelog wyświetla bilet 4731 jako naprawiony.
Wygląda na to, że focusSelector nie został zaimplementowany, ale zamiast tego zastosowano kaskadowe wyszukiwanie różnych elementów. Z biletu:
Więc oznacz element
autofocus
atrybutem i to jest element, który powinien mieć fokus:W dokumentacji wyjaśniono logikę fokusu (tuż pod spisem treści, pod tytułem „Focus”):
źródło
Dodaj ukrytą rozpiętość nad nią, użyj ui-helper-hidden-access, aby ukryć ją za pomocą pozycjonowania bezwzględnego. Wiem, że masz tę klasę, ponieważ używasz okna dialogowego z jquery-ui i jest w jquery-ui.
źródło
W jQuery UI> = 1.10.2, możesz zastąpić
_focusTabbable
metodę prototypową funkcją placebo:Skrzypce
Wpłynie to na wszystkie
dialog
strony na stronie bez konieczności ręcznej edycji każdego z nich.Oryginalna funkcja nie robi nic poza ustawianiem fokusu na pierwszy element z
autofocus
atrybutem /tabbable
elementem / lub cofaniem się do samego okna dialogowego. Ponieważ jego użycie polega tylko na ustawieniu ostrości na elemencie, nie powinno być problemu z zastąpieniem go plikiemnoop
.źródło
$.noop
, zamień go na funkcję, która zapisuje aktywne okno dialogowe, a następnie zarejestruj globalną procedurę obsługi zdarzeń klucza, która przechwytujeESC
i zamyka „aktywne” okno dialogowe, jeśli takie istnieje.Począwszy od jQuery UI 1.10.0, możesz wybrać element wejściowy, na którym chcesz się skupić, używając autofokusa atrybutu HTML5 .
Wszystko, co musisz zrobić, to utworzyć fikcyjny element jako pierwszy wpis w oknie dialogowym. Absorbuje skupienie dla ciebie.
Zostało to przetestowane w Chrome, Firefox i Internet Explorer (wszystkie najnowsze wersje) 7 lutego 2013 r.
źródło
Znalazłem następujący kod funkcji okna dialogowego interfejsu użytkownika jQuery do otwierania.
Możesz obejść zachowanie jQuery lub zmienić zachowanie.
tabindex -1 działa jako obejście.
źródło
focusSelector
opcja) powinna znajdować się w jQueryUI 1.8, a jesteśmy teraz na 1.8.13 i nie widzę tego w dokumentach dialogowych jQueryUI . Co się z tym stało?Po prostu wymyśliłem to podczas zabawy.
Znalazłem dzięki tym rozwiązaniom, aby usunąć fokus, spowodował, że ESCklawisz przestał działać (tj. Zamknął okno dialogowe) przy pierwszym wejściu do okna dialogowego.
Jeśli okno dialogowe otworzy się i natychmiast wciśniesz ESC, nie zamkniesz okna (jeśli masz to włączone), ponieważ fokus znajduje się na jakimś ukrytym polu lub czymś w tym rodzaju i nie otrzymuje zdarzeń naciśnięcia klawisza.
Sposób, w jaki to naprawiłem, polegał na dodaniu tego do zdarzenia open, aby zamiast tego usunąć fokus z pierwszego pola:
Spowoduje to ustawienie fokusu na oknie dialogowym, które nie jest widoczne, a następnie ESCklawisz działa.
źródło
Ustaw tabindex wejścia na -1, a następnie ustaw dialog.open, aby przywrócić tabindex, jeśli będziesz tego potrzebować później:
źródło
Moje obejście:
źródło
:first
selektora lub.first()
w FF / Chrome / IE9. Wrzucenie go dodialogopen
wiązania też działa.open: function(){ $('a').blur(); // no autofocus on links }
Treść była dłuższa niż okno dialogowe. Po otwarciu okno dialogowe przewijało się do pierwszej: tabbable, która znajdowała się na dole. Oto moja poprawka.
źródło
$('...').blur();
zamiast przewijania użyłem .Proste obejście:
Po prostu utwórz niewidoczny element z tabindex = 1 ... To nie skupi się na datepicker ...
na przykład.:
źródło
Oto rozwiązanie, które zaimplementowałem po przeczytaniu biletu nr 4731 jQuery UI , pierwotnie opublikowanego przez slolife w odpowiedzi na inną odpowiedź. (Bilet również został stworzony przez niego.)
Po pierwsze, w dowolnej metodzie, której używasz do stosowania autouzupełniania na stronie, dodaj następujący wiersz kodu:
To wyłącza zachowanie „autofokusu” jQuery. Aby zapewnić, że witryna będzie nadal szeroko dostępna, opakuj metody tworzenia okna dialogowego, aby można było dodać dodatkowy kod, i dodaj wywołanie, aby skupić się na pierwszym elemencie wejściowym:
Aby jeszcze bardziej zająć się dostępnością, gdy opcje autouzupełniania są wybierane za pomocą klawiatury, zastępujemy wywołanie zwrotne autouzupełniania interfejsu użytkownika jQuery „select” i dodajemy dodatkowy kod, aby zapewnić, że textElement nie straci fokusu w IE 8 po dokonaniu wyboru.
Oto kod, którego używamy do stosowania autouzupełniania do elementów:
źródło
Możesz podać tę opcję, aby zamiast tego uaktywnić przycisk zamykania.
źródło
Może to być zachowanie przeglądarki, a nie problem z wtyczką jQuery. Czy próbowałeś usunąć fokus programowo po otwarciu wyskakującego okienka.
Nie testowałem tego, ale powinno działać dobrze.
źródło
Ten sam problem rozwiązałem, wstawiając puste dane wejściowe przed selektorem daty, które kradną fokus za każdym razem, gdy otwiera się okno dialogowe. To wejście jest ukrywane przy każdym otwarciu okna dialogowego i pokazywane ponownie po zamknięciu.
źródło
Cóż, fajnie, że na razie nikt nie znalazł rozwiązania, ale wygląda na to, że mam coś dla Ciebie. Zła wiadomość jest taka, że okno dialogowe w każdym przypadku przechwytuje fokus, nawet jeśli nie ma w nim danych wejściowych ani linków. Używam okna dialogowego jako podpowiedzi i zdecydowanie potrzebuję skupienia się na oryginalnym elemencie. Oto moje rozwiązanie:
użyj opcji [autoOpen: false]
Podczas gdy okno dialogowe jest niewidoczne, fokus nie jest nigdzie ustawiony i pozostaje w pierwotnym miejscu. Działa w przypadku podpowiedzi zawierających zwykły tekst, ale nie jest testowany w przypadku bardziej funkcjonalnych okien dialogowych, w których może być ważne, aby okno dialogowe było widoczne w momencie otwierania. Prawdopodobnie w każdym przypadku będzie działać dobrze.
Rozumiem, że oryginalny post miał po prostu uniknąć skupienia się na pierwszym elemencie, ale możesz łatwo zdecydować, gdzie powinien być fokus po otwarciu okna dialogowego (po moim kodzie).
Przetestowano w IE, FF i Chrome.
Mam nadzieję, że to komuś pomoże.
źródło
Moim zdaniem to bardzo fajne rozwiązanie:
Znaleziono tutaj: nie można usunąć autofokusa w oknie dialogowym
źródło
Mam podobny problem. Otwieram okno dialogowe błędu, gdy walidacja się nie powiedzie, i przechwytuje fokus, tak jak pokazuje to Flugan w swojej odpowiedzi . Problem polega na tym, że nawet jeśli żaden element w oknie dialogowym nie jest tabelą, samo okno dialogowe jest nadal aktywne. Oto oryginalny niezminifikowany kod z jquery-ui-1.8.23 \ js \ jquery.ui.dialog.js:
Komentarz należy do nich!
Jest to dla mnie bardzo złe z kilku powodów. Najbardziej irytujące jest to, że pierwszą reakcją użytkownika jest naciśnięcie klawisza Backspace w celu usunięcia ostatniego znaku, ale zamiast tego jest on proszony o opuszczenie strony, ponieważ naciśnięcie klawisza Backspace znajduje się poza kontrolką wejściową.
Okazało się, że następujące obejście działa całkiem nieźle dla mnie:
źródło
Rozglądałem się za innym problemem, ale z tą samą przyczyną. Problem polega na tym, że okno dialogowe ustawia fokus na pierwsze
<a href="">.</a>
znalezione. Więc jeśli masz dużo tekstu w oknie dialogowym i pojawiają się paski przewijania, możesz mieć sytuację, w której pasek przewijania zostanie przewinięty do dołu. Uważam, że rozwiązuje to również pytanie dotyczące pierwszej osoby. Chociaż inni też.Prosta łatwa do zrozumienia poprawka.
<a id="someid" href="#">.</a>
jako pierwsza linia w Twoim div dialogu.PRZYKŁAD:
Gdzie jest inicjowane okno dialogowe
Powyższe nie będzie miało żadnego skupienia, a paski przewijania pozostaną na górze, gdzie należy.
<a>
Dostaje ostrość, ale jest to ukryty. Zatem ogólny efekt jest pożądany.Wiem, że to stary wątek, ale jeśli chodzi o dokumentację interfejsu użytkownika, nie ma na to poprawki. To nie wymaga rozmycia ani ostrości do działania. Nie jestem pewien, czy jest najbardziej elegancki. Ale to ma sens i jest łatwe do wyjaśnienia każdemu.
źródło
Jeśli masz tylko jedno pole w postaci okna dialogowego Jquery i to jest to, które wymaga Datepicker, możesz też po prostu ustawić fokus na przycisku Zamknij (krzyżyk) w pasku tytułowym okna dialogowego:
Wywołaj to PO zainicjowaniu okna dialogowego, np .:
Ponieważ przycisk zamykania jest renderowany po
.dialog()
wywołaniu.źródło
Jeśli używasz przycisków dialogowych, po prostu ustaw
autofocus
atrybut na jednym z przycisków:źródło
Mam ten sam problem.
Obejście, które zrobiłem, polega na dodaniu fikcyjnego pola tekstowego u góry kontenera okna dialogowego.
źródło
Jak wspomniano, jest to znany błąd dotyczący interfejsu użytkownika jQuery i powinien zostać naprawiony stosunkowo szybko. Dopóki...
Oto inna opcja, więc nie musisz mieszać z tabindex:
Tymczasowo wyłącz DatePicker do momentu otwarcia okna dialogowego:
Pracuje dla mnie.
Zduplikowane pytanie: jak zamazać pierwsze dane wejściowe formularza po otwarciu okna dialogowego
źródło
Aby rozwinąć niektóre z poprzednich odpowiedzi (i zignorować pomocniczy aspekt wyboru daty), jeśli chcesz uniemożliwić
focus()
zdarzeniu skupianie się na pierwszym polu wejściowym po otwarciu okna dialogowego, spróbuj tego:źródło
Miałem podobny problem i rozwiązałem go, skupiając się na oknie dialogowym po otwarciu:
Ale w moim przypadku pierwszym elementem jest kotwica, więc nie wiem, czy w twoim przypadku pozostawi on otwarty datepicker.
EDYCJA: działa tylko w IE
źródło
znaleźć w jquery.ui.js
i zamień na
źródło
jQuery 1.9 został wydany i nie wydaje się, aby był poprawiony. Próba uniemożliwienia skupienia się na pierwszym polu tekstowym przez niektóre z sugerowanych metod nie działa w wersji 1.9. Myślę, że dlatego, że metody próbują rozmazać ostrość lub przenieść ostrość po tym, jak pole tekstowe w oknie dialogowym już się wyostrzyło i wykonało swoją brudną robotę.
W dokumentacji API nie widzę niczego, co mogłoby sugerować, że coś się zmieniło pod względem oczekiwanej funkcjonalności. Wyłącz, aby dodać przycisk otwieracza ...
źródło
Miałem podobny problem. Na mojej stronie pierwsze dane wejściowe to pole tekstowe z kalendarzem jQuery UI. Drugi element to przycisk. Ponieważ data ma już wartość, ustawiam fokus na przycisku, ale najpierw dodaję wyzwalacz rozmycia w polu tekstowym. To rozwiązuje problem we wszystkich przeglądarkach i prawdopodobnie we wszystkich wersjach jQuery. Testowane w wersji 1.8.2.
źródło
Jest to naprawdę ważne w przypadku smartfonów i tabletów, ponieważ klawiatura pojawia się, gdy fokus jest na wejściu. Oto, co zrobiłem, dodaj to wejście na początku div:
Nie działa z rozmiarem
0px
. Myślę, że to nawet lepiej z prawdziwym przejrzystego obrazu, albo.png
lub.gif
ale nie próbowałem.Jak dotąd działa dobrze na iPadzie.
źródło
Możesz dodać to:
...
...
źródło
jako pierwsze wejście:
<input type="text" style="position:absolute;top:-200px" />
źródło