запретить клавиатуру iphone по умолчанию при фокусировке <input>

83

вот как я пытаюсь

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

но ввод по-прежнему "запускает" клавиатуру iphone

ps: я хочу сделать это, потому что я использую плагин datepicker для даты

Тони Мишель Каубе
источник

Ответы:

228

Добавив атрибут readonly(илиreadonly="readonly" ) в поле ввода, вы должны запретить кому-либо вводить что-либо в нем, но при этом иметь возможность запускать на нем событие щелчка.

Это также полезно на немобильных устройствах, поскольку вы используете средство выбора даты / времени.

Рене Пот
источник
2
Хм! благодаря! но сможет ли datepicker установить выбранное значение?
Тони Мишель Кавет
9
Да, это будет. Только для чтения предназначен только для пользователя, а не для JavaScript.
Рене Пот
4
-1, поскольку это не очень надежный метод. Ввод технически не является «только для чтения», и поэтому такие вещи, как автоматическая вставка (с использованием tabindex = «x»), не работают с этим
Патрик
Табиндекс, кажется, у меня все еще работает. Однако я не могу использовать, readonlyпотому что некоторые виджеты не привязывают событие к readonlyвходам.
Pierre de LESPINAY
1
Просто примечание: readonly - это логический атрибут HTML, то есть его наличие указывает на значение. Вам нужно только "readonly", а не "readonly = {true | readonly | etc}"
contactmatt
12

Вы можете добавить функцию обратного вызова в свой DatePicker, чтобы сообщить ему размыть поле ввода перед отображением DatePicker.

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

Примечание. Клавиатура iOS появится на долю секунды, а затем скроется.

начомааны
источник
1
спасибо, это работает и для Android. Для андроида даже не появляется
timaschew 02 янв.15
1
У меня не работает в android .. Клавиатура все еще выскакивает
mjs
1
Лучший ответ для меня на данный момент. Я почти отказывался от этого.
Тьяго Элиас
Отличный и элегантный трюк, спасибо. Здесь он работает на iPhone + Android.
Erowlin
3

Поскольку я не могу комментировать верхний комментарий, я вынужден отправить «ответ».

Проблема с выбранным ответом заключается в том, что установка поля только для чтения выводит поле из порядка табуляции на iPhone. Так что, если вам нравится вводить формы, нажимая «далее», вы пропустите это поле.

Джон Вэнс
источник
1
Это имеет смысл, readonly не позволит пользователю изменять значение (только javascript), поэтому я думаю, это естественно, что он его пропускает
Тони Мишель Каубет,
1
Однако в протестированных мной браузерах для настольных компьютеров, включая Safari / mac, табуляция переводит вас в поле только для чтения.
Джон Вэнс
1
@JohnVance Верно ли это, даже если установлен атрибут tab-index? Или это перевесит эффект? (Я спрашиваю, потому что у меня нет iPhone, но я был бы признателен за знания)
Фернандо Силва
1
@FernandoSilva Я тестировал это на iPhone Safari, с tab-index вы все равно пропустите поле.
Бетти
3

Я задал здесь аналогичный вопрос и получил фантастический ответ - используйте родное средство выбора даты для iPhone - это здорово.

Как отключить клавиатуру iPhone для указанного поля ввода на веб-странице

Синопсис / псевдокод:

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();

Причина динамической установки типа поля на «date» заключается в том, что Opera в противном случае будет отображать собственный родной datepicker, и я предполагаю, что вы хотите последовательно отображать datepicker в настольных браузерах.

Джон Вэнс
источник
1
Проблема в том, что доступные или недоступные даты уже установлены с помощью datepicer ... Поздно, спасибо!
Тони Мишель Каубе
3

Ниже код работает для меня:

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


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

$('.readonlyjm').on('focus',function(){
$(this).trigger('blur');
});
Хуан Мануэль де Кастро
источник
2

На мой взгляд, лучший способ решить эту проблему - использовать ignoreReadonly.

Сначала сделайте поле ввода только для чтения, затем добавьте ignoreReadonly: true. Это гарантирует, что даже если текстовое поле доступно только для чтения, всплывающее окно будет отображаться.

$('#txtStartDate').datetimepicker({
            locale: "da",
            format: "DD/MM/YYYY",
            ignoreReadonly: true
        });
        $('#txtEndDate').datetimepicker({
            locale: "da",
            useCurrent: false,
            format: "DD/MM/YYYY",
            ignoreReadonly: true
        });
});
Акбар Бадхуша
источник
1

атрибут inputmode

<input inputmode='none'>

inputmodeГлобальный атрибут перечислимого атрибут , который намекает на тип данных , которые могут быть введены пользователем при редактировании элемента или его содержимое. Может иметь следующие значения:

none- Нет виртуальной клавиатуры. Когда страница реализует собственное управление вводом с клавиатуры.


Я успешно использую это (проверено на Chrome / Android )

CSS-уловки: все, что вы когда-либо хотели знать о режиме ввода

vsync
источник
0

Итак, вот мое решение (похоже на ответ Джона Вэнса):

Сначала перейдите сюда и получите функцию для обнаружения мобильных браузеров.

http://detectmobilebrowsers.com/

У них есть много разных способов определить, используете ли вы мобильный телефон, поэтому найдите тот, который работает с тем, что вы используете.

Ваша HTML-страница (псевдокод):

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  
    });
});

Таким образом, вы по-прежнему можете использовать собственные селекторы дат на мобильных устройствах, в то же время устанавливая минимальную и максимальную даты в любом случае.

Поле для немобильных устройств следует читать только потому, что если мобильный браузер, такой как Chrome для ios, «запрашивает версию для настольных компьютеров», они могут обойти проверку мобильных устройств, а вы все равно хотите, чтобы клавиатура не отображалась.

Однако, если поле доступно только для чтения, пользователю может показаться, что он не может изменить поле. Вы можете исправить это, изменив CSS, чтобы он выглядел так, как будто он не только для чтения (например, измените цвет границы на черный), но если вы не измените CSS для всех тегов ввода, вам будет сложно сохранить согласованный вид браузеры.

Чтобы понять это, я просто добавляю кнопку с изображением календаря в средство выбора даты. Просто немного измените свой код 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"
    });
});

Примечание: вам нужно будет найти подходящее изображение.

Кертис
источник
0

@ rene-pot правильный. Однако в настольной версии веб-сайта у вас будет значок «Запрещено». Чтобы обойти это, примените readonly = "true" к div, который будет отображаться только в мобильном представлении, а не на рабочем столе. Посмотрите, что мы здесь делали http://www.naivashahotels.com/naivasha-hotels/lake-naivasha-country-club/

DaviD.K
источник
0

У меня есть небольшой общий скрипт «без клавиатуры» - у меня работает с Android и iPhone:

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

Просто прикрепите добавить класс readonlyJim к тегу ввода и вуаля.

(* Извините, здесь слишком много StarTrek)

BeNice
источник