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

时间:2010-05-16 14:28:06

标签: jquery jquery-ui autocomplete

我想知道在使用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”。

     

响应回调,它要求单个参数包含要向用户建议的数据。应根据提供的术语过滤此数据,并且可以采用上述任何简单本地数据格式(String-Array或带有标签/值/两者属性的Object-Array)。

当响应回调没有收到任何数据时,它会返回一个特殊的单行对象数组,它有一个标签和一个没有数据的指示符(因此select / focus将其识别为无数据返回的指示符) )。

这似乎过于复杂。我更喜欢能够使用一个源:“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,
        });
    }

3 个答案:

答案 0 :(得分:11)

覆盖自动完成对象的response函数可能有效,但这是monkeypatching。使用响应回调很可能是实现所需目标的最简洁方法。

答案 1 :(得分:3)

使用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);
        }
    }
});

以下是我的截图:

enter image description here

答案 2 :(得分:0)

将源代码视为php脚本:

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

$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 );
        }
    };

。 它对我来说非常好。

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

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