Zapobiegaj domyślnej klawiaturze iPhone'a podczas fokusowania <input>


83

tak się staram

<script type="text/javascript">
     $(document).ready(function(){
        $('#dateIn,#dateOut').click(function(e){
            e.preventDefault();
        }); 
     });
</script>

ale wejście nadal „uruchamia” klawiaturę iPhone'a

ps: chcę to zrobić, ponieważ używam wtyczki datepicker do daty

Odpowiedzi:


228

Dodając atrybut readonly(lub readonly="readonly") do pola wejściowego, powinieneś uniemożliwić komukolwiek wpisywanie czegokolwiek w tym polu, ale nadal mieć możliwość uruchomienia zdarzenia kliknięcia w tym polu.

Jest to również przydatne na urządzeniach innych niż mobilne, ponieważ używasz selektora daty / godziny


2
Hm! dzięki! ale czy datepicker będzie mógł ustawić wybraną wartość?
Toni Michel Caubet

9
Tak, to będzie. Tylko do odczytu jest tylko dla użytkownika, a nie dla JavaScript.
Rene Pot

4
-1, ponieważ nie jest to bardzo solidna metoda. Dane wejściowe nie są technicznie „tylko do odczytu” i jako takie rzeczy, takie jak autotabbing (przy użyciu tabindex = „x”), nie działają z tym
Patrick

Wydaje się, że Tabindex nadal działa dla mnie. Nie mogę jednak użyć, readonlyponieważ niektóre widżety nie wiążą zdarzenia na readonlywejściach.
Pierre de LESPINAY

1
Tylko uwaga: readonly jest boolowskim atrybutem HTML, co oznacza, że ​​jego obecność wskazuje na wartość. Potrzebujesz tylko „readonly”, a nie „readonly = {true | readonly | etc}”
contactmatt

12

Możesz dodać funkcję wywołania zwrotnego do DatePicker, aby nakazać mu rozmycie pola wejściowego przed wyświetleniem DatePicker.

$('.selector').datepicker({
   beforeShow: function(){$('input').blur();}
});

Uwaga: klawiatura iOS pojawi się na ułamek sekundy, a następnie ukryje się.


1
dzięki, to działa też na Androida. W przypadku Androida to nawet się nie pojawia
timaschew

1
Nie działa dla mnie na
Androidzie

1
Jak dotąd najlepsza odpowiedź dla mnie. Prawie się z tego poddałem.
Thiago Elias

Wspaniała i elegancka sztuczka, dziękuję. Działa na iPhone + Android tutaj.
Erowlin

3

Ponieważ nie mogę skomentować najwyższego komentarza, jestem zmuszony przesłać „odpowiedź”.

Problem z wybraną odpowiedzią polega na tym, że ustawienie pola tylko do odczytu powoduje usunięcie go z kolejności tabulatorów w telefonie iPhone. Jeśli więc lubisz wprowadzać formularze, naciskając „następny”, przeskoczysz bezpośrednio nad polem.


1
To ma sens, tylko do odczytu nie pozwala użytkownikowi zmieniać wartości (tylko javascript), więc myślę, że jest to naturalne, że je pomija
Toni Michel Caubet

1
Jednak w przeglądarkach stacjonarnych, które testowałem - w tym Safari / mac - tabulacja przenosi cię do pola tylko do odczytu.
John Vance

1
@JohnVance Czy to prawda, nawet jeśli atrybut tabulacji jest ustawiony? A może to zniweluje efekt? (Pytam, ponieważ nie mam iPhone'a, ale byłbym wdzięczny za wiedzę)
Fernando Silva

1
@FernandoSilva Przetestowałem to na iPhonie Safari, z indeksem kart nadal pominiesz to pole.
Betty

3

Zadałem tutaj podobne pytanie i otrzymałem fantastyczną odpowiedź - użyj natywnego datepickera iPhone'a - jest super.

Jak wyłączyć klawiaturę iPhone'a dla określonego pola wprowadzania na stronie internetowej

Streszczenie / pseudokod:

if small screen mobile device 

  set field type to "date" - e.g. document.getElementById('my_field').type = "date";
  // input fields of type "date" invoke the iPhone datepicker.

else

  init datepicker - e.g. $("#my_field").datepicker();

Powodem dynamicznego ustawiania typu pola na „date” jest to, że Opera w przeciwnym razie wyświetli własny natywny datepicker. Zakładam, że chcesz konsekwentnie pokazywać datepicker w przeglądarkach na komputerach stacjonarnych.


1
Problem polega na tym, że dostępne lub niedostępne daty zostały już ustalone przez datepicera ... ale późno dzięki!
Toni Michel Caubet

3

Poniższy kod działa u mnie:

<input id="myDatePicker" class="readonlyjm"/>


$('#myDatePicker').datepicker({
/* options */
});

$('.readonlyjm').on('focus',function(){
$(this).trigger('blur');
});

2

Moim zdaniem najlepszym sposobem rozwiązania tego problemu jest użycie opcji „ignoreReadonly”.

Najpierw ustaw pole wejściowe tylko do odczytu, a następnie dodaj ignoreReadonly: true. Zapewni to, że nawet jeśli pole tekstowe jest tylko do odczytu, pojawi się wyskakujące okienko.

$('#txtStartDate').datetimepicker({
            locale: "da",
            format: "DD/MM/YYYY",
            ignoreReadonly: true
        });
        $('#txtEndDate').datetimepicker({
            locale: "da",
            useCurrent: false,
            format: "DD/MM/YYYY",
            ignoreReadonly: true
        });
});

1

atrybut inputmode

<input inputmode='none'>

inputmodeAtrybut globalny jest atrybutem wyliczeniowy że wskazówki w rodzaju danych, które mogą być wprowadzone przez użytkownika podczas edycji elementu lub jego zawartości. Może mieć następujące wartości:

none- Brak wirtualnej klawiatury. Gdy strona implementuje własną kontrolkę wprowadzania danych z klawiatury.


Używam tego pomyślnie (testowane na Chrome / Android )

Sztuczki CSS: wszystko, co chciałeś wiedzieć o trybie wprowadzania


0

Oto moje rozwiązanie (podobne do odpowiedzi Johna Vance'a):

Najpierw przejdź tutaj i uzyskaj funkcję wykrywania przeglądarek mobilnych.

http://detectmobilebrowsers.com/

Mają wiele różnych sposobów wykrywania, czy korzystasz z telefonu komórkowego, więc znajdź taki, który działa z tym, czego używasz.

Twoja strona HTML (pseudokod):

If Mobile Then
    <input id="selling-date" type="date" placeholder="YYYY-MM-DD" max="2999-12-31" min="2010-01-01" value="2015-01-01" />
else
    <input id="selling-date" type="text" class="date-picker" readonly="readonly" placeholder="YYYY-MM-DD" max="2999-12-31" min="2010-01-01" value="2015-01-01" />

JQuery:

$( ".date-picker" ).each(function() {
    var min = $( this ).attr("min");
    var max = $( this ).attr("max");
    $( this ).datepicker({ 
        dateFormat: "yy-mm-dd",  
        minDate: min,  
        maxDate: max  
    });
});

W ten sposób możesz nadal korzystać z natywnych selektorów daty w telefonie komórkowym, jednocześnie ustawiając minimalną i maksymalną datę w obie strony.

Pole dla urządzeń innych niż mobilne powinno być tylko do odczytu, ponieważ jeśli przeglądarka mobilna, taka jak chrome dla ios, „żąda wersji na komputer”, może obejść sprawdzenie urządzenia mobilnego, a Ty nadal chcesz zapobiec wyświetlaniu klawiatury.

Jednak jeśli pole jest tylko do odczytu, może wyglądać na użytkownika, jakby nie mógł go zmienić. Możesz to naprawić, zmieniając CSS, aby wyglądał, jakby nie był tylko do odczytu (tj. Zmień kolor obramowania na czarny), ale jeśli nie zmienisz CSS dla wszystkich tagów wejściowych, trudno będzie zachować spójny wygląd przeglądarki.

Aby to zrozumieć, po prostu dodaję przycisk kalendarza do selektora dat. Po prostu zmień trochę swój kod JQuery:

$( ".date-picker" ).each(function() {
    var min = $( this ).attr("min");
    var max = $( this ).attr("max");
    $( this ).datepicker({ 
        dateFormat: "yy-mm-dd",  
        minDate: min,  
        maxDate: max,
        showOn: "both",
        buttonImage: "images/calendar.gif",
        buttonImageOnly: true,
        buttonText: "Select date"
    });
});

Uwaga: będziesz musiał znaleźć odpowiedni obraz.



0

Mam mały ogólny skrypt „bez klawiatury” - działa dla mnie z Androidem i iPhonem:

  $('.readonlyJim').on('focus', function () {
      $(this).trigger('blur')
  })

Po prostu dołącz add class readonlyJimdo znacznika wejściowego i voila.

(* Przepraszam za dużo StarTrek tutaj)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.