Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery自动完成更改后选择触发?_Javascript_Jquery_Events_Jquery Ui_Jquery Autocomplete - Fatal编程技术网

Javascript jQuery自动完成更改后选择触发?

Javascript jQuery自动完成更改后选择触发?,javascript,jquery,events,jquery-ui,jquery-autocomplete,Javascript,Jquery,Events,Jquery Ui,Jquery Autocomplete,我正在使用(刚刚更新到jQueryUI1.8.1)。每当用户离开文本框时,我希望将文本框的内容设置为已知的良好值,并为所选的值设置一个隐藏的ID字段。此外,当文本框的内容发生更改时,我希望页面能够发回 目前,我通过让autocomplete select事件设置隐藏id来实现这一点,然后在文本框上设置一个更改事件来设置文本框的值,如果需要,还会导致回发 如果用户只使用键盘,这将非常有效。您可以键入、使用向上和向下箭头选择一个值,然后使用tab键退出。触发select事件,设置id,然后触发cha

我正在使用(刚刚更新到jQueryUI1.8.1)。每当用户离开文本框时,我希望将文本框的内容设置为已知的良好值,并为所选的值设置一个隐藏的ID字段。此外,当文本框的内容发生更改时,我希望页面能够发回

目前,我通过让autocomplete select事件设置隐藏id来实现这一点,然后在文本框上设置一个更改事件来设置文本框的值,如果需要,还会导致回发

如果用户只使用键盘,这将非常有效。您可以键入、使用向上和向下箭头选择一个值,然后使用tab键退出。触发select事件,设置id,然后触发change事件,页面发回

如果用户开始键入,然后使用鼠标从自动完成选项中选择,则会触发更改事件(当焦点转移到自动完成菜单时?),页面会在选择事件有机会设置ID之前发回

有没有办法让更改事件在select事件之后才触发,即使使用了鼠标

$(function() {
    var txtAutoComp_cache = {};
    var txtAutoComp_current = { label: $('#txtAutoComp').val(), id: $('#hiddenAutoComp_ID').val() };
    $('#txtAutoComp').change(function() {
        if (this.value == '') { txtAutoComp_current = null; }
        if (txtAutoComp_current) {
            this.value = txtAutoComp_current.label ? txtAutoComp_current.label : txtAutoComp_current;
            $('#hiddenAutoComp_ID').val(txtAutoComp_current.id ? txtAutoComp_current.id : txtAutoComp_current);
        } else {
            this.value = '';
            $('#hiddenAutoComp_ID').val('');
        }
        // Postback goes here
    });
    $('#txtAutoComp').autocomplete({
        source: function(request, response) {
            var jsonReq = '{ "prefixText": "' + request.term.replace('\\', '\\\\').replace('"', '\\"') + '", "count": 0 }';
            if (txtAutoComp_cache.req == jsonReq && txtAutoComp_cache.content) {
                response(txtAutoComp_cache.content);
                return;
            }
            $.ajax({
                url: 'ajaxLookup.asmx/CatLookup',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                data: jsonReq,
                type: 'POST',
                success: function(data) {
                    txtAutoComp_cache.req = jsonReq;
                    txtAutoComp_cache.content = data.d;
                    response(data.d);
                    if (data.d && data.d[0]) { txtAutoComp_current = data.d[0]; }
                }
            });
        },
        select: function(event, ui) {
            if (ui.item) { txtAutoComp_current = ui.item; }
            $('#hiddenAutoComp_ID').val(ui.item ? ui.item.id : '');
        }
    });
});

我不知道如何防止更改事件触发,但您可以在更改事件中轻松抛出一些条件,以确保已设置隐藏字段,并且文本框当前有一个值。

您可以通过将更改事件实现为自动完成选项来解决此问题,就像选择一样,而不是使用jQuery的change()函数


您可以在上查看事件列表。它声明更改事件总是在关闭事件之后触发,我认为这是在选择事件之后触发的。请查看“combobox”的源代码,以查看更改事件挂钩的示例。

当我执行此操作时,它在鼠标选择上对我有效:

focus: function (event, ui) {
                       $j(".tb").val(ui.item.value);
                       return true;
                    }

这会导致文本框文本在鼠标焦点事件中发生更改,就像在键盘事件中发生一样。当我们选择一个项目时,它会触发选择更改。

文本框和隐藏的ID值会从以前的回发中保留下来,因此我看不到一种简单的方法来确定我是否捕获了当前的更改,而不是一些已经处理过的过去的更改。我想问题在于,在不选择项目的情况下退出文本框是有效的,需要与在选择项目时退出文本框分开处理,我无法确定如果更改后触发select,会发生什么情况。除了他不使用自动完成焦点事件,他正在使用jquery更改事件。这是一个最好的答案,为了实现这个策略的更改是必要的。