Я борюсь с проблемой с элементом управления Script.aculo.us Autocompleter в IE (я пробовал его в IE6 и 7). Предложения не появляются для первого символа, вводимого в текстовое поле после загрузки страницы. После этого первоначального сбоя система управления работает должным образом.
Я проверил, что данные предложений возвращаются с сервера правильно; проблема, по-видимому, как-то связана с позиционированием элемента предложений, поскольку другие относительно позиционированные элементы на странице сдвигаются с места в тот момент, когда вы ожидаете появления предложений.
Кто-нибудь слышал о такой проблеме или есть предложения, как ее исправить?
Обновлено: в ответ на Криса я установил для параметра partialChars значение 1, и элемент управления работает во всех других браузерах, которые я пробовал, а именно последних версиях Firefox, Safari, Opera и Chrome. Наверное, я должен был это в первую очередь прояснить. Спасибо.





Ваша проблема только в IE или во всех браузерах? Игнорирование первого символа фактически является значением по умолчанию для автозаполнения. В controls.js есть класс Autocompleter.Local, в котором есть поле partialChars, значение которого по умолчанию равно 2. В документации для этого поля говорится:
// - partialChars - Сколько символов ввести перед срабатыванием
// частичное совпадение (в отличие от minChars, которое определяет
// сколько символов требуется для любого соответствия
// совсем). По умолчанию 2.
Я до сих пор не знаю, что именно вызвало эту проблему, но мне удалось придумать способ ее обойти. Идея состоит в том, чтобы выполнить обработку, которая обычно вызывает сбой при вводе первого символа при загрузке страницы, чтобы убрать его с пути:
new Ajax.Autocompleter(textInputId, suggestionsHolderId, suggestionsUrl, params);
//Hack
Event.observe(window, 'load', function()
{
try
{
Position.clone($(textInputId), $(suggestionsHolderId),
{ setHeight: false, offsetTop: $(textInputId).offsetHeight});
}
catch(e){}
});
У меня действительно такая же проблема. Проблема возникает только в IE (также в бета версии 8.0).
И Firefox, и Chrome, которые я пробовал, не имеют никаких проблем.
По мнению других, это связано с объявлением DOCTYPE в файле HTML. Отметьте здесь: http://prototype.lighthouseapp.com/projects/8887/tickets/32-ajax-autocomplete-in-ie-with-doctype
Баг также получил тикет на досках разработчиков ruby: http://dev.rubyonrails.org/ticket/11051
По обеим ссылкам есть решения для устранения проблемы.
Надеюсь, ошибка будет исправлена в следующей версии prototype / scriptaculous :)
Большое спасибо за взлом. Я сам использовал это, но изменил его, поэтому он вызывается только при использовании Ajax.Autocompleter, выполнив следующие действия.
function positionAuto(element, entry) {
setTimeout( function() {
Element.clonePosition('choices_div', 'text_element', {
'setWidth': false,
'setHeight': false,
'offsetTop': $('text_element').offsetHeight
} );
}, 300);
return entry;
}
new Ajax.Autocompleter('text_element', 'choices_div', [url to web service], {
paramName: 'fulltext',
minChars: 2,
callback: positionAuto, // See above
[etc...]
Поскольку обратный вызов вызывается непосредственно перед выполнением реального запроса, размещение DIV именно в этот момент имеет наибольший смысл. И убедитесь, что даже если размер окна изменяется или прокручивается, DIV расположен правильно. Что меня бесит, так это то, что чтобы заставить его работать стабильно, мне пришлось заключить его в «setTimeout ()». Я не очень много экспериментировал с различными настройками времени, но если есть более низкий порог тайм-аута, который работает, я хотел бы знать.
Протестировано на IE 8 и 7 и работает очень хорошо. И работает с другими настоящими браузерами. Надеюсь, это избавит некоторых программистов от головной боли при работе с этим.
Это известная ошибка исправления, которая работает, но еще не включена. Подробнее об этом можно прочитать здесь: https://prototype.lighthouseapp.com/projects/8886-prototype/tickets/618-getoffsetparent-returns-body-for-new-hidden-elements-in-ie8-final#ticket-618-9
После долгой борьбы с этой проблемой в IE8 / IE9 я в конечном итоге использовал хакерство CSS. Метод здесь состоит в том, чтобы принудительно позиционировать относительное положение внутри контейнера с абсолютным позиционированием. Дополнительный контейнер необходим для того, чтобы сделать выбор над другими элементами.
div.acwrap {
position: absolute;
height: 40px;
}
div.autocomplete {
position: relative !important;
top: -5px !important;
left: 0px !important;
width:250px;
margin:0;
padding:0;
}
В своем HTML-коде я использовал классы следующим образом:
<div class = "acwrap">
<div id = "autocomplete_choices" class = "autocomplete">
</div>
</div>
Идея зародилась здесь: Scriptaculous / Prototype IE 8 Проблема исчезновения автозаполнения.
Это тоже была моя проблема, спасибо! Голосовать всем и всем! Теперь я собираюсь сыграть в заслуженный пинг-понг.