Автозаполнение Jquery запускается после нажатия второй клавиши? - PullRequest
0 голосов
/ 09 января 2012

Я хочу, чтобы автозаполнение работало с каждым текстовым полем, используя атрибут «kolonadi»

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

Как я могу изменить этот код?

Это мой динамический ввод:

<input name="ctl00$MainContent$qtxt_UNVAN" type="text" id="MainContent_qtxt_UNVAN" class="textEntry2 ui-autocomplete-input" kolonadi="UNVAN" style="width:200px;" autocomplete="off" role="textbox" aria-autocomplete="list" aria-haspopup="true">

Это автозаполнение jquery:

$('.textEntry2').keydown(function () {
   alert("keydown enterance"); 
  var kolonadi_ = $(this).attr("kolonadi");

    $(this).autocomplete({
        source: function (request, response) {
            $.ajax({
                url: '<%=ResolveUrl("~/AutoCom.asmx/GetValues") %>',
                data: "{ 'word': '" + request.term + "','KullaniciIndexInGlob':'<%=KullaniciIndexInGlob %>','BaslikId':'<% =BaslikId %>','columnName':'" + kolonadi_ + "'}",
                dataType: "json",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    response($.map(data.d, function (item) {
                        return {
                            label: item.split('-')[0],
                            val: item.split('-')[1]
                        }
                    }))
                },
                error: function (response) {
                    alert(response.responseText);
                },
                failure: function (response) {
                    alert(response.responseText);
                }
            });
        },
        select: function (e, i) {
            $("#<%=hfCustomerId.ClientID %>").val(i.item.val);
        },
        minLength: 1
    });
});

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Я хочу сделать автокомпиляцию каждого текстового поля, используя текстовое поле attr "kolonadi"

Затем вам нужно сделать селектором jQuery , который соответствует этому атрибуту:

$('input[type="text"][kolonadi!=""]').each(function() {
    // ...
});

... когда я нажимаю клавишу в текстовом поле, страница предупреждает меня о "вводе с клавиатуры", но автокомпиляция не работает. Если я нажму еще одну клавишу, она запустится!

Проблема заключается в том, что метод jQuery UI .autocomplete не сразу вызывает раскрывающийся список, как вы думаете. Если вы вызываете его один раз, оно постоянно преобразует поле ввода в поле автозаполнения.

Итак, ваш код проверяет нажатие клавиш, и если он его находит, он превращает текстовое поле в автозаполнение. Затем при втором нажатии клавиши обработчик автозаполнения запускает и , запускается ваш обработчик, и он снова преобразуется в автозаполнение снова .

Просто вызовите .autocomplete непосредственно при загрузке страницы, избавьтесь от обработчика keydown и сделайте это. Вам не нужен ваш собственный обработчик нажатия клавиш, потому что метод .autocomplete вставит свой собственный обработчик нажатия клавиш.

Примерно так:

var textEntry2 = $('.textEntry2');
var kolonadi_ = textEntry2.attr("kolonadi");

textEntry2.autocomplete({
    source: function(request, response) {
        $.ajax({
            url: '<%=ResolveUrl("~/AutoCom.asmx/GetValues") %>',
            data: "{ 'word': '" + request.term + "','KullaniciIndexInGlob':'<%=KullaniciIndexInGlob %>','BaslikId':'<% =BaslikId %>','columnName':'" + kolonadi_ + "'}",
            dataType: "json",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            success: function(data) {
                response($.map(data.d, function(item) {
                    return {
                        label: item.split('-')[0],
                        val: item.split('-')[1]
                    }
                }))
            },
            error: function(response) {
                alert(response.responseText);
            },
            failure: function(response) {
                alert(response.responseText);
            }
        });
    },
    select: function(e, i) {
        $("#<%=hfCustomerId.ClientID %>").val(i.item.val);
    },
    minLength: 1
});
2 голосов
/ 09 января 2012

Редактировать: предыдущий код не работает, необходимо перебрать все входные данные из класса textEntry2.

Вы должны вызывать автозаполнение в функции $(document).ready, а не при каждом нажатии клавиши. Предполагая, что все входы, в которых вы хотите использовать автозаполнение, принадлежат классу textEntry2, вам понадобится что-то вроде:

<script type="text/javascript">
$(document).ready(function(){
    $('input.textEntry2').each(function() {
        var kolonadi_ = $(this).attr("kolonadi");
        $(this).autocomplete(/* do all stuff here */);
    });
});
</script>
...