ukryj klawiaturę w iphone safari webapp

Tworzę webapp dla iPhone ' a, oparty na HTML / CSS / JS. Używam formularzy, aby odbierać dane wejściowe i przekazywać do skryptu, ale problem, z którym się spotykam, polega na tym, że klawiatura nie zniknie. Użytkownik wprowadzi informacje, wciśnij Wyślij, a ponieważ jest to JavaScript, strona nie ładuje się ponownie. Klawiatura pozostaje na miejscu, co jest uciążliwe i dodaje kolejny krok dla użytkowników (konieczność jej zamknięcia).

Czy Jest jakiś sposób, aby wymusić odejście klawiatury w Safari? Zasadniczo mam poczucie, że to pytanie jest równoznaczne z pytaniem, w jaki sposób mogę zmusić pole wejściowe do utraty ostrości lub rozmycia. Szukając w Internecie, znajduję wiele przykładów do wykrycia zdarzenia rozmycia, ale żaden nie wymusza tego zdarzenia.

Author: munchybunch, 2010-05-23

9 answers

Jeszcze prościej, można wywołać funkcję blur () na aktualnie skupionym elemencie. $("#inputWithFocus").blur ()

 40
Author: Steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-01 21:37:55
document.activeElement.blur();
 38
Author: iPadDeveloper2011,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-06 05:45:22

Możesz spróbować focus() ing na elemencie nietekstowym, takim jak przycisk submit.

 25
Author: ceejayoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 10:46:58

Oto mały fragment kodu, który zawsze ukrywa klawiaturę, gdy fokus znajduje się w polu wejściowym lub tekstowym, a użytkownik stuknie poza tym elementem (normalne zachowanie w przeglądarkach stacjonarnych).

function isTextInput(node) {
    return ['INPUT', 'TEXTAREA'].indexOf(node.nodeName) !== -1;
}

document.addEventListener('touchstart', function(e) {
    if (!isTextInput(e.target) && isTextInput(document.activeElement)) {
        document.activeElement.blur();
    }
}, false);
 16
Author: Husky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 12:13:20

Aby wykryć naciśnięcie przycisku return użyj:

$('input').bind('keypress', function(e) { if(e.which === 13) { document.activeElement.blur(); } });

 3
Author: Ben Southall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-22 10:47:11
$('input:focus').blur();

Użycie atrybutu CSS dla elementu focused powoduje rozmycie każdego wejścia, które aktualnie posiada focus, co powoduje usunięcie klawiatury.

 2
Author: Design by Adrian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-15 16:20:19

Natknąłem się na ten problem i spędziłem trochę czasu do uzyskania zadowalającego rozwiązania. Mój problem nieco różnił się od pierwotnego pytania, ponieważ chciałem odrzucić Zdarzenie wejściowe po dotknięciu poza obszarem elementu wejściowego.

Celowe odpowiedzi powyżej pracy, ale myślę, że nie są kompletne, więc oto moja próba w przypadku, gdy wylądujesz na tej stronie szukając tego samego, co ja:

JQuery solution

Dodajemy touchstart Event listener do całego dokument. Gdy ekran zostanie dotknięty (nie ma znaczenia, czy jest to dotknięcie, przytrzymanie lub przewinięcie), uruchomi obsługę i wtedy sprawdzimy:

  1. czy dotknięty obszar reprezentuje wejście?
  2. czy dane wejściowe są skupione?

Biorąc pod uwagę te dwa warunki, uruchamiamy Zdarzenie blur(), aby usunąć fokus z wejścia.

ps: byłem trochę leniwy, więc po prostu skopiowałem linię z powyższej odpowiedzi, ale możesz użyć selektora jQuery dla dokumentu w przypadku, gdy chcesz zachowaj spójność kodu

$(document).on('touchstart', function (e) {
  if (!$(e.target).is('.my-input') && $('.my-input').is(':focus')) {
    document.activeElement.blur();
  }
});

Młotek.JS solution

Alternatywnie możesz użyć Młota.JS do obsługi gestów dotykowych. Załóżmy, że chcesz odrzucić to w zdarzeniu tap, ale klawiatura powinna tam być, jeśli użytkownicy tylko przewijają stronę (lub powiedzmy, przytrzymaj zaznaczenie tekstu, aby mógł skopiować to i wkleić do obszaru wprowadzania)

W takiej sytuacji rozwiązaniem byłoby:

var hammer = new Hammer(document.body);
hammer.on('tap', function(e) {
  if (!$(e.target).is('.search-input') && $('.search-input').is(':focus')) {
    document.activeElement.blur();
  }
});
Mam nadzieję, że to pomoże!
 2
Author: rafg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-20 01:15:28

Pamiętaj, aby ustawić, w CSS:

body {
  cursor: pointer;
}

W przeciwnym razie, twoje wywołanie obsługi zdarzenia document.activeElement.blur() nigdy nie zostanie zwolnione. Więcej informacji: http://www.shdon.com/blog/2013/06/07/why-your-click-events-don-t-work-on-mobile-safari

 0
Author: davidgoli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-25 06:42:11

Dla każdego kto używa kodu Husky ' ego w AngularJs oto przepis:

function isTextInput(node) {
    return ['INPUT', 'TEXTAREA'].indexOf(node.nodeName) !== -1;
}

angular.element($document[0]).on('touchstart', function(e) {
  var activeElement = angular.element($document[0].activeElement)[0];
  if(!isTextInput(e.target) && isTextInput(activeElement)) {
    activeElement.blur();
  }
});
 0
Author: Tyler Moses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-02 17:33:23