HTML Mobile - принудительное скрытие программной клавиатуры

Я разрабатываю интерфейсный сайт для купонной компании, и у меня есть страница, на которой пользователю нужно только ввести номер телефона и потраченные $$. Мы придумали забавную экранную клавиатуру, встроенную в Javascript, простую в использовании и быструю. Тем не менее, я ищу решение, чтобы предотвратить всплывающую мягкую клавиатуру, когда пользователь фокусируется и вводит текст/цифры в эти поля.

Я знаю об атрибутах типа "номер/телефон/электронная почта", которые придумал HTML5. Однако, рискуя показаться сумасшедшим, я действительно хочу просто использовать свою экранную клавиатуру.

Примечание. Этот веб-сайт в основном ориентирован на планшеты.

Спасибо.


person crodica    schedule 07.06.2012    source источник
comment
Это сумасшествие. Если вы используете стандартные поля ввода, используйте стандартные методы ввода.   -  person egrunin    schedule 08.06.2012
comment
Тем не менее, у экранной клавиатуры есть много преимуществ, помимо того, что ее интересно использовать и создавать. Во-первых, они легко настраиваются, чтобы точно ориентироваться на потребности вашей аудитории, во-вторых, безопасность, в-третьих, экранное пространство. ;-)   -  person crodica    schedule 08.06.2012
comment
А, я вижу, я неправильно понял внешний интерфейс site как внешний интерфейс app. У вас больше свободы в ожиданиях пользователей с веб-сайтом.   -  person egrunin    schedule 08.06.2012


Ответы (10)


Поскольку программная клавиатура является частью ОС, чаще всего скрыть ее не получится — также в iOS скрытие клавиатуры сбрасывает фокус с элемента.

Однако, если вы используете атрибут onFocus для ввода, а затем blur() для ввода текста немедленно, клавиатура скроется, а событие onFocus может установить переменную, чтобы определить, какой текст был сфокусирован последним.

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

person Scott Stevens    schedule 07.06.2012
comment
Спасибо, Скотт. Ваше предложение отлично сработало при тестировании на обычной HTML-форме без экранной клавиатуры. Кажется, что мобильный jquery, который я реализую, или объект клавиатуры, который я использую, создают свои собственные события фокуса, которые я еще не нашел («фокус» находится где-то в пространстве имен в библиотеке). На данный момент нашему клиенту понравилась эта идея, но тот факт, что виртуальная клавиатура продолжала выскакивать, был отключен, поэтому мы отказываемся от этой функции. :( Мне интересно разобраться, так что если кому интересно, вот библиотека клавиатуры: github.com/ Мотти/Клавиатура - person crodica; 08.06.2012
comment
Просто мысль - что произойдет, если вы поместите прозрачный div поверх каждого ввода, а затем используете метод onClick? Например: <div style="position:relative; top:0px; left:0px">Text: <input type="text" /><div style="position:absolute; top:0px; left:0px; width:100%; height:100%; opacity:0" onClick="focusbox()"></div></div>. Относительное (или абсолютное) позиционирование родительского элемента div приводит к тому, что абсолютно позиционированный дочерний элемент находится относительно своего родителя. - person Scott Stevens; 08.06.2012
comment
Клавиатура Android не скрывается после нажатия кнопки «Перейти»? любая идея для этого? - person sirius2013; 26.10.2018

Ответ Скотта С. сработал отлично.

Я кодировал телефонную веб-панель для мобильных устройств, и каждый раз, когда пользователь нажимал номер на клавиатуре (состоящий из элементов td span в таблице), всплывала экранная клавиатура. Я также хотел, чтобы пользователь не мог нажать на поле ввода набираемого номера. Это фактически решило обе проблемы одним выстрелом. Было использовано следующее:

<input type="text" id="phone-number" onfocus="blur();" />
person thamind    schedule 19.03.2014
comment
На самом деле, этот ответ сработал для меня лучше, чем ответ от @ScottS, никакого неуважения к его ответу. Я подозреваю, что прошедшее время между оператором ввода html и $(document).ready() позволило клавиатуре сработать, тогда как onfocus=blur(); было бы быстрее, по крайней мере, в моем сознании и мешало бы клавиатуре стрелять, - person HumbleBeginnings; 06.05.2016

Для дальнейших читателей/искателей:

Как указывает Рене Пот на эта тема,

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

С помощью этого метода вы можете избежать появления «мягкой» клавиатуры и по-прежнему запускать события щелчка / заполнять ввод любой экранной клавиатурой.

Это решение также отлично работает со средствами выбора даты и времени, которые обычно уже реализуют элементы управления.

person ndeufemia    schedule 08.09.2016
comment
readonly=true не является допустимым HTML. Он должен быть только для чтения = только для чтения или просто только для чтения без значения атрибута. - person carpii; 31.03.2018
comment
@carpii: ИМХО, жаль, что W3C приняла такие ужасные решения!!! У них должны быть свои причины... :-( - person André Caldas; 17.07.2020

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

Это то, что я собрал, это работает очень хорошо:

https://codepen.io/bobjase/pen/QrQQvd/

<!-- must be a select box with no children to suppress the keyboard -->
input: <select id="hiddenField" /> 
<span id="fakecursor" />

<input type="text" readonly="readonly" id="visibleField" />
<div id="cursorMeasuringDiv" />

#hiddenField {
  height:17px; 
  width:1px;
  position:absolute;
  margin-left:3px;
  margin-top:2px;
  border:none;
  border-width:0px 0px 0px 1px;
}

#cursorMeasuringDiv {
  position:absolute;
  visibility:hidden;
  margin:0px;
  padding:0px;
}

#hiddenField:focus {
  border:1px solid gray;  
  border-width:0px 0px 0px 1px;
  outline:none;
  animation-name: cursor;
  animation-duration: 1s;
  animation-iteration-count: infinite;
}

@keyframes cursor {
    from {opacity:0;}
    to {opacity:1;}
}

// whenever the visible field gets focused
$("#visibleField").bind("focus", function(e) {
  // silently shift the focus to the hidden select box
  $("#hiddenField").focus();
  $("#cursorMeasuringDiv").css("font", $("#visibleField").css("font"));
});

// whenever the user types on his keyboard in the select box
// which is natively supported for jumping to an <option>
$("#hiddenField").bind("keypress",function(e) {
  // get the current value of the readonly field
  var currentValue = $("#visibleField").val();

  // and append the key the user pressed into that field
  $("#visibleField").val(currentValue + e.key);
  $("#cursorMeasuringDiv").text(currentValue + e.key);

  // measure the width of the cursor offset
  var offset = 3;
  var textWidth = $("#cursorMeasuringDiv").width();
  $("#hiddenField").css("marginLeft",Math.min(offset+textWidth,$("#visibleField").width()));

});

Когда вы щелкаете в поле <input>, он имитирует курсор в этом поле, но на самом деле фокус перемещается на пустое поле <select>. Поля выбора, естественно, позволяют нажатиям клавиш поддерживать переход к элементу в списке, поэтому нужно было только перенаправить нажатие клавиши на исходный ввод и сместить смоделированный курсор.

Это не будет работать для возврата, удаления и т. д., но нам это не нужно. Вероятно, вы могли бы использовать триггер jQuery для отправки события клавиатуры непосредственно в другое поле ввода куда-нибудь, но нам не нужно было заморачиваться с этим, поэтому я этого не делал.

person Bob Jase    schedule 09.05.2018
comment
У меня аналогичная проблема в моем проекте, где мне нужно использовать считыватель штрих-кода устройства Honeywell для ввода данных. Однако, в отличие от вашего, мне не нужно показывать это в поле ввода. Что я сделал, так это привязал прослушиватель ключей ко всему документу. Когда штрих-код был прочитан, событие запускалось для каждого символа штрих-кода. Я поместил их в массив, а затем преобразовал в строку. Я использую angular в моем случае - person Aditya Sawant; 28.07.2018
comment
Спасибо. Вы спасли мой день. И спас меня от Явы. - person Hassan ALi; 08.10.2019
comment
Насколько это работает для простого использования, это круто! Это не работает для сканера штрих-кода. - person Ingus; 21.11.2019

пример того, как я это сделал. После того, как я заполню максимальную длину, она будет размыта из моего поля (и клавиатура исчезнет), если у вас более одного поля, вы можете просто добавить строку, которую я добавляю '//'

var MaxLength = 8;
    $(document).ready(function () {
        $('#MyTB').keyup(function () {
            if ($(this).val().length >= MaxLength) {
               $('#MyTB').blur();
             //  $('#MyTB2').focus();
         }
          }); });
person Vladi    schedule 16.10.2017

Я очень смущен тем, почему никто не поставил это ... может быть, я неправильно понимаю вопрос, но,

<input inputmode="none" />
person Zachiah    schedule 09.06.2021
comment
СПАСИБО! Просто и понятно. - person dazed-and-confused; 23.07.2021

Я столкнулся с той же проблемой, я могу скрыть клавиатуру Android, даже если фокус находится в текстовом поле, просто добавив одно свойство css

<input type="text" style="pointer-events:none" />

и работает нормально...

person Nikhil sHETH    schedule 17.06.2020

Я не мог использовать некоторые из предложенных предложений.

В моем случае Google Chrome использовался для отображения приложения Oracle APEX. Были некоторые очень специфические поля ввода, которые позволяли вам начать вводить значение, и список значений начинал отображаться и сокращался по мере того, как вы становились более конкретными при вводе. После того, как вы выберете элемент из списка доступных параметров, фокус по-прежнему будет находиться в поле ввода.

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

throw "throwing a custom error exits input and hides keyboard";
person user10226243    schedule 14.08.2018

Борюсь с программной клавиатурой на Honeywell Dolphin 70e с Android 4.0.3. Мне не нужна клавиатура, потому что ввод поступает от встроенного считывателя штрих-кода через «сканирующий клин», настроенный на генерацию ключевых событий.

Я обнаружил, что трюк, описанный в более ранних ответах:

input.blur();
input.focus();

работает, но только один раз, прямо при инициализации страницы. Он помещает фокус в элемент ввода, не показывая программную клавиатуру. Это НЕ работает позже, например. после символа TAB в суффиксе штрих-кода вызывает событие onblur или oninput для элемента ввода.

Для чтения и обработки большого количества штрих-кодов вы можете использовать постфикс, отличный от TAB (9), например. 8, который не интерпретируется браузером. В событии input.keydown используйте e.keyCode == 8, чтобы определить полный штрих-код для обработки.

Таким образом, вы инициализируете страницу с фокусом на элементе ввода, со скрытой клавиатурой, все штрих-коды переходят к элементу ввода, и фокус никогда не покидает этот элемент. Конечно, на странице не может быть других элементов ввода (например, кнопок), потому что тогда вы не сможете вернуться к элементу ввода штрих-кода со скрытой программной клавиатурой.

Возможно, перезагрузка страницы после нажатия кнопки может скрыть клавиатуру. Поэтому используйте ajax для быстрой обработки штрих-кодов и используйте обычную кнопку asp.net с PostBack для обработки нажатия кнопки и перезагрузки страницы, чтобы вернуть фокус на ввод штрих-кода со скрытой клавиатурой.

person Roland    schedule 27.08.2019

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

person Earl Grey    schedule 09.06.2021