jQuery UI 实例 – 自动完成(Autocomplete)

根据用户输入值进行搜索和过滤,让用户快速找到并从预设值列表中选择。

如需了解更多有关 autocomplete 部件的细节,请查看 API 文档 自动完成部件(Autocomplete Widget)。

本章节使用到 search.php 下载。

默认功能

当您在输入域中输入时,自动完成(Autocomplete)部件提供相应的建议。在本实例中,提供了编程语言的建议选项,您可以输入 \”ja\” 尝试一下,可以得到 Java 或 JavaScript。

数据源是一个简单的 JavaScript 数组,使用 source 选项提供给部件。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 默认功能</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <script>
  $(function() {
    var availableTags = [
      \"ActionScript\",
      \"AppleScript\",
      \"Asp\",
      \"BASIC\",
      \"C\",
      \"C++\",
      \"Clojure\",
      \"COBOL\",
      \"ColdFusion\",
      \"Erlang\",
      \"Fortran\",
      \"Groovy\",
      \"Haskell\",
      \"Java\",
      \"JavaScript\",
      \"Lisp\",
      \"Perl\",
      \"PHP\",
      \"Python\",
      \"Ruby\",
      \"Scala\",
      \"Scheme\"
    ];
    $( \"#tags\" ).autocomplete({
      source: availableTags
    });
  });
  </script>
</head>
<body>
 
<div>
  <label for=\"tags\">标签:</label>
  <input>
</div>
 
 
</body>
</html>

包含重音

autocomplete 域使用自定义的 source 选项来匹配带有重音字符的结果项,即使文本域不包含重音字符也会匹配。但是如果您在文本域中键入了重音字符,则不会显示非重音的结果项。

尝试键入 \”Jo\”,会看到 \”John\” 和 \”Jörn\”,然后 键入 \”Jö\”,只会看到 \”Jörn\”。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 包含重音</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <script>
  $(function() {
    var names = [ \"Jörn Zaefferer\", \"Scott González\", \"John Resig\" ];
 
    var accentMap = {
      \"á\": \"a\",
      \"ö\": \"o\"
    };
    var normalize = function( term ) {
      var ret = \"\";
      for ( var i = 0; i < term.length; i++ ) {
        ret += accentMap[ term.charAt(i) ] || term.charAt(i);
      }
      return ret;
    };
 
    $( \"#developer\" ).autocomplete({
      source: function( request, response ) {
        var matcher = new RegExp( $.ui.autocomplete.escapeRegex( request.term ), \"i\" );
        response( $.grep( names, function( value ) {
          value = value.label || value.value || value;
          return matcher.test( value ) || matcher.test( normalize( value ) );
        }) );
      }
    });
  });
  </script>
</head>
<body>
 
<div>
  <form>
  <label for=\"developer\">开发人员:</label>
  <input>
  </form>
</div>
 
 
</body>
</html>

分类

分类的搜索结果。尝试键入 \”a\” 或 \”n\”。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 分类</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  .ui-autocomplete-category {
    font-weight: bold;
    padding: .2em .4em;
    margin: .8em 0 .2em;
    line-height: 1.5;
  }
  </style>
  <script>
  $.widget( \"custom.catcomplete\", $.ui.autocomplete, {
    _renderMenu: function( ul, items ) {
      var that = this,
        currentCategory = \"\";
      $.each( items, function( index, item ) {
        if ( item.category != currentCategory ) {
          ul.append( \"<li class=\'ui-autocomplete-category\'>\" + item.category + \"</li>\" );
          currentCategory = item.category;
        }
        that._renderItemData( ul, item );
      });
    }
  });
  </script>
  <script>
  $(function() {
    var data = [
      { label: \"anders\", category: \"\" },
      { label: \"andreas\", category: \"\" },
      { label: \"antal\", category: \"\" },
      { label: \"annhhx10\", category: \"Products\" },
      { label: \"annk K12\", category: \"Products\" },
      { label: \"annttop C13\", category: \"Products\" },
      { label: \"anders andersson\", category: \"People\" },
      { label: \"andreas andersson\", category: \"People\" },
      { label: \"andreas johnson\", category: \"People\" }
    ];
 
    $( \"#search\" ).catcomplete({
      delay: 0,
      source: data
    });
  });
  </script>
</head>
<body>
 
<label for=\"search\">搜索:</label>
<input>
 
 
</body>
</html>

组合框(Combobox)

一个由 Autocomplete 和 Button 创建的自定义部件。您可以键入一些字符,来获得基于您的输入过滤的结果,或者使用按钮从完整列表中选择。

该输入是从一个已有的 select 元素中读取,传递给带有自定义的 source 选项的 Autocomplete。

这是一个不被支持的不完美的部件。这里纯粹是为了演示 autocomplete 定制功能。如需了解更多有关该部件工作原理的细节,请点击这里查看相关的 jQuery 文章。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 组合框(Combobox)</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  .custom-combobox {
    position: relative;
    display: inline-block;
  }
  .custom-combobox-toggle {
    position: absolute;
    top: 0;
    bottom: 0;
    margin-left: -1px;
    padding: 0;
    /* 支持: IE7 */
    *height: 1.7em;
    *top: 0.1em;
  }
  .custom-combobox-input {
    margin: 0;
    padding: 0.3em;
  }
  </style>
  <script>
  (function( $ ) {
    $.widget( \"custom.combobox\", {
      _create: function() {
        this.wrapper = $( \"<span>\" )
          .addClass( \"custom-combobox\" )
          .insertAfter( this.element );
 
        this.element.hide();
        this._createAutocomplete();
        this._createShowAllButton();
      },
 
      _createAutocomplete: function() {
        var selected = this.element.children( \":selected\" ),
          value = selected.val() ? selected.text() : \"\";
 
        this.input = $( \"<input>\" )
          .appendTo( this.wrapper )
          .val( value )
          .attr( \"title\", \"\" )
          .addClass( \"custom-combobox-input ui-widget ui-widget-content ui-state-default ui-corner-left\" )
          .autocomplete({
            delay: 0,
            minLength: 0,
            source: $.proxy( this, \"_source\" )
          })
          .tooltip({
            tooltipClass: \"ui-state-highlight\"
          });
 
        this._on( this.input, {
          autocompleteselect: function( event, ui ) {
            ui.item.option.selected = true;
            this._trigger( \"select\", event, {
              item: ui.item.option
            });
          },
 
          autocompletechange: \"_removeIfInvalid\"
        });
      },
 
      _createShowAllButton: function() {
        var input = this.input,
          wasOpen = false;
 
        $( \"<a>\" )
          .attr( \"tabIndex\", -1 )
          .attr( \"title\", \"Show All Items\" )
          .tooltip()
          .appendTo( this.wrapper )
          .button({
            icons: {
              primary: \"ui-icon-triangle-1-s\"
            },
            text: false
          })
          .removeClass( \"ui-corner-all\" )
          .addClass( \"custom-combobox-toggle ui-corner-right\" )
          .mousedown(function() {
            wasOpen = input.autocomplete( \"widget\" ).is( \":visible\" );
          })
          .click(function() {
            input.focus();
 
            // 如果已经可见则关闭
            if ( wasOpen ) {
              return;
            }
 
            // 传递空字符串作为搜索的值,显示所有的结果
            input.autocomplete( \"search\", \"\" );
          });
      },
 
      _source: function( request, response ) {
        var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), \"i\" );
        response( this.element.children( \"option\" ).map(function() {
          var text = $( this ).text();
          if ( this.value && ( !request.term || matcher.test(text) ) )
            return {
              label: text,
              value: text,
              option: this
            };
        }) );
      },
 
      _removeIfInvalid: function( event, ui ) {
 
        // 选择一项,不执行其他动作
        if ( ui.item ) {
          return;
        }
 
        // 搜索一个匹配(不区分大小写)
        var value = this.input.val(),
          valueLowerCase = value.toLowerCase(),
          valid = false;
        this.element.children( \"option\" ).each(function() {
          if ( $( this ).text().toLowerCase() === valueLowerCase ) {
            this.selected = valid = true;
            return false;
          }
        });
 
        // 找到一个匹配,不执行其他动作
        if ( valid ) {
          return;
        }
 
        // 移除无效的值
        this.input
          .val( \"\" )
          .attr( \"title\", value + \" didn\'t match any item\" )
          .tooltip( \"open\" );
        this.element.val( \"\" );
        this._delay(function() {
          this.input.tooltip( \"close\" ).attr( \"title\", \"\" );
        }, 2500 );
        this.input.data( \"ui-autocomplete\" ).term = \"\";
      },
 
      _destroy: function() {
        this.wrapper.remove();
        this.element.show();
      }
    });
  })( jQuery );
 
  $(function() {
    $( \"#combobox\" ).combobox();
    $( \"#toggle\" ).click(function() {
      $( \"#combobox\" ).toggle();
    });
  });
  </script>
</head>
<body>
 
<div>
  <label>您喜欢的编程语言:</label>
  <select>
    <option value=\"\">请选择...</option>
    <option value=\"ActionScript\">ActionScript</option>
    <option value=\"AppleScript\">AppleScript</option>
    <option value=\"Asp\">Asp</option>
    <option value=\"BASIC\">BASIC</option>
    <option value=\"C\">C</option>
    <option value=\"C++\">C++</option>
    <option value=\"Clojure\">Clojure</option>
    <option value=\"COBOL\">COBOL</option>
    <option value=\"ColdFusion\">ColdFusion</option>
    <option value=\"Erlang\">Erlang</option>
    <option value=\"Fortran\">Fortran</option>
    <option value=\"Groovy\">Groovy</option>
    <option value=\"Haskell\">Haskell</option>
    <option value=\"Java\">Java</option>
    <option value=\"JavaScript\">JavaScript</option>
    <option value=\"Lisp\">Lisp</option>
    <option value=\"Perl\">Perl</option>
    <option value=\"PHP\">PHP</option>
    <option value=\"Python\">Python</option>
    <option value=\"Ruby\">Ruby</option>
    <option value=\"Scala\">Scala</option>
    <option value=\"Scheme\">Scheme</option>
  </select>
</div>
<button>显示基础的选择框</button>
 
 
</body>
</html>

自定义数据并显示

您可以使用自定义数据格式,并通过简单地重载默认的聚焦和选择行为来显示数据。

尝试键入 \”j\”,或者按向下箭头按键,即可得到一个项目列表。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 自定义数据并显示</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #project-label {
    display: block;
    font-weight: bold;
    margin-bottom: 1em;
  }
  #project-icon {
    float: left;
    height: 32px;
    width: 32px;
  }
  #project-description {
    margin: 0;
    padding: 0;
  }
  </style>
  <script>
  $(function() {
    var projects = [
      {
        value: \"jquery\",
        label: \"jQuery\",
        desc: \"the write less, do more, JavaScript library\",
        icon: \"jquery_32x32.png\"
      },
      {
        value: \"jquery-ui\",
        label: \"jQuery UI\",
        desc: \"the official user interface library for jQuery\",
        icon: \"jqueryui_32x32.png\"
      },
      {
        value: \"sizzlejs\",
        label: \"Sizzle JS\",
        desc: \"a pure-JavaScript CSS selector engine\",
        icon: \"sizzlejs_32x32.png\"
      }
    ];
 
    $( \"#project\" ).autocomplete({
      minLength: 0,
      source: projects,
      focus: function( event, ui ) {
        $( \"#project\" ).val( ui.item.label );
        return false;
      },
      select: function( event, ui ) {
        $( \"#project\" ).val( ui.item.label );
        $( \"#project-id\" ).val( ui.item.value );
        $( \"#project-description\" ).html( ui.item.desc );
        $( \"#project-icon\" ).attr( \"src\", \"images/\" + ui.item.icon );
 
        return false;
      }
    })
    .data( \"ui-autocomplete\" )._renderItem = function( ul, item ) {
      return $( \"<li>\" )
        .append( \"<a>\" + item.label + \"<br>\" + item.desc + \"</a>\" )
        .appendTo( ul );
    };
  });
  </script>
</head>
<body>
 
<div>选择一个项目(请键入 \"j\"):</div>
<img src=\"images/transparent_1x1.png\" alt=\"\">
<input>
<input type=\"hidden\">
<p></p>
 
 
</body>
</html>

多个值

用法:键入一些字符,比如 \”j\”,可以看到相关的编程语言结果。选择一个值,然后继续键入字符来添加其他的值。

本实例演示如何使用 source 选项和一些事件来实现在一个单一的文本域输入多个自动完成的值。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 多个值</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <script>
  $(function() {
    var availableTags = [
      \"ActionScript\",
      \"AppleScript\",
      \"Asp\",
      \"BASIC\",
      \"C\",
      \"C++\",
      \"Clojure\",
      \"COBOL\",
      \"ColdFusion\",
      \"Erlang\",
      \"Fortran\",
      \"Groovy\",
      \"Haskell\",
      \"Java\",
      \"JavaScript\",
      \"Lisp\",
      \"Perl\",
      \"PHP\",
      \"Python\",
      \"Ruby\",
      \"Scala\",
      \"Scheme\"
    ];
    function split( val ) {
      return val.split( /,\\s*/ );
    }
    function extractLast( term ) {
      return split( term ).pop();
    }
 
    $( \"#tags\" )
      // 当选择一个条目时不离开文本域
      .bind( \"keydown\", function( event ) {
        if ( event.keyCode === $.ui.keyCode.TAB &&
            $( this ).data( \"ui-autocomplete\" ).menu.active ) {
          event.preventDefault();
        }
      })
      .autocomplete({
        minLength: 0,
        source: function( request, response ) {
          // 回到 autocomplete,但是提取最后的条目
          response( $.ui.autocomplete.filter(
            availableTags, extractLast( request.term ) ) );
        },
        focus: function() {
          // 防止在获得焦点时插入值
          return false;
        },
        select: function( event, ui ) {
          var terms = split( this.value );
          // 移除当前输入
          terms.pop();
          // 添加被选项
          terms.push( ui.item.value );
          // 添加占位符,在结尾添加逗号+空格
          terms.push( \"\" );
          this.value = terms.join( \", \" );
          return false;
        }
      });
  });
  </script>
</head>
<body>
 
<div>
  <label for=\"tags\">编程语言:</label>
  <input size=\"50\">
</div>
 
 
</body>
</html>

多个值,远程

用法:键入至少两个字符来获取鸟的名称。选择一个值,然后继续键入字符来添加其他的值。

本实例演示如何使用 source 选项和一些事件来实现在一个单一的文本域输入多个自动完成的值。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 多个值,远程</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  .ui-autocomplete-loading {
    background: white url(\'/try/jqueryui/ui-anim_basic_16x16.gif\') right center no-repeat;
  }
  </style>
  <script>
  $(function() {
    function split( val ) {
      return val.split( /,\\s*/ );
    }
    function extractLast( term ) {
      return split( term ).pop();
    }
 
    $( \"#birds\" )
      // 当选择一个条目时不离开文本域
      .bind( \"keydown\", function( event ) {
        if ( event.keyCode === $.ui.keyCode.TAB &&
            $( this ).data( \"ui-autocomplete\" ).menu.active ) {
          event.preventDefault();
        }
      })
      .autocomplete({
        source: function( request, response ) {
          $.getJSON( \"search.php\", {
            term: extractLast( request.term )
          }, response );
        },
        search: function() {
          // 自定义最小长度
          var term = extractLast( this.value );
          if ( term.length < 2 ) {
            return false;
          }
        },
        focus: function() {
          // 防止在获得焦点时插入值
          return false;
        },
        select: function( event, ui ) {
          var terms = split( this.value );
          // 移除当前输入
          terms.pop();
          // 添加被选项
          terms.push( ui.item.value );
          // 添加占位符,在结尾添加逗号+空格
          terms.push( \"\" );
          this.value = terms.join( \", \" );
          return false;
        }
      });
  });
  </script>
</head>
<body>
 
<div>
  <label for=\"birds\">鸟:</label>
  <input size=\"50\">
</div>
 
 
</body>
</html>

远程 JSONP 数据源

用法:键入至少两个字符来获取鸟的名称。选择一个值,然后继续键入字符来添加其他的值。

本实例演示如何使用 jsonp 来获取数据。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">
  <title>jQuery UI Autocomplete - Remote JSONP datasource</title>
  <link rel=\"stylesheet\" href=\"https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css\">
  
  <style>
  .ui-autocomplete-loading {
    background: white url(\'/try/jqueryui/ui-anim_basic_16x16.gif\') right center no-repeat;
  }
  </style>
  <script src=\"https://code.jquery.com/jquery-1.12.4.js\"></script>
  <script src=\"https://code.jquery.com/ui/1.12.1/jquery-ui.js\"></script>
  <script>
  $( function() {
    function log( message ) {
      $( \"<div>\" ).text( message ).prependTo( \"#log\" );
      $( \"#log\" ).scrollTop( 0 );
    }
 
    $( \"#birds\" ).autocomplete({
      source: function( request, response ) {
        $.ajax( {
          url: \"/try/jqueryui/search.php\",
          dataType: \"jsonp\",
          data: {
            term: request.term
          },
          success: function( data ) {
            response( data );
          }
        } );
      },
      minLength: 2,
      select: function( event, ui ) {
        log( \"Selected: \" + ui.item.value + \" aka \" + ui.item.id );
      }
    } );
  } );
  </script>
</head>
<body>
 
<div>
  <label for=\"birds\">Birds: </label>
  <input>
</div>
 
<div style=\"margin-top:2em; font-family:Arial\">
  Result:
  <div style=\"height: 200px; width: 300px; overflow: auto;\"></div>
</div>
 
 
</body>
</html>

远程数据源

当您在文本域中键入字符时,Autocomplete 部件给出建议结果。在本实例中,当您在文本域中至少键入两个字符时,将显示相关鸟的名称。

在本实例中,数据源是可返回 JSON 数据的服务器端脚本,通过一个简单的 source 选项来指定。另外,minLength 选项设置为 2,避免查询返回太多的结果,select 事件用于显示一些反馈。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 远程数据源</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  .ui-autocomplete-loading {
    background: white url(\'/try/jqueryui/ui-anim_basic_16x16.gif\') right center no-repeat;
  }
  </style>
  <script>
  $(function() {
    function log( message ) {
      $( \"<div>\" ).text( message ).prependTo( \"#log\" );
      $( \"#log\" ).scrollTop( 0 );
    }
 
    $( \"#birds\" ).autocomplete({
      source: \"search.php\",
      minLength: 2,
      select: function( event, ui ) {
        log( ui.item ?
          \"Selected: \" + ui.item.value + \" aka \" + ui.item.id :
          \"Nothing selected, input was \" + this.value );
      }
    });
  });
  </script>
</head>
<body>
 
<div>
  <label for=\"birds\">鸟:</label>
  <input>
</div>
 
<div style=\"margin-top:2em; font-family:Arial\">
  结果:
  <div style=\"height: 200px; width: 300px; overflow: auto;\"></div>
</div>
 
 
</body>
</html>

远程缓存

当您在文本域中键入字符时,Autocomplete 部件给出建议结果。在本实例中,当您在文本域中至少键入两个字符时,将显示相关鸟的名称。

为了提高性能,这里添加了一些本地缓存,其他与远程数据源实例相似。在这里,缓存只保存了一个查询,并可以扩展到缓存多个值,每个条目一个值。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 远程缓存</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  .ui-autocomplete-loading {
    background: white url(\'/try/jqueryui/ui-anim_basic_16x16.gif\') right center no-repeat;
  }
  </style>
  <script>
  $(function() {
    var cache = {};
    $( \"#birds\" ).autocomplete({
      minLength: 2,
      source: function( request, response ) {
        var term = request.term;
        if ( term in cache ) {
          response( cache[ term ] );
          return;
        }
 
        $.getJSON( \"search.php\", request, function( data, status, xhr ) {
          cache[ term ] = data;
          response( data );
        });
      }
    });
  });
  </script>
</head>
<body>
 
<div>
  <label for=\"birds\">鸟:</label>
  <input>
</div>
 
 
</body>
</html>

可滚动的结果

当显示一个长列表的选项时,您可以简单地为 autocomplete 菜单设置 max-height 来防止菜单显示太长。尝试键入 \”a\” 或 \”s\” 来获得一个可滚动的长列表的结果。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - 可滚动的结果</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  .ui-autocomplete {
    max-height: 100px;
    overflow-y: auto;
    /* 防止水平滚动条 */
    overflow-x: hidden;
  }
  /* IE 6 不支持 max-height
   * 我们使用 height 代替,但是这会强制菜单总是显示为那个高度
   */
  * html .ui-autocomplete {
    height: 100px;
  }
  </style>
  <script>
  $(function() {
    var availableTags = [
      \"ActionScript\",
      \"AppleScript\",
      \"Asp\",
      \"BASIC\",
      \"C\",
      \"C++\",
      \"Clojure\",
      \"COBOL\",
      \"ColdFusion\",
      \"Erlang\",
      \"Fortran\",
      \"Groovy\",
      \"Haskell\",
      \"Java\",
      \"JavaScript\",
      \"Lisp\",
      \"Perl\",
      \"PHP\",
      \"Python\",
      \"Ruby\",
      \"Scala\",
      \"Scheme\"
    ];
    $( \"#tags\" ).autocomplete({
      source: availableTags
    });
  });
  </script>
</head>
<body>
 
<div>
  <label for=\"tags\">标签:</label>
  <input>
</div>
 
 
</body>
</html>

XML 数据

本实例演示如何获取一些 XML 数据,并使用 jQuery 的方法解析它,然后把它提供给 autocomplete 作为数据源。

本实例也可作为解析远程 XML 数据源的参考 – 解析在每次 source 回调请求时发生。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 自动完成(Autocomplete) - XML 数据</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  .ui-autocomplete-loading { background: white url(\'/try/jqueryui/ui-anim_basic_16x16.gif\') right center no-repeat; }
  </style>
  <script>
  $(function() {
    function log( message ) {
      $( \"<div/>\" ).text( message ).prependTo( \"#log\" );
      $( \"#log\" ).attr( \"scrollTop\", 0 );
    }
 
    $.ajax({
      url: \"/try/jqueryui/london.xmllondon.xml\",
      dataType: \"xml\",
      success: function( xmlResponse ) {
        var data = $( \"geoname\", xmlResponse ).map(function() {
          return {
            value: $( \"name\", this ).text() + \", \" +
              ( $.trim( $( \"countryName\", this ).text() ) || \"(unknown country)\" ),
            id: $( \"geonameId\", this ).text()
          };
        }).get();
        $( \"#birds\" ).autocomplete({
          source: data,
          minLength: 0,
          select: function( event, ui ) {
            log( ui.item ?
              \"Selected: \" + ui.item.value + \", geonameId: \" + ui.item.id :
              \"Nothing selected, input was \" + this.value );
          }
        });
      }
    });
  });
  </script>
</head>
<body>
 
<div>
  <label for=\"birds\">London 匹配:</label>
  <input>
</div>
 
<div style=\"margin-top:2em; font-family:Arial\">
  结果:
  <div style=\"height: 200px; width: 300px; overflow: auto;\"></div>
</div>
 
 
</body>
</html>