.keyup event альтернатива

У меня есть простой тест автозаполнения, который работает с жестко закодированными данными.

Однако, когда я добавляю свои данные (который содержит более 1000 данных), он не работает и отображает только первую букву, поэтому, если мои данные "Apple"

когда я набираю B - он показывает Банану, но я не могу набрать "BA", поскольку "A" исчезает.

Я ожидал, что я могу написать целое слово, а не первую букву.

Это рабочий код:

 var validOptions = ["Bold", "Normal", "Default", "100", "200"]
previousValue = "";

$('#ac').autocomplete({
autoFocus: true,
source: validOptions
})
.keyup(function() {
var isValid = false;
for (i in validOptions) {
    if (validOptions[i].toLowerCase().match(this.value.toLowerCase())) {
        isValid = true;
    }
    }
    if (!isValid) {
     this.value = previousValue
} else {
    previousValue = this.value;
}
});

Значит, эти буквы: жирный "," нормальный "," по умолчанию "," 100 "," 200 ". НО

Как только я изменяю validOptions на:

var validOptions ='@Url.Action("SerialProdNumStockSiteAutoComplete", "Ajax")?stocksitenum=LW&model=' + $("#Form_Prod_Num").val();

Он не работает так, как должен.

есть ли другой способ сделать это, или вы знаете, где я ошибаюсь.

Этот вопрос касается альтернативы .keyup

Код SerialProdNumStockSiteAutoComplete:

         public JsonResult SerialProdNumStockSiteAutoComplete(string term,string stocksitenum,string model)
    {
        return Json(AutoComplete.DeviceFromStockSite(term, stocksitenum, model), JsonRequestBehavior.AllowGet);
    }

Устройство со склада:

 public static List<string> DeviceFromStockSite(string term, string stocksitenum, string model)
    {
        //devices will always come from serialised stock
        var qryStock =
            SC42Ctx.SPNlocs
                .Where(x => x.Nloc_Site_Num.StartsWith(stocksitenum)
                            && x.Nloc_Part_Num == model
                            && x.Nloc_Ord_Num == null)
                .Select(
                    s =>
                        new TicketSerialNumber
                        {
                            SerialNumber = s.Nloc_ID_Num,
                            Source = stocksitenum,
                            Call = s.Nloc_Ord_Num.ToString()
                        })
                .ToList();

Когда я копирую URL-адрес, это показывает:

http://localhost:58172/Ajax/SerialProdNumStockSiteAutoComplete?stocksitenum=LW&model=MP4000BADP&term=4&_=1433235435372

Это было, когда я ввел 4 и не смог добавить ничего другого

Ответ 1

Try using the minLength option of autocomplete to specify the minimum number of characters: 

$('#ac').autocomplete({
autoFocus: true,
source: validOptions,
minLength: 3
})
.keyup(function() {
var isValid = false;
for (i in validOptions) {
    if (validOptions[i].toLowerCase().match(this.value.toLowerCase())) {
        isValid = true;
    }
    }
    if (!isValid) {
     this.value = previousValue
} else {
    previousValue = this.value;
}
});

Ответ 2

Этот код является виновником:

 if (!isValid) {
     this.value = previousValue
} else {
    previousValue = this.value;
}

То, что он говорит, похоже на то, что значение не соответствует, оно не позволит вам ввести это значение.

Обновите свой код как:

$(document).ready(function () {
    var validOptions = ["Bold", "Normal", "Default", "100", "200"]
    previousValue = "";

    $('#ac').autocomplete({
        autoFocus: true,
        source: validOptions
    })
        .keyup(function () {
        var isValid = false;
        for (i in validOptions) {
            if (validOptions[i].toLowerCase().match(this.value.toLowerCase())) {
                isValid = true;
            }
        }

    });
});

Ответ 3

альтернатива .keyup

показать ошибку, когда пользователи вводят что-то другое, кроме данных из автоматического завершения

Кажется, что вы хотите использовать событие Response http://api.jqueryui.com/autocomplete/#event-response.

Запуск после завершения поиска, прежде чем отобразится меню. Полезно для локального манипулирования данными предложения... Это событие всегда срабатывает, когда поиск завершается, даже если меню не будет отображаться, потому что результатов нет...

Это не будет работать на скрипке с жестко закодированными данными, поскольку это применимо только при использовании URL-адреса для поиска (который вы хотите).

..keyup не работает, как это происходит до завершения поиска:

Когда вы используете жестко кодированные данные (в зависимости от скрипта), все в порядке, но когда вы меняете, чтобы источник был URL-адресом, URL-адрес вызывается (поиск выполняется) автозаполнением (может быть подтвержден просмотром сети в консоль браузера) - это занимает короткое время асинхронно, в то время как .keyup происходит (как хорошо) сразу. Вы можете подтвердить это, добавив Thread.Sleep() в ваше действие и различные console.log в js.

Ответ 4

Правильно, я нашел ответ

Что-то простое:

var source = validOptions;
            var found = $('.ui-autocomplete li').text().search(source);
            console.debug('found:' + found);
            if (found < 0) {
                $(this).val('');
                alert("please select from auto complete");
            }