2010-04-07 3 views
0

Я использую плагин Autocomplete Jorn Zaefferer на нескольких разных страницах. В обоих случаях порядок отображаемых строк немного испорчен.jQuery Плагин «Autocomplete» испортил порядок моих данных

Пример 1: Массив строк: в основном они расположены в алфавитном порядке для всеобщего сведения, которые были задвинуты на верх, за исключением:

Общие знания, искусства и дизайна, бизнес-исследований, гражданственности, дизайна и технологии, английский , география, история, информационные технологии, математика, MFL французский, MFL немецкий, MFL испанский, музыка, физкультура, PSHE, религиозное образование, наука, Something Else

Отображаемых строки:

Общих знания, география, искусство и Дизайн, исследования бизнеса, гражданство, дизайн и технология, английский, история, ИКТ, математика, M FL Французский, MFL Немецкий, MFL Испанский, Музыка, Физическое воспитание, PSHE, Религиозное образование, Наука, Что-то еще

Обратите внимание, что география была переведена на второй предмет после General Knowledge. Остальное все в порядке.

Пример 2: массив строк: как указано выше, но с перекрестным курсом вместо общего знания.

Обучение, исследования, гражданство, дизайн и технологии, английский, география, история, ИКТ, математика, MFL Французский, MFL Немецкий, MFL Испанский, Музыка, Физическое воспитание, PSHE, Религиозное образование, Наука, Something Else

Отображаемых строки:

междисциплинарный, гражданство, искусство и дизайн, бизнес-исследования, дизайн и технология, английская, география, история, информационные технологии, математика, MFL французский, MFL немецкий, MFL испанских , Музыка, Физическое воспитание, PSHE, Религиозное образование, Наука, Что-то еще

Здесь гражданство было pu пролить в позицию номер 2.

Я немного экспериментировал, и кажется, что есть ошибка, говорящая «положить вещи, которые начинаются с того же письма, что и первый элемент после первого элемента, и оставить остальных в покое». Вид мистификации. Я пробовал немного отладки, вызывая предупреждения внутри кода плагина автозаполнения, но везде, где я вижу, он использует правильный порядок. это похоже на то, когда он вынес, что он идет не так.

Любые идеи кто-нибудь? макс

EDIT - ответ Клинт

Спасибо за указание мне в соответствующий бит кода кстати. Чтобы упростить диагностику, я изменил массив значений на [«морковь», «яблоко», «вишня»], которую автозаполняет, повторно заказывает [«морковь», «вишня», «яблоко»].

Вот массив, который он генерирует для stMatchSets:

stMatchSets = ({ '': [# 1 = {значение: "морковь", данные: [ "морковь"], результат: "морковь"}, # 3 = {значение: "яблоко", данные: ["apple"], результат: "apple"}, # 2 = {значение: "cherry", data: ["cherry"], result: "cherry"}] , c: [# 1 #, # 2 #], a: [# 3 #]})

Итак, он собирает первые буквы вместе в карту, что имеет смысл в качестве стратегии совпадения первого шага. Тем не менее, мне бы хотелось, чтобы он использовал данный массив значений, а не карту, когда дело доходит до заполнения отображаемого списка.Я не могу понять, что происходит с кешем внутри кишки кода (я не очень разбираюсь в javascript).

SOLVED - я исправил это, взломав javascript в плагине.
В строке 549 (или 565) мы возвращаем переменную csub, которая является объектом, содержащим соответствующие данные. Прежде чем он будет возвращен, я переупорядочу его так, чтобы порядок соответствовал исходному массиву значений, которые мы дали, т. Е. Мы использовали для создания индекса в первую очередь, который я поместил в другую переменную:

csub = csub. sort (function (a, b) {return originalData.indexOf (a.value)> originalData.indexOf (b.value);})

hacky, но он работает. Лично я считаю, что это поведение (возможно, более чистое кодирование) должно быть поведением плагина по умолчанию: т. Е. Порядок результатов должен соответствовать исходному переданному массиву возможных значений. Таким образом, пользователь может сортировать свой массив по алфавиту, если они хотят (что тривиально), чтобы получить результаты в алфавитном порядке, или они могут сохранить свой собственный «заказ».

ответ

2

Что я сделал вместо того, чтобы ваше решение было добавить

if (!q && data[q]){return data[q];} 

чуть выше

var csub = []; 

найден в строке ~ 535.

Что это значит, если я правильно понял, это получение кэшированных данных, когда вход пуст, указанный в строке ~ 472: stMatchSets[""] = []. Предполагая, что кэшированные данные, когда вход пуст, являются первыми данными, которые вы предоставили для начала, тогда все это хорошо.

+0

Спасибо snz3, что отлично работает. ура, не более –

1

Я не уверен в этом плагине автозаполнения, в частности, но вы уверены, что это не просто попытка дать вам наилучшее соответствие? Мой плагин автозаполнения делает некоторые эвристики и делает переупорядочение этой природы.

Который подводит меня к моему другому ответу: есть миллион jQuery автозаполнения плагинов там. Если это вас не удовлетворит, я уверен, что есть еще что-то.

Редактировать: Фактически, я полностью уверен, что это то, что он делает. Посмотрите вокруг линии 474:

// loop through the array and create a lookup structure 
for (var i = 0, ol = options.data.length; i < ol; i++) { 
    /* some code */ 

    var firstChar = value.charAt(0).toLowerCase(); 
    // if no lookup array for this character exists, look it up now 
    if(!stMatchSets[firstChar]) 

и так далее. Итак, это особенность.

+0

Спасибо, Клинт, я не уверен, что следую за тобой. Когда текстовое поле пуст, в списке отображаются все предоставленные ему опции. Почему бы им переупорядочить их, чтобы они были разными, и таким странным образом? т.е. «первый данный предмет, другие данные, которые начинаются с того же письма, и все остальные». Каким образом это особенность? Я не иду, я искренне ищу просветления. спасибо, макс. Также, помимо этого странного поведения, я действительно люблю автозаполнение jorn и предпочитаю придерживаться его и исправлять, а не начинать с чего-то еще. –

+0

Я отредактировал свой пост, а не комментарий больше здесь из-за stackoverflow, не имеющий строк в комментариях. –

+0

У вас есть matchContains установлен в true? Если это так, попробуйте отключить это. Если это не даст вам желаемого поведения, вам придется изменить сам код плагина. –

Смежные вопросы