Автозаполнение jQuery-UI не отображается в диалоговом окне jQuery-UI
У меня есть автозаполнение jQueryUI, которое находится в диалоговом окне. Для некоторых старых версий jQuery/jQueryUI он отображает список возвращаемых значений, а для новейших версий - нет. Кроме того, я работаю правильно на странице с кучей других вещей, идущих даже с новой версией jQuery/jQueryUI, которая, похоже, не играет хорошо. Очевидно, что у меня что-то происходит, но это не так, но я не могу определить, что это такое. Я понимаю, что я могу использовать css для изменения z-индекса, но это кажется немного немного хакерским.
Пожалуйста, ознакомьтесь со следующими двумя живыми примерами.
http://jsbin.com/uciriq/3/ (использует jQuery 1.4.3 и jQueryUI 1.8.4)
http://jsbin.com/uciriq/2/ (использует jQuery 1.9.1 и jQueryUI 1.10.3)
Как видно (или более применимо заявлено "не видно" ), возвращаемые автозавершения соответствуют jQuery 1.9.1/jQueryUI 1.10.3 отображаются за диалогом.
Какое наилучшее решение позволяет отображать возвращенные совпадения автозаполнения?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>autocomplete with dialog</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
<link href="#" onclick="location.href='http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/ui-lightness/jquery-ui.css'; return false;" type="text/css" rel="stylesheet" />
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.js" type="text/javascript"></script>
<!--
<link href="#" onclick="location.href='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css'; return false;" type="text/css" rel="stylesheet" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.js" type="text/javascript"></script>
-->
<script type="text/javascript">
$(function() {
$( "#search" ).autocomplete({
source: [ "one", "two", "three" ]
});
$("#dialog").dialog();
});
</script>
</head>
<body>
<div id="dialog" class="dialog" title="Testing">
<div class="ui-widget">
<label for="search">one, two, three: </label>
<input id="search" />
</div>
</div>
</body>
</html>
РЕДАКТИРОВАТЬ Я считаю, что изменения в диалоговом окне jQueryUI, описанные http://jqueryui.com/upgrade-guide/1.10/ и дублированные ниже, являются причиной моих проблем. Я не уверен, как наилучшим образом их применять, и был бы признателен за любые советы.
Добавлена опция appendTo (# 7948). Ранее диалоги всегда добавлялись в тело, чтобы гарантировать, что они были последним элементом в DOM, чтобы избежать конфликтов с другими контекстами стекирования. Однако, чтобы обеспечить большую гибкость и упростить логику стекирования, добавлена опция appendTo, которая по умолчанию соответствует телу. Ознакомьтесь с документацией API для получения дополнительной информации.
Удаленная опция стека (# 8722). Диалоги ранее поддерживали опцию стека, которая определяла, должны ли диалоги перемещаться вверху при фокусировке. Поскольку это всегда должно быть, opiton был удален.
Убрана опция zIndex (# 8729) Аналогично опции стека опция zIndex не нужна при правильной реализации стекирования. Z-индекс определен в CSS, и теперь управление стеками контролируется тем, что сфокусированное диалоговое окно является последним элементом "stacking" в его родительском элементе.
Ответы
Ответ 1
Измените свой код, чтобы сначала создать диалог, а затем выполните автоматическое завершение. например.
$(function()
{
$("#dialog").dialog();
$( "#search" ).autocomplete({
source: [ "one", "two", "three" ]
});
});
Затем он должен работать правильно, позволяя вам видеть результаты автозаполнения.
Ответ 2
Еще один хакерский ответ. Используйте CSS вместо jQuery для изменения дочернего элемента проблемы.
.ui-autocomplete {z-index:1000}
http://jsbin.com/uciriq/6/edit
Ответ 3
Вы правильно поняли, что z-index/appendTo имеют какое-то отношение к вашей проблеме.
вам нужно установить appendTo-option автозаполнения в элемент внутри диалогового окна, после чего автоматически будет отображаться автозаполнение.
caveat: Если список результатов больше, чем доступное пространство внутри диалогового окна, вы получите полосу прокрутки.
Я отредактировал ваш jsbin, чтобы отразить это: http://jsbin.com/vavevugoqi/
JS:
$( "#search" ).autocomplete({
appendTo: "#myContainer",
source: [ "one", "two", "three" ]
});
HTML:
<div id="dialog" class="dialog" title="Testing">
<div id="myContainer" class="ui-widget">
<label for="search">one, two, three: </label>
<input id="search" />
</div>
</div>
PS: Sry, чтобы выкопать такой старый вопрос, но я думаю, что это может помочь некоторым людям приехать сюда из Google (как и я).
Ответ 4
Или для другого хакерского ответа, вы можете использовать jQuery для перемещения z-позиции. Надеюсь, кто-то придумает лучший ответ, чем мои два.
$("#search").autocomplete("widget").css('z-index',1000);
http://jsbin.com/uciriq/5/
Ответ 5
Изменение z-индекса работает только при первом открытии раскрывающегося списка, после закрытия диалоговое окно понимает, что оно "обмануто" и обновляет свой z-индекс.
Кроме того, для меня изменение порядка создания диалога и автозаполнения действительно было проблемой (думаю, большой веб-сайт, тонны страниц), но случайно у меня была собственная функция openPopup, которая завернула openDialog. Поэтому я придумал следующий хак
$("#dialog").dialog({ focus: function () {
var dialogIndex = parseInt($(this).parent().css("z-index"), 10);
$(this).find(".ui-autocomplete-input").each(function (i, obj) {
$(obj).autocomplete("widget").css("z-index", dialogIndex + 1)
});
});
Каждый раз, когда диалог имеет фокус, то есть при первом открытии и при закрытии автозаполнения, обновляется каждый z-index списка автозаполнения.
Ответ 6
Не знаю, является ли это лучшим ответом, но вы можете переместить результаты автозаполнения после диалога.
$("#search").autocomplete("widget").insertAfter($("#dialog").parent());
http://jsbin.com/uciriq/4/
Ответ 7
Это показано в версиях интерфейса JQuery >= 11.0.0.
Билет отправлен здесь: http://bugs.jqueryui.com/ticket/10696
Изменить: Обновленный номер билета