HTML: Почему браузер Android показывает "Go" вместо "Next" на клавиатуре?
У меня есть форма входа в HTML, содержащая следующие элементы (в этом порядке):
-
input type=text
(ввод имени пользователя)
-
input type=password
(пароль)
-
input type=submit
(кнопка входа)
Почему в браузере Android отображается кнопка "Перейти" на мягкой клавиатуре вместо кнопки "Далее", когда фокус находится в text input
? Это приводит к тому, что пользователь не может войти в систему очень легко, потому что после ввода имени пользователя пользователь нажимает нижнюю правую кнопку на клавиатуре (как правило, правильное действие), и форма будет отправлена с пустым паролем, который, очевидно, не будет работать, [Это было бы разумно, если бы мой браузер был настроен на запоминание паролей, и менеджер паролей мог бы заполнить пароль. Однако здесь это не так, как вы можете проверить себя ниже.]
Я хотел бы, чтобы текст типа ввода имел кнопку "Далее" и пароль типа ввода (последний вход перед отправкой), чтобы иметь кнопку "Перейти".
Примером проблемной формы является https://peda.net/:login (эта форма содержит код для обнаружения ключа "Enter" для ввода и предотвращает отправку форма, если только последний вид видимой формы не сфокусирован).
Знаете ли вы реальное решение этой проблемы? Я знаю, что если бы я использовал собственное приложение, я бы использовал android:imeOptions="actionNext"
(см. Как изменить клавиатуру функциональных клавиш Android и кнопку "Перейти" в "Далее" .). Однако в этом случае это HTML-форма и браузер по умолчанию Android.
Проблема видна, по крайней мере, следующими конфигурациями:
- Системное приложение "Браузер" , работающее на Android 2.3.4 (Cyanogenmod 7)
- Системное приложение "Браузер" , работающее на Android 4.2.2 (Cyanogenmod 10.1)
- Системное приложение "Браузер" , работающее на Android 4.3.1 (Cyanogenmod 10.2 M1)
- Системное приложение "Браузер" (AOSP Browser), работающее на Android 4.4.2 (Cyanogenmod 11.0 M3)
- Системное приложение "Браузер" (браузер AOSP), работающее на Android 5.5.1 (Cyanogenmod 12.1) [имеет значок стрелки вместо слова "Перейти" ]
- Системное приложение "Браузер" (AOSP Browser), работающее на Android 6.0.1 (Cyanogenmod 13.0) [имеет значок стрелки вместо слова "Перейти" ]
Ответы
Ответ 1
Android-браузер всегда отображает Go для полей ввода, потому что в некоторых формах в Интернете (особенно в блоках поиска) нет кнопки отправки, и ее можно активировать только нажатием Enter (Go эквивалентно Enter).
Вместо некоторых версий Android будет отображаться клавиша табуляции в правом нижнем углу клавиатуры, чтобы упростить навигацию между полями формы.
Я не думаю, что вы можете предотвратить любое из этих поведений.
Возможные обходные пути:
Ответ 2
Чтобы добавить к John ответ, Android всегда добавляет "Go" в текстовые входы и всегда добавляет "Next" к номерам. Я хотел бы услышать, как человек, ответственный за этот выбор, объясняет свою логику.
Дизайн softkeyboard в этом отношении просто паршивый, потому что каждый пользователь, с которым я тестировал до сих пор, думал, что большая синяя кнопка на клавиатуре должна быть кнопкой, которая приведет вас к следующему полю формы, а затем в последней форме поле позволяет вам отправить форму.
iOS это еще хуже в этом отношении, так как они предлагают кнопку "Go" с каждым полем формы и не могут вставлять поля. Приятно, что Apple любит делать компьютеры простыми для людей, но иногда полагая, что люди, подобные ей просто, могут затушевать в предполагаемых людях все идиоты.
Извините, что это напыщенная речь. У меня есть кое-что конструктивное предложение:
Если ваше последнее поле формы имеет тип = номер, то есть крошечный хак, который будет работать как на Android, так и на iOS: добавьте невидимый текст в форму с помощью onfocus = "$ ('# thisForm')..Отправить();". В Android это поле коротко начнет мигать: в iOS это не будет. Чтобы сделать ситуацию Android более приемлемой, вы можете либо установить значение для ввода текста, как "Закрытие этой формы", либо установить его ширину в 0, что приведет к тому, что поле формы будет не совсем 0 шириной, но все же очень маленькой.
Ужасный взлом, но эй, обвиняй его в пользовательских интерфейсах в Google и Apple.
Ответ 3
см. Заменить кнопку Go на мягкой клавиатуре с помощью Next в Phonegap.
Для быстрой навигации см. этот plunker.
Чтобы выполнить полный код
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<form action="" id="form">
First name: <input type="text" name="firstname">
Last name: <input type="text" name="lastname">
<select name="select" readonly="readonly">
<option>Select Something</option>
</select>
Last name: <input type="text" name="lastname" disabled="disabled">
Select <select name="select" id="selectBox">
<option>Select Something</option>
</select>
Last name: <input type="text" name="lastname">
Select <select name="select" readonly="readonly">
<option>Select Something</option>
</select>
<button type="submit">Submit</button>
</form>
<script>
(function($) {
$.fn.enterAsTab = function(options) {
var settings = $.extend({
'allowSubmit': false
}, options);
$(this).find('input, select, textarea, button').live("keydown", {localSettings: settings}, function(event) {
if (settings.allowSubmit) {
var type = $(this).attr("type");
if (type == "submit") {
return true;
}
}
if (event.keyCode == 13) {
var inputs = $(this).parents("form").eq(0).find(":input:visible:not(:disabled):not([readonly])");
var idx = inputs.index(this);
if (idx == inputs.length - 1) {
idx = -1;
} else {
inputs[idx + 1].focus(); // handles submit buttons
}
try {
inputs[idx + 1].select();
}
catch (err) {
}
return false;
}
});
return this;
};
})(jQuery);
$("#form").enterAsTab({ 'allowSubmit': true});
</script>
ПРИМЕЧАНИЕ. Не забудьте заменить метод jQuery .live()
на .on()
при использовании более новой версии jquery than 1.9.
Ответ 4
Это проблема Chromium, если вы хотите посмотреть ее: https://bugs.chromium.org/p/chromium/issues/detail?id=410785
Ниже приведено обходное решение для Android, которое изменяет "enter" в пользовательском вводе так, чтобы оно "вносило вкладки" в поле пароля (и не отправляет форму):
http://jsbin.com/zakeza/1/quiet
<form action="?">
User <input type=text onkeypress=key(event)><br><br>
Password <input id=pw type=password><br><br>
<input type=submit>
</form>
<script>
function key(event) {
if (event.charCode == 13 && /Android/.test(navigator.userAgent)) {
event.preventDefault();
document.getElementById('pw').focus();
}
}
</script>
Изменить: Примечание. Windows Phone также помещает Android
в UA, поэтому для тестирования на Windows Phone (и Android Firefox) требуется тестирование.
Ответ 5
Чтобы избежать путаницы для пользователя, нажмите кнопку GO в качестве кнопки ввода.
Для этого используйте тег формы, но во избежание неполных представлений используйте отключенный атрибут на кнопке отправки.
$("input:not(.submit)").bind('input',function(){
var isValid = validateInputs();
if(isValid)
{
$('.submit').removeAttr('disabled');
}
else
{
$('.submit').attr('disabled','disabled');
}
});
Теперь Чтобы избежать перезагрузки страницы, не используйте действие или атрибуты onsubmit в теге формы, вместо этого используйте
$('#formid').submit(function(){
var disabled=$('.submit').attr('disabled');
if(disabled=='disabled')
{
return;
}
callOnSubmitFunction();
return false;
}
);
return false важно здесь, чтобы избежать перезагрузки страницы.
за исключением chrome, firefox и браузеры по умолчанию для Android показывают предыдущие и следующие кнопки, которые будут работать как кнопки вкладок, поэтому используйте соответствующие атрибуты tabindex на элементе ввода формы.
Ответ 6
Мы не можем предотвратить это поведение по умолчанию, потому что на данный момент нет тега type="next"
, доступного в HTML. Таким образом, по умолчанию появляется кнопка "Перейти". Ниже ссылки со списком доступных тегов типа входа: http://www.w3schools.com/tags/att_input_type.asp