Script.aculo.us Проблема автозаполнения в IE

Я борюсь с проблемой с элементом управления Script.aculo.us Autocompleter в IE (я пробовал его в IE6 и 7). Предложения не появляются для первого символа, вводимого в текстовое поле после загрузки страницы. После этого первоначального сбоя система управления работает должным образом.

Я проверил, что данные предложений возвращаются с сервера правильно; проблема, по-видимому, как-то связана с позиционированием элемента предложений, поскольку другие относительно позиционированные элементы на странице сдвигаются с места в тот момент, когда вы ожидаете появления предложений.

Кто-нибудь слышал о такой проблеме или есть предложения, как ее исправить?

Обновлено: в ответ на Криса я установил для параметра partialChars значение 1, и элемент управления работает во всех других браузерах, которые я пробовал, а именно последних версиях Firefox, Safari, Opera и Chrome. Наверное, я должен был это в первую очередь прояснить. Спасибо.

Это тоже была моя проблема, спасибо! Голосовать всем и всем! Теперь я собираюсь сыграть в заслуженный пинг-понг.

Peter Seale 19.09.2009 00:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
6 014
6

Ответы 6

Ваша проблема только в 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 Проблема исчезновения автозаполнения.

Другие вопросы по теме