Поля ввода HTML не получают фокуса при нажатии
У меня проблема, и я не могу понять, что именно вызывает это поведение. Я не могу получить доступ к моим полям ввода и textarea
в моей HTML-форме.
К сожалению, JS, HTML и CSS очень большие, поэтому я не могу опубликовать все это здесь.
Может ли кто-нибудь сказать мне, что искать при отладке этого странного поведения?
UPDATE
Если я перемещаю курсор над полем input
, я могу видеть текстовый курсор, но когда я нажимаю его, поле не получает фокуса. Я могу получить доступ к полю, нажав клавишу Tab, и если я щелкнул правой кнопкой мыши по нему, а затем нажмите на поле, я также получу фокус для него.
... и нет, у них нет атрибутов disabled
или readonly
; -)
Ответы
Ответ 1
когда я нажимаю на него, поле не получает фокуса. я могу получить доступ к полю, нажав клавишу "tab-key"
Похоже, вы отменили действие по умолчанию для события mousedown. Найдите через HTML и JS для обработчиков onmousedown и найдите строку, которая читает.
return false;
Эта строка может перестать фокусироваться, щелкнув.
Re: ваш комментарий, я предполагаю, что вы не можете редактировать код, который добавляет этот обработчик? Если вы можете, самое простое решение - просто удалить оператор return false;
.
Есть ли способ добавить функциональность к event-trigger, не перезаписывая его?
Это зависит от того, как привязывается обработчик. Если он применяется с использованием традиционного метода регистрации, например, element.onmousedown, тогда вы можете создать для него обертку:
var oldFunc = element.onmousedown;
element.onmousedown = function (evt) {
oldFunc.call(this, evt || window.event);
}
Так как эта "обертка" не возвращает false, она не отменяет действие по умолчанию (фокусировку) для элемента. Если ваше событие подключено с использованием расширенного метода регистрации, такого как addEventListener или attachEvent, вы можете удалить обработчик событий только с помощью имени/ссылки функции и снова подключить его с помощью завернутой функции, аналогичной описанной выше. Если это анонимная функция, которая добавлена, и вы не можете получить ссылку на нее, единственным решением будет присоединение другого обработчика событий и сфокусировать элемент вручную с помощью метода element.focus().
Ответ 2
У меня тоже была эта проблема. Я использовал метод disableSelection()
jQuery UI для родительского DIV, который содержал мои поля ввода. В Chrome поля ввода не были затронуты, но в Firefox входы (и текстовые поля) также не фокусировались на нажатии. Странная вещь здесь заключалась в том, что событие click на этих входах работало.
Решение заключалось в том, чтобы удалить метод disableSelection()
для родительского DIV.
Ответ 3
Я знаю, что это очень старый поток, но это случилось со мной совсем недавно; Мне потребовалось некоторое время, чтобы понять это.
Эта же проблема может быть вызвана помещением элементов "ввода" внутри пары тегов "label".
В моем случае я намеревался создать пару тегов "div", но вместо этого я случайно создал пару тегов "метки", затем вставил некоторые текстовые поля ввода "input type =" text "..", используя DOM,
Он отображался нормально на экране, но когда я щелкнул по любому из текстовых полей, курсор продолжал прыгать назад к первому "входу" и действительно действовать неустойчиво.
Мне понадобилось время, чтобы понять это, потому что это поведение тонкое, и совсем не то, что я ожидал бы от такого рода ошибок.
bsnider
Ответ 4
Используйте атрибут onclick="this.select()"
для тега ввода.
Ответ 5
Я боролся с той же проблемой некоторое время назад. Я использовал плагин jquery.layout в модальном диалоговом окне jquery-ui, и я не мог получить доступ к любому из полей в нем.
Казалось, это проблема z-index
(некоторые div
были по моим полям ввода, поэтому я не мог их нажимать). Вы должны проверить это и попробовать изменить значение z-index
ваших полей ввода.
Ответ 6
Это случается иногда, когда в форме находятся несбалансированные теги <label>
.
Ответ 7
У меня тоже была эта проблема, и в моем случае я обнаружил, что цвет шрифта был того же цвета фона, поэтому он выглядел так, как будто ничего не произошло.
Ответ 8
Если вы столкнулись с этой проблемой при использовании холста с DOM на мобильных устройствах, ответ Ashwin G
работал у меня отлично, но я сделал это через javascript
var element = document.getElementById("myinputfield");
element.onclick = element.select();
После этого все работало безупречно.
Ответ 9
Я прочитал все ответы выше, и некоторые из них привели меня к проблеме, но не к решению проблемы.
Основной причиной проблемы является disableSelection()
. Это вызывает все проблемы, но удаление его не является решением, поскольку (по крайней мере, в 2016 году или немного раньше) на устройствах с сенсорным экраном, у вас есть возможность использовать это, если вы хотите иметь возможность перемещать объекты с помощью jQuery.
Решение заключалось в том, чтобы оставить disableSelection()
в сортируемом элементе, но также добавить действие привязки чуть выше:
$('#your_selector_id form').bind('mousedown.ui-disableSelection selectstart.ui-disableSelection', function(event) {
event.stopImmediatePropagation();
})
form
в элементе jQuery - это просто прекратить распространение в форме, так как вам может понадобиться распространение на некоторые элементы.
Ответ 10
Это может произойти в bootstrap, если вы не разместите свои столбцы внутри <div class ='row'>
. Плавающие столбцы не очищаются, и вы можете получить следующий столбец, предшествующий предыдущему, поэтому клики не будут попадать в элементы dom, где вы ожидаете.
Ответ 11
У меня была аналогичная проблема - не мог понять, в чем причина, но я исправил ее, используя следующий код. Так или иначе, он не мог сфокусировать только пустые входы:
$('input').click(function () {
var val = $(this).val();
if (val == "") {
this.select();
}
});
Ответ 12
У меня была эта проблема из-за этого кода:
$("#table tbody tr td:first-child").bind("mousedown", function(e){
e.preventDefault();
$(this).parents('tr').removeClass('draggable');
});
Я разрешил его, удалив
e.preventDefault();
Новый код:
$("#table tbody tr td:first-child").bind("mousedown", function(){
$(this).parents('tr').removeClass('draggable');
});
Ответ 13
Я использую JQuery UI и Bootstrap, поэтому я столкнулся с этой проблемой, и я думаю, что это конфликт между ними, как в нормальном случае текстовая область или входной файл редактируется по своей природе, но я сделал это решение после тестирования всех вышеперечисленных ответов, но ни один из них не разрешил поддержку кросс-браузера для всех основных браузеров, но я решил это, и мне нравится делиться своим решением, с которым вы можете его использовать. текст ввода и текстовое поле
(Протестировано на рабочем столе: IE (все версии), Chrome, Safari, Windows Edge, Firefox, Visual Studio Кордова Ripple Viewer в Windows и Visual Studio Кордова Windows 10 Store App)
(протестировано на мобильных устройствах: Chrome, Firefox, Android Internet Browser и Visual Studio. Приложение Cordova для Android и Visual Studio Cordova Windows 8 + 8.1 + 10 Phone App)
Это HTML-код:
<textarea contenteditable id="textarea"></textarea>
Это код CSS:
textarea {
-webkit-user-select: text !important;
-khtml-user-select: text !important;
-moz-user-select: text !important;
-ms-user-select: text !important;
user-select: text !important;
/*to make sure that background color and text color is not the same (from the answers above)*/
background-color:#fff !important;
color:#733E27 !important;
}
Это код JQuery в готовом документе
$("textarea").click(function() {
setTimeout(function(){
$("textarea").focus();
//add this if you are using JQuery UI (From The Solutions Above)
$("textarea").enableSelection();
var val = $("textarea").val();
if (val.charAt(val.length-1) !== " " && val.length !== 1) {
alert(val.length);
val += " ";
}
$("textarea").val(val);
}, 0);
});
if (navigator.userAgent.indexOf('Safari') !== -1 || navigator.userAgent.indexOf('Chrome') !== -1) {
//alert('Its Safari or chrome');
$("textarea").onfocus(function(e) {
setTimeout(function(){
var end;
if ($("textarea").val === "") {
end = 0;
} else {
end = $("textarea").val.length;
}
if ($("textarea").setSelectionRange) {
var range = document.getElementById('textarea').createTextRange();
if (range) {
setTimeout(range, 0, [end, end]);
} else { // IE style
var aRange = document.getElementById('textarea').createTextRange();
aRange.collapse(true);
aRange.moveEnd('character', end);
aRange.moveStart('character', end);
aRange.select();
}
}
e.preventDefault();
return false;
}, 0);
});
}
Вы можете протестировать его в своем веб-приложении www.gahwehsada.com
Ответ 14
Когда вы говорите
and nope, they don't have attributes: disabled="disabled" or readonly ;-)
Это через просмотр вашего html, исходного кода страницы или DOM?
Если вы проверите DOM с помощью Chrome или Firefox, вы сможете увидеть любые атрибуты, добавленные в поля ввода через javasript или даже оверлейный div
Ответ 15
На всякий случай, если кто-то ищет этот ответ, мы столкнулись с аналогичной проблемой и решили ее, изменив z-индекс входных тегов. По-видимому, некоторые другие divs слишком сильно расширялись и перекрывали поля ввода.
Ответ 16
У меня была эта проблема более 6 месяцев, это может быть одна и та же проблема. Основной признак заключается в том, что вы не можете перемещать курсор или выбирать текст в текстовых вводах, только клавиши со стрелками позволяют перемещаться в поле ввода. Очень неприятная проблема, особенно для полей ввода textarea. У меня есть этот html, который заполняется 1 из 100-х форм через Javascript:
<div class="dialog" id="alert" draggable="true">
<div id="head" class="dialog_head">
<img id='icon' src='images/icon.png' height=20 width=20><img id='icon_name' src='images/icon_name.png' height=15><img id='alert_close_button' class='close_button' src='images/close.png'>
</div>
<div id="type" class="type"></div>
<div class='scroll_div'>
<div id="spinner" class="spinner"></div>
<div id="msg" class="msg"></div>
<div id="form" class="form"></div>
</div>
</div>
Видимо, 6 месяцев назад я попытался сделать всплывающее окно перетаскиваемым и не удалось, одновременно разбив текстовые входы. Как только я удаляю draggable = "true", он снова работает!
Ответ 17
Я нашел еще одну возможную причину этой проблемы, некоторые текстовые поля ввода отсутствовали закрытие "/", поэтому я имел <input ...>
, когда правильная форма <input ... />
. Это исправило это для меня.
Ответ 18
В моем случае это всплывающее окно Bootstrap в открытом состоянии.
Ввод текста был в другом всплывающем окне в верхней части Bootstrap, вход получил его фокус назад после удаления атрибута tabindex="-1"
из Bootstrap modal.
Ответ 19
iPhone6 хром
Проблема для меня заключалась в помещении входного поля внутри <label>
и <p>
вот так:
<label>
<p>
<input/>
</p>
</label>
Я изменил их на
<div>
<div>
<input/>
</div>
</div>
И это работает для меня.
После проверки этого ответа, пожалуйста, проверьте другие ответы на этой странице, этот вопрос может иметь разные причины.
Ответ 20
Это также произойдет в любое время, когда div окажется над элементами управления в другом div; например, используя бутстрап для макета, и имея "col-lg-4", за которым следует "орфографическая ошибка" col-lg = 8... правый сиротский /misnamed div закрывает левый и захватывает события мыши. Легко ударить этим орфографическим шрифтом, - и = рядом друг с другом на клавиатуре. Итак, платит, чтобы исследовать с инспектором и искать "сюрпризы", чтобы раскрыть эти дикие div.
Есть ли невидимое окно, охватывающее элементы управления и блокирующие события, и как это может произойти? Оказывается, жирность = для - с bootstrap classnames является одним из способов...
Ответ 21
У меня была та же проблема. В конце концов я понял это, проверив элемент, и элемент, который, как я думал, выбрал, был другим. Когда я это сделал, я обнаружил, что есть скрытый элемент с z-индексом 9999, после того как я исправил, что моя проблема исчезла.
Ответ 22
проблема для меня заключалась в том, что я использовал class="modal fade"
, я изменил ее на class="modal hide"
. Это решило проблему.
Ответ 23
У меня была та же проблема. В течение многих часов я испытывал мускулы, пытаясь найти всевозможные решения. Оказалось, что это незакрытый тег a. Проверяйте свой HTML-код, решение может быть закрытым тегом, вызывающим проблемы.
Ответ 24
У меня была эта проблема, используя форму загрузки Bootstrap + 7.
По какой-то причине я поместил ярлык в качестве контейнера формы, и это было проблемой не для выбора на мобильном устройстве.
<label>
<contact form>...</contact form>
</label>
Предположим, что все входные данные, кроме первого ввода, будут отправлены и отправлены.
Ответ 25
У меня была та же проблема, и исправление состояло в том, чтобы удалить заполнители, и я изменил дизайн формы, чтобы использовать метки вместо заполнителей...
Ответ 26
У меня была эта проблема, вызванная неким перекрытием элемента div
с начальной загрузкой class ="row"
над элементом "brother" div
с class="col"
, первый скрыл фокус второго элемента div
.
Я решил убрать внешний элемент div row
с этого уровня дерева div и перебалансировать логическую иерархию начальной загрузки на основе классов row
и col
.
Ответ 27
У меня была такая же проблема только сейчас в React.
Я понял, что в роутере, Route. Мы не можем этого сделать, так как это вызывает проблему с закрытием мобильной клавиатуры.
<Route
path = "some-path"
component = {props => <MyComponent />}
/>
Убедитесь, что вместо этого используете рендер в этой ситуации
<Route
path = "some-path"
render = {props => <MyComponent />}
/>
Надеюсь, это поможет кому-то
Даниил