使用jQuery.UI自动完成文本框

时间:2011-07-19 12:07:17

标签: jquery jquery-ui jquery-ui-autocomplete


我正在尝试使用jQuery.UI库。使用这个库可以很容易地开发Web界面。我指的是使用“远程JSONP数据源”自动完成的文档和演示Here

这是将数据从远程源传输到自动填充文本框的完整代码。

$(function() {
        function log( message ) {
            $( "<div/>" ).text( message ).prependTo( "#log" );
            $( "#log" ).attr( "scrollTop", 0 );
        }

        $( "#city" ).autocomplete({
            source: function( request, response ) {
                $.ajax({
                    url: "http://ws.geonames.org/searchJSON",
                    dataType: "jsonp",
                    data: {
                        featureClass: "P",
                        style: "full",
                        maxRows: 12,
                        name_startsWith: request.term
                    },
                    success: function( data ) {
                        response( $.map( data.geonames, function( item ) {
                            return {
                                label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                                value: item.name
                            }
                        }));
                    }
                });
            },
            minLength: 2,
            select: function( event, ui ) {
                log( ui.item ?
                    "Selected: " + ui.item.label :
                    "Nothing selected, input was " + this.value);
            },
            open: function() {
                $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
            },
            close: function() {
                $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
            }
        });
    });

我想知道以下代码段的确切功能。

success: function( data ) { 
    response( $.map( data.geonames, function( item ) {
       return {
        label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
        value: item.name
        }
    }));
}

特别是

  

$ .map(data.geonames,function(item)

提前致谢

1 个答案:

答案 0 :(得分:2)

这是一段有趣的代码。

小部件需要一个对象数组,其中每个对象都具有属性label和/或value。该代码试图创建的是一个看起来像这样的数组。

因此,调用$.map(这是一个非常有用的实用函数)正在将从JSONP调用中检索到的对象数组转换为上述格式的对象数组。

阅读本文的一种方法:

$.map( data.geonames, function( item ) {
       return {
        label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
        value: item.name
}

将是:“通过获取data.geonames数组的每个元素并使用给定函数转换元素来创建新数组”

在这种情况下,该函数只是构建一个具有labelvalue属性的对象,以便它可以与自动完成小部件一起使用。

然后,新数组立即作为参数传递给response函数。