jQueryUI 自动完成 - 当没有结果返回时

Posted

技术标签:

【中文标题】jQueryUI 自动完成 - 当没有结果返回时【英文标题】:jQueryUI autocomplete - when no results are returned 【发布时间】:2011-02-20 02:35:33 【问题描述】:

我想知道如何在使用jQueryUI autocomplete 时从服务器返回空结果时捕获并添加自定义处理程序。

在这一点上似乎有一些与各种 jQuery 插件相关的问题(例如 jQuery autocomplete display “No data” error message when results empty),但我想知道是否有更好/更简单的方法来实现 jQueryUI 自动完成功能。

在我看来这是一个常见的用例,我想也许 jQueryUI 通过添加干净处理这种情况的能力来改进 jQuery 自动完成功能。但是,我一直无法找到此类功能的文档,在我破解它之前,我想先试探一下,以防其他人以前看到过。

虽然可能不是特别有影响力,但我可以让服务器返回任何内容 - 例如HTTP 204: No Content 到一个 200/JSON 的空列表 - 任何最容易在 jQueryUI 的自动完成中捕获结果的方法。

我的第一个想法是根据文档传递一个带有两个参数的回调,即一个请求对象和一个 response callback 来处理代码:

第三种变体,回调,提供了最大的灵活性,可用于将任何数据源连接到自动完成。回调有两个参数:

一个请求对象,具有一个名为“term”的属性,它指的是文本输入中当前的值。例如,当用户在城市字段中输入“new yo”时,自动填充词将等于“new yo”。

一个响应回调,它需要一个参数来包含要向用户建议的数据。此数据应根据提供的术语进行过滤,并且可以采用上述任何简单本地数据的格式(字符串数组或具有标签/值/两个属性的对象数组)。

当响应回调没有接收到数据时,它插入返回一个特殊的单行对象数组,其中包含一个标签和一个没有数据的指示符(因此选择/焦点将其识别为没有数据返回的指示符)。

这似乎过于复杂。我希望能够使用源:“http://...”,并且只是在某处有一个回调,表明没有返回数据。

感谢您的阅读。

布赖恩

编辑:

这是我创建的一个包装函数来解决这个问题,基于@ThiefMaster 保证这是正确的解决方法:

    function autocomplete(input, source_url, on_select, on_focus, default_data) 
        /* Autocompletion for an input field
         * input: the field for autocompleting
         * source_url: the JSON url for getting data
         * on_select: function (event,ui) - when someone selects an element
         * on_focus: function (event, ui) - when someone focuses an element
         * default_data: function () returning default data; alternatively is the
         *               default dataset e.g. 'label':'X','value':'Y'
         */

        $(input).autocomplete(
            source: function (request, response) 
                $.ajax(
                    url: source_url,
                    dataType: "json",
                    data: request,
                    success: function (data) 
                        if (!data.length)  // expect [] or ""
                            var def_data = typeof(default_data) == 'function' ?
                                default_data() : default_data;
                            response(def_data);
                         else 
                            response(data);
                        
                    
                );
            ,
            minLength: 3,
            select: on_select,
            focus: on_focus,
        );
    

【问题讨论】:

这里有一个很棒的方法:来自 Andrew Whittaker 的***.com/questions/4718968/… 解释得很好,很贴心。 Detecting no results on jQuery UI autocomplete 的可能副本 【参考方案1】:

覆盖自动完成器对象的response 函数可能有效,但这是猴子补丁。使用响应回调很可能是实现您想要的最简洁的方法。

【讨论】:

【参考方案2】:

response 选项很容易处理

$( 'input.Srch' ).autocomplete(
    minLength: 3,
    .......
    response: function(event, ui) 
        if (!ui.content.length) 
                var noResult =  value:"",label:"No results found" ;
                ui.content.push(noResult);
        
    
);

这是我的截图:

【讨论】:

【参考方案3】:

将源视为 php 脚本:

我在代码中所做的是我从 php 脚本返回 NO 结果消息,例如

$ArrayMe =  Array();
if(rows found)
  array_push( $ArrayMe ,array('key1'=> $val1, 'key2'=> $val2, 'key3'=> $val3));
 else 
 array_push( $ArrayMe ,array("message"=>"No results found" ));

echo json_encode($ArrayMe);

来自 jquery:

 $( "input#val1" ).autocomplete(
        minLength: 2,

        source:function (request, response) 
        $.ajax(
                type: 'get',
                url: "path/to/phpscript.php",
                dataType: "json",
                data:  term: request.term ,
                success: function(data) 
                        response($.map(data, function (value) 
                            if(value.message)
                                console.log(value.message);
                                $('p#val2').html("");
                                $('p#val3').html("");
                                return Message: value.message
                            else 
                                return 
                                    key1: value.val1,
                                    key2: value.val2,
                                    key3: value.val3

                                
                           
                        ));
                       
                );
   ,  
        focus: function( event, ui ) 
            $( "input#val1" ).val( ui.item.val1);
            $( "p#val2" ).html( ui.item.val2);
            $( "p#val2" ).html( ui.item.val3);
            return false;
        ,
        select: function( event, ui ) 
            $( "input#val1" ).val( ui.item.val1);

            $( "p#val2" ).html( ui.item.val2);
            $( "p#val3" ).html( ui.item.val3);


            return false;
        
    ).autocomplete( "instance" )._renderItem = function( ul, item ) 
        if(item.Message)
            return $( "<li>" )
                .append( "<div>" + item.Message +"</div>" )
                .appendTo( ul );
         else
            return $( "<li>" )
                .append( "<div>" + item.val1+ " | " + item.val2+  " | " + item.val3+"</div>" )
                .appendTo( ul );
        
    ;

。 它对我来说非常好。

如果没有数据得到消息以及触发必填字段。

我的解释很差,所以我发布了整个代码以使其更容易。

【讨论】:

以上是关于jQueryUI 自动完成 - 当没有结果返回时的主要内容,如果未能解决你的问题,请参考以下文章

当 React Material UI 中的 TextField 中存在值时自定义自动完成 CSS

jQuery UI 自动完成 - 没有结果消息

如何自定义返回的 jQuery UI 自动完成列表

在 jQuery UI 自动完成中限制结果

JqueryUI 自动完成错误:未捕获的 TypeError:对象#<Object> 的属性“结果”不是函数

JQueryUI 自动完成结果未显示,但出现在 DevTools 中