Piszę aplikację internetową na iPada ( nie jest to zwykła aplikacja App Store - jest napisana przy użyciu HTML, CSS i JavaScript). Ponieważ klawiatura zajmuje ogromną część ekranu, sensowna byłaby zmiana układu aplikacji, aby pasowała do pozostałej przestrzeni, gdy jest wyświetlana. Jednak nie znalazłem sposobu, aby wykryć, kiedy i czy klawiatura jest wyświetlana.
Moim pierwszym pomysłem było założenie, że klawiatura jest widoczna, gdy pole tekstowe ma fokus. Jednak gdy klawiatura zewnętrzna jest podłączona do iPada, klawiatura wirtualna nie jest wyświetlana, gdy pole tekstowe jest aktywowane.
W moich eksperymentach klawiatura nie wpłynęła również na wysokość ani wysokość przewijania żadnego z elementów DOM, a nie znalazłem żadnych zastrzeżonych zdarzeń ani właściwości, które wskazują, czy klawiatura jest widoczna.
Odpowiedzi:
Znalazłem rozwiązanie, które działa, choć jest trochę brzydkie. To też nie zadziała w każdej sytuacji, ale działa dla mnie. Ponieważ dostosowuję rozmiar interfejsu użytkownika do rozmiaru okna iPada, użytkownik zwykle nie może przewijać. Innymi słowy, jeśli ustawię scrollTop okna, pozostanie on na 0.
Jeśli z drugiej strony zostanie wyświetlona klawiatura, przewijanie nagle zadziała. Mogę więc ustawić scrollTop, natychmiast przetestować jego wartość, a następnie zresetować. Oto jak to może wyglądać w kodzie, używając jQuery:
Zwykle można się spodziewać, że nie będzie to widoczne dla użytkownika. Niestety, przynajmniej podczas pracy w symulatorze, iPad wyraźnie (choć szybko) przewija się ponownie w górę iw dół. Mimo to działa, przynajmniej w niektórych sytuacjach.
Przetestowałem to na iPadzie i wydaje się, że działa dobrze.
źródło
.scrollTop(1)
działałby równie dobrze i byłby mniej oczywisty?Możesz użyć zdarzenia focusout , aby wykryć odrzucenie klawiatury. To jak rozmycie, ale bąbelki. Zapali się po zamknięciu klawiatury (ale oczywiście także w innych przypadkach). W Safari i Chrome zdarzenie można zarejestrować tylko za pomocą addEventListener, a nie za pomocą starszych metod. Oto przykład, którego użyłem do przywrócenia aplikacji Phonegap po zwolnieniu klawiatury.
Bez tego fragmentu kontener aplikacji pozostawał w pozycji przewiniętej w górę do momentu odświeżenia strony.
źródło
może nieco lepszym rozwiązaniem jest powiązanie (z jQuery w moim przypadku) zdarzenia „blur” w różnych polach wejściowych.
Dzieje się tak, ponieważ po zniknięciu klawiatury wszystkie pola formularza są zamazane. Więc w mojej sytuacji to wycięcie rozwiązało problem.
mam nadzieję, że to pomoże. Michele
źródło
Jeśli jest klawiatura ekranowa, skupienie uwagi na polu tekstowym znajdującym się w dolnej części okna roboczego spowoduje, że Safari przewinie pole tekstowe do widoku. Może istnieć sposób na wykorzystanie tego zjawiska do wykrycia obecności klawiatury (posiadanie małego pola tekstowego u dołu strony, które chwilowo staje się aktywne, lub coś w tym rodzaju).
źródło
Podczas zdarzenia fokus można przewijać poza wysokość dokumentu i magicznie wartość window.innerHeight jest zmniejszana o wysokość wirtualnej klawiatury. Zwróć uwagę, że rozmiar wirtualnej klawiatury jest inny dla orientacji poziomej i pionowej, więc musisz ją ponownie wykryć, gdy się zmieni. Odradzałbym zapamiętywanie tych wartości, ponieważ użytkownik mógł w dowolnym momencie podłączyć / odłączyć klawiaturę bluetooth.
Zwróć uwagę, że gdy użytkownik używa klawiatury bluetooth, keyboardHeight wynosi 44, co jest wysokością [poprzedniego] [następnego] paska narzędzi.
Podczas wykrywania pojawia się niewielkie migotanie, ale nie można go uniknąć.
źródło
Edycja: udokumentowane przez Apple, chociaż nie mogłem go uruchomić: Zachowanie WKWebView z wyświetlaczami klawiatury : „W systemie iOS 10 obiekty WKWebView pasują do natywnego zachowania Safari, aktualizując ich właściwość window.innerHeight, gdy klawiatura jest wyświetlana, i nie wywołują zdarzenia zmiany rozmiaru ”(może użyć fokusu lub fokusu z opóźnieniem do wykrywania klawiatury zamiast zmiany rozmiaru).
Edycja: kod zakłada klawiaturę ekranową, a nie zewnętrzną. Zostawiam to, ponieważ informacje mogą być przydatne dla innych, którzy interesują się tylko klawiaturami ekranowymi. Użyj http://jsbin.com/AbimiQup/4, aby wyświetlić parametry strony.
Testujemy, czy
document.activeElement
jest to element, który pokazuje klawiaturę (typ wejścia = tekst, obszar tekstowy itp.).Poniższy kod fałszuje rzeczy dla naszych celów (chociaż ogólnie nie jest to poprawne).
Powyższy kod jest tylko przybliżony: jest nieprawidłowy dla podzielonej klawiatury, niezadokowanej klawiatury, klawiatury fizycznej. Zgodnie z komentarzem u góry, możesz być w stanie wykonać lepszą pracę niż podany kod w Safari (od iOS8?) Lub WKWebView (od iOS10) przy użyciu
window.innerHeight
właściwości.Znalazłem awarie w innych okolicznościach: np. Skup się na wprowadzaniu, a następnie przejdź do ekranu głównego, a następnie wróć do strony; iPad nie powinien zmniejszać widocznego obszaru; stare przeglądarki IE nie będą działać, Opera nie działała, ponieważ Opera skupiała się na elemencie po zamknięciu klawiatury.
Jednak oznaczona odpowiedź (zmiana przewijania w celu pomiaru wysokości) ma nieprzyjemne efekty uboczne interfejsu użytkownika, jeśli można powiększać widok (lub powiększanie wymuszone w preferencjach). Nie używam innego sugerowanego rozwiązania (zmiana przewijania), ponieważ na iOS, gdy widok jest powiększalny i przewijany do skoncentrowanego wejścia, występują błędne interakcje między przewijaniem, powiększaniem i ostrością (które mogą pozostawić skoncentrowane wejście poza rzutnią - nie widoczny).
źródło
Testowane tylko na Androidzie 4.1.1:
zdarzenie rozmycia nie jest niezawodnym zdarzeniem do testowania klawiatury w górę iw dół, ponieważ użytkownik ma możliwość jawnego ukrycia klawiatury, która nie wyzwala zdarzenia rozmycia w polu, które spowodowało wyświetlenie klawiatury.
Jednak zdarzenie resize działa jak urok, jeśli klawiatura podnosi się lub opuszcza z jakiegokolwiek powodu.
Kawa:
uruchamia się za każdym razem, gdy klawiatura jest pokazywana lub ukrywana z dowolnego powodu.
Należy jednak pamiętać, że w przypadku przeglądarki na Androida (zamiast aplikacji) istnieje wysuwany pasek adresu URL, który nie uruchamia się przy zmianie rozmiaru po wycofaniu, ale zmienia dostępny rozmiar okna.
źródło
Zamiast wykrywać klawiaturę, spróbuj wykryć rozmiar okna
Jeśli wysokość okna została zmniejszona, a szerokość nadal jest taka sama, oznacza to, że klawiatura jest włączona. W przeciwnym razie klawiatura jest wyłączona, możesz również dodać do tego, sprawdzić, czy jakieś pole wejściowe jest aktywne, czy nie.
Wypróbuj na przykład ten kod.
źródło
To rozwiązanie zapamiętuje pozycję przewijania
źródło
Spróbuj tego:
źródło
Jak zauważyłem w poprzednich odpowiedziach gdzieś zmienna window.innerHeight jest teraz poprawnie aktualizowana na iOS10, gdy pojawia się klawiatura, a ponieważ nie potrzebuję wsparcia dla wcześniejszych wersji, wymyśliłem następujący hack, który może być nieco łatwiejszy niż omawiany "rozwiązania".
wtedy możesz użyć:
aby sprawdzić, czy klawiatura jest widoczna. Używam go już od jakiegoś czasu w mojej aplikacji internetowej i działa dobrze, ale (jak wszystkie inne rozwiązania) może się zdarzyć, że się nie powiedzie, ponieważ „oczekiwany” rozmiar nie jest poprawnie aktualizowany lub coś takiego.
źródło
Wyszukałem trochę i nie mogłem znaleźć nic konkretnego dla słów „na klawiaturze pokazanej” lub „na klawiaturze zamkniętej”. Zobacz oficjalną listę obsługiwanych wydarzeń . Zobacz także uwagę techniczną TN2262 dotyczącą iPada. Jak zapewne już wiesz, istnieje zdarzenie związane z ciałem,
onorientationchange
które możesz połączyć, aby wykryć krajobraz / portret.Podobnie, ale dziwne przypuszczenie ... czy próbowałeś wykryć zmianę rozmiaru? Zmiany w widocznym obszarze mogą wywołać to zdarzenie pośrednio z powodu pokazywania / ukrywania klawiatury.
Co po prostu ostrzegałoby o nowej wysokości przy każdym zdarzeniu zmiany rozmiaru ...
źródło
Nie próbowałem tego osobiście, więc to tylko pomysł ... ale czy próbowałeś użyć zapytań o media w CSS, aby zobaczyć, kiedy zmienia się wysokość okna, a następnie zmienić projekt? Wyobrażam sobie, że Safari na telefon komórkowy nie rozpoznaje klawiatury jako części okna, więc mam nadzieję, że zadziała.
Przykład:
źródło
Problem polega na tym, że nawet w 2014 roku urządzenia obsługują zdarzenia zmiany rozmiaru ekranu, a także zdarzenia przewijania, niespójnie, gdy klawiatura programowa jest otwarta.
Odkryłem, że nawet jeśli używasz klawiatury bluetooth, w szczególności iOS powoduje dziwne błędy w układzie; więc zamiast wykrywać miękką klawiaturę, po prostu musiałem wybrać urządzenia, które są bardzo wąskie i mają ekrany dotykowe.
Używam zapytań o media (lub window.matchMedia ) do wykrywania szerokości i Modernizr do wykrywania zdarzeń dotykowych.
źródło
Być może łatwiej jest mieć pole wyboru w ustawieniach aplikacji, w którym użytkownik może przełączać „podłączona klawiatura zewnętrzna?”.
Drobnym drukiem wyjaśnij użytkownikowi, że klawiatury zewnętrzne nie są obecnie wykrywalne w dzisiejszych przeglądarkach.
źródło
Cóż, możesz wykryć, kiedy pola wprowadzania są fokusem i znasz wysokość klawiatury. Dostępny jest również CSS, aby uzyskać orientację ekranu, więc myślę, że możesz go zhakować.
Chciałbyś jednak jakoś poradzić sobie z fizyczną klawiaturą.
źródło