IPad не пишет текст в <input>
У меня возникают проблемы с полем <input>
при запуске моего приложения на iPad.
На рабочем столе щелкните текстовое поле, введите текст и нажмите кнопку, чтобы подтвердить ввод. Однако на iPad открывается клавиатура, когда вы нажимаете на нее, но текст не отображается в текстовом поле при вводе.
Чтобы сделать вещи еще более странными, у меня есть <textarea>
в другом разделе приложения, и он отлично работает. Разница заключается в том, что один сидит поверх приложения, а другой - в импортированном html.
Структура приложения такова:
![application structure]()
Наверху у меня есть основная страница HTML5, которая импортирует html-страницу, содержащую 3 div. Каждый div по очереди импортирует другие html-страницы. И эти страницы имеют различный контент, включая проблемное поле ввода.
Что-то вроде этого:
Main.html
-> container.html (imported via iframe)
-> div1 (imports page n-1 via load(url))
-> div2 (imports page n via load(url))
-> div3 (imports page n+1 via load(url))
pageN.html
-> contains the <input> field
Код для <textarea>
, сидящего на главном html, выглядит следующим образом:
<form id="formNotes">
<textarea id="mainTextbox" type="text" onKeyUp="RefreshNote()" onChange="RefreshNote()"></textarea>
</form>
И код для поля <input>
внутри импортированной html-страницы выглядит следующим образом:
input{
-webkit-user-select: auto;
}
<form id="formInput">
<input id="text1" type="text" ontouchstart="OpenKeyboard(this)" onKeyDown="WriteText(this)" onKeyUp="WriteText(this)" onChange="WriteText(this)"></input>
</form>
Одна вещь, которую я узнал об использовании событий для импортированных HTML, но вам нужно было использовать ontouchstart и другие, чтобы вызвать функции щелчка. Но в этом случае я могу заставить iPad открыть клавиатуру, поэтому я не знаю, почему она не распознает щелчок на клавишах клавиатуры или почему она не отправляет значение в текстовое поле.
[EDIT:] Я выяснил причину, по которой я не получаю никакого текста, потому что iPad считает, что поле <input>
не существует (оно отображается пустым в предупреждении, а не [object Object]
или [object HTMLInputElement]
). Я даже не знаю, почему.
[EDIT 2:] Я попытался использовать getElementsByTagName
и getElementsByClassName
вместо getElementById
. При этом он распознает <input>
, но я до сих пор не могу достичь значения.
Ответы
Ответ 1
Это не реальное решение проблемы, а довольно "грубое" решение проблемы.
По какой-то причине клавиатура в iPad не отправляет значения в <input>
, хотя она запускает ключевые события. Поэтому я был вынужден захватить значения, записать их и отправить полную строку в текстовое поле.
Другими словами, выполните ту же работу, которую клавиатура должна делать автоматически, чтобы начать с!
// Text container
temp = "";
document.addEventListener('keydown', function(event) {
// Checks if the key isn't the delete
if(event.keyCode != 8){
// Converts and writes the pressed key
temp += String.fromCharCode(event.keyCode);
}
else{
// Deletes the last character
temp = temp.slice(0, temp.length-1);
}
}
document.addEventListener('keyup', function(event) {
// Writes the text in the text box
document.getElementById("text1").value = temp;
}
Это решение работает только для буквенно-цифровых символов. Если я хочу использовать специальные символы, мне нужно добавить кейс коммутатора для каждого отдельного key code (charCode
, работающего на iPad, но он вел себя странно в настольных браузерах).
Ответ 2
У меня была такая же проблема при создании приложения PhoneGap. Не уверен, что это та же проблема, хотя:
Виновным был -webkit-user-select: none;
,
Здесь демо.
Я бы подумал, что отключение выбора пользователя просто предотвращает появление различных инструментов, таких как увеличительное стекло или кнопки копирования и вставки, но оказывается, что это полностью отключает ввод. Клавиатура появляется при нажатии на поле ввода - но это о нем: ничего, что вы вводите, не будет отображаться в поле ввода.
Удаление -webkit-user-select: none;
или, по крайней мере, применяя его более избирательно, получилось.
И только теперь, когда я пишу этот ответ, Google наконец-то доставляет. Вот еще один ответ на ТАК ;)
Ответ 3
Когда вы динамически создаете вход или загружаете html после вызова document.ready
, функция jQuery .live()
- это билет.
Итак, в то время как обычно у вас будет такая функция:
$(function () {
$('#text1').on('keyup', function() {
// do something
})
})
станет:
function doSomething() {
// do something
}
$(function () {
$('#text1').live('keyup', doSomething);
})
Ответ 4
Еще одно грубое обходное решение (для всех символов):
document.addEventListener('keydown', function(e) {
window.focus()
$(':focus').focus()
});
Ответ 5
Я должен был добавить !important
для user-select: auto
input {
-webkit-user-select: auto !important;
-khtml-user-select: auto !important;
-moz-user-select: auto !important;
-ms-user-select: auto !important;
-o-user-select: auto !important;
user-select: auto !important;
}