Я настроил модальное диалоговое окно jQuery UI, которое отображается, когда пользователь нажимает на ссылку. В этом теге div диалогового окна есть два текстовых поля (для краткости я показываю только код 1), и оно заменено на текстовое поле jQuery UI DatePicker, которое реагирует на фокус.
Проблема заключается в том, что диалоговое окно jQuery UI («open») каким-то образом вызывает фокусировку первого текстового поля, а затем немедленно запускает календарь DatePicker.
Поэтому я ищу способ предотвратить фокусировку автоматически.
<div><a id="lnkAddReservation" href="#">Add reservation</a></div>
<div id="divNewReservation" style="display:none" title="Add reservation">
<table>
<tr>
<th><asp:Label AssociatedControlID="txtStartDate" runat="server" Text="Start date" /></th>
<td>
<asp:TextBox ID="txtStartDate" runat="server" CssClass="datepicker" />
</td>
</tr>
</table>
<div>
<asp:Button ID="btnAddReservation" runat="server" OnClick="btnAddReservation_Click" Text="Add reservation" />
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
var dlg = $('#divNewReservation');
$('.datepicker').datepicker({ duration: '' });
dlg.dialog({ autoOpen:false, modal: true, width:400 });
$('#lnkAddReservation').click(function() { dlg.dialog('open'); return false; });
dlg.parent().appendTo(jQuery("form:first"));
});
</script>
javascript
jquery
jquery-ui
slolife
источник
источник
Ответы:
jQuery UI 1.10.0 Список изменений показывает билет 4731 как исправленный.
Похоже, что focusSelector не был реализован, но вместо этого использовался каскадный поиск различных элементов. Из билета:
Итак, пометьте элемент
autofocus
атрибутом, и именно этот элемент должен получить фокус:В документации объясняется логика фокуса (только под оглавлением, под заголовком «Фокус»):
источник
Добавьте скрытый диапазон над ним, используйте ui-helper-hidden-available, чтобы сделать его скрытым путем абсолютного позиционирования. Я знаю, что у вас есть этот класс, потому что вы используете диалог из jquery-ui, а он в jquery-ui.
источник
В jQuery UI> = 1.10.2 вы можете заменить
_focusTabbable
метод-прототип функцией плацебо:скрипка
Это повлияет на все
dialog
s на странице без необходимости редактировать каждый вручную.Оригинальная функция не делает ничего, кроме установки фокуса на первый элемент с
autofocus
атрибутом /tabbable
element / или возврата к самому диалогу. Поскольку его использование - просто установка фокуса на элемент, не должно быть проблем с заменой его на anoop
.источник
$.noop
, замените его функцией, которая записывает активный диалог, затем зарегистрируйте обработчик события глобального ключа, который перехватываетESC
и закрывает «активный» диалог, если он есть.Начиная с jQuery UI 1.10.0, вы можете выбирать, на какой элемент ввода фокусироваться, используя автофокусировку HTML5-атрибута .
Все, что вам нужно сделать, это создать фиктивный элемент в качестве первого ввода в диалоговом окне. Это поглотит фокус для вас.
Это было проверено в Chrome, Firefox и Internet Explorer (все последние версии) 7 февраля 2013 г.
источник
Я нашел следующий код функции диалога JQuery UI для открытия.
Вы можете либо обойти поведение jQuery, либо изменить поведение.
tabindex -1 работает как обходной путь.
источник
focusSelector
опция) должно быть в jQueryUI 1.8, а сейчас мы находимся на 1.8.13, и я не вижу его в документации по диалогу jQueryUI , Что случилось с этим?Просто понял это во время игры.
Я нашел с этими решениями, чтобы удалить фокус, заставил ESCключ перестать работать (то есть закрыть диалог) при первом входе в диалог.
Если диалоговое окно открывается и вы сразу нажимаете ESC , оно не закрывает диалоговое окно (если оно включено), потому что фокус находится на каком-то скрытом поле или чем-то еще, и оно не получает события нажатия клавиши.
Я исправил это, добавив это к событию open, чтобы вместо этого убрать фокус с первого поля:
Это устанавливает фокус на диалоговое окно, которое не отображается, а затем ESCключ работает.
источник
Установите tabindex для ввода в -1, а затем установите dialog.open для восстановления tabindex, если он понадобится вам позже:
источник
Мой обходной путь:
источник
:first
селектор или.first()
в FF / Chrome / IE9. Бросать его вdialogopen
переплет тоже работает.open: function(){ $('a').blur(); // no autofocus on links }
У меня был контент, который был длиннее, чем диалог. При открытии диалоговое окно переходит к первому: вкладка, которая находится внизу. Здесь было мое исправление.
источник
$('...').blur();
вместо прокрутки.Простой обходной путь:
Просто создайте невидимый элемент с tabindex = 1 ... Это не будет фокусировать средство выбора даты ...
например.:
источник
Вот решение, которое я реализовал после прочтения билета jQuery UI # 4731 , первоначально отправленного slolife как ответ на другой ответ. (Билет был также создан им.)
Во-первых, в любой метод, который вы используете для применения автозаполнения к странице, добавьте следующую строку кода:
Это отключает поведение автофокуса в jQuery. Чтобы обеспечить доступность вашего сайта, оберните методы создания диалогов, чтобы можно было добавить дополнительный код, и добавьте вызов для фокусировки на первом элементе ввода:
Чтобы дополнительно рассмотреть доступность, когда параметры автозаполнения выбираются с клавиатуры, мы переопределяем обратный вызов автозаполнения в пользовательском интерфейсе jQuery и добавляем дополнительный код, чтобы гарантировать, что textElement не потеряет фокус в IE 8 после выбора.
Вот код, который мы используем для применения автозаполнения к элементам:
источник
Вы можете предоставить эту опцию, вместо этого сфокусировать кнопку закрытия.
источник
Это может быть поведение браузера, а не проблема с плагином jQuery. Вы пытались удалить фокус программно после открытия всплывающего окна.
Не проверял это, но должно работать хорошо.
источник
Я бы решил ту же проблему и решил ее, вставив пустой ввод перед указателем даты, который крадет фокус при каждом открытии диалога. Этот вход скрыт при каждом открытии диалога и снова отображается при закрытии.
источник
Что ж, круто, что пока никто не нашел решения, но, похоже, у меня есть кое-что для тебя. Плохая новость заключается в том, что диалог захватывает фокус в любом случае, даже если внутри нет входных данных и ссылок. Я использую диалог в качестве всплывающей подсказки, и определенно нужно, чтобы фокус оставался в исходном элементе. Вот мое решение:
используйте опцию [autoOpen: false]
Пока диалог невидим, фокус нигде не установлен и остается на прежнем месте. Он работает для всплывающих подсказок с простым текстом, но не тестируется для более функциональных диалогов, где может быть важно, чтобы диалог был виден в момент открытия. Вероятно, будет работать нормально в любом случае.
Я понимаю, что первоначальный пост был просто для того, чтобы не фокусироваться на первом элементе, но вы можете легко решить, где должен быть фокус после открытия диалога (после моего кода).
Проверено в IE, FF и Chrome.
Надеюсь, это кому-нибудь поможет.
источник
На мой взгляд, это решение очень приятно:
Найдено здесь: невозможно удалить автофокус-в-UI-диалоге
источник
У меня аналогичная проблема. Я открываю диалоговое окно с ошибкой, когда проверка не проходит, и она захватывает фокус, как это показывает Флуган в своем ответе . Проблема в том, что даже если ни один элемент внутри диалога не является вкладкой, само диалоговое окно все еще находится в фокусе. Вот оригинальный унифицированный код из jquery-ui-1.8.23 \ js \ jquery.ui.dialog.js:
Комментарий их!
Это действительно плохо для меня по нескольким причинам. Самое неприятное, что первая реакция пользователя состоит в том, чтобы нажать клавишу «Backspace», чтобы удалить последний символ, но вместо этого ему предлагается покинуть страницу, потому что «Backspace» попадает за пределы элемента управления вводом.
Я обнаружил, что следующий обходной путь работает очень хорошо для меня:
источник
Я искал другую проблему, но ту же причину. Проблема в том, что диалог устанавливает фокус на первое,
<a href="">.</a>
что находит. Поэтому, если в вашем диалоговом окне много текста и появляются полосы прокрутки, может возникнуть ситуация, когда полоса прокрутки будет прокручена вниз. Я считаю, что это также решает вопрос от первого лица. Хотя другие делают так же.Простое, легко понять, исправить.
<a id="someid" href="#">.</a>
как первая строка в вашем диалоге div.ПРИМЕР:
Где ваш диалог начинается
Выше не будет ничего сфокусировано, и полосы прокрутки останутся наверху, где он принадлежит.
<a>
Получает фокус , но затем скрыт. Так что общий эффект - это желаемый эффект.Я знаю, что это старая ветка, но что касается документации по пользовательскому интерфейсу, это не исправить. Это не требует размытия или фокусировки для работы. Не уверен, что это самый элегантный. Но это просто имеет смысл и легко объяснить кому угодно.
источник
Если у вас есть только одно поле в форме диалога Jquery, и именно оно требует Datepicker, в качестве альтернативы, вы можете просто установить фокус на диалоговом окне Закрыть (крестик) в строке заголовка диалога:
Вызов этого ПОСЛЕ диалога был инициализирован, например:
Потому что кнопка закрытия отображается после вызова
.dialog()
.источник
Если вы используете диалоговые кнопки, просто установите
autofocus
атрибут на одну из кнопок:источник
У меня та же проблема.
Обходной путь, который я сделал, - добавление пустого текстового поля в верхней части диалогового контейнера.
источник
Как уже упоминалось, это известная ошибка в jQuery UI, которая должна быть исправлена относительно скоро. До тех пор...
Вот еще один вариант, так что вам не нужно связываться с tabindex:
Временно отключите средство выбора даты, пока не откроется диалоговое окно:
Работает для меня.
Повторяющийся вопрос: как размыть первый ввод формы при открытии диалога
источник
Чтобы раскрыть некоторые из предыдущих ответов (и игнорировать аспект вспомогательного средства выбора даты), если вы хотите, чтобы
focus()
событие не фокусировалось на первом поле ввода при открытии диалогового окна, попробуйте следующее:источник
У меня была похожая проблема, и я решил ее, сосредоточившись на диалоге после открытия:
Но в моем случае первый элемент - это якорь, поэтому я не знаю, если в вашем случае это оставит открытым указатель даты.
РЕДАКТИРОВАТЬ: работает только на IE
источник
найти в jquery.ui.js
и заменить на
источник
Выпущена jQuery 1.9, и, похоже, исправления нет. Попытка предотвратить фокусировку первого текстового поля некоторыми из предложенных методов не работает в 1.9. Я думаю, потому что методы пытаются размыть фокус или переместить фокус, ПОСЛЕ того, как текстовое поле в диалоге уже получило фокус и сделало свою грязную работу.
Я не вижу ничего в документации API, которая заставляет меня думать, что что-то изменилось с точки зрения ожидаемой функциональности. Выкл, чтобы добавить кнопку открывания ...
источник
У меня была похожая проблема. На моей странице первым вводом является текстовое поле с календарем пользовательского интерфейса jQuery. Второй элемент - кнопка. Поскольку дата уже имеет значение, я установил фокус на кнопку, но сначала добавляю триггер для размытия в текстовом поле. Это решает проблему во всех браузерах и, вероятно, во всех версиях jQuery. Протестировано в версии 1.8.2.
источник
Это действительно важно для смартфонов и планшетов, потому что клавиатура появляется, когда фокус ввода фокусируется. Это то, что я сделал, добавьте этот ввод в начале div:
Не работает с размером
0px
. Я думаю, что это даже лучше с настоящим прозрачным изображением,.png
или.gif
я не пробовал.Работает нормально до сих пор в iPad.
источник
Вы можете добавить это:
...
...
источник
в качестве первого ввода:
<input type="text" style="position:absolute;top:-200px" />
источник