]> source.dussan.org Git - jquery-ui.git/commitdiff
Autocomplete: Refactored code for array filtering into $.ui.autocomplete.filter,...
authorjzaefferer <joern.zaefferer@gmail.com>
Fri, 16 Apr 2010 09:05:35 +0000 (11:05 +0200)
committerjzaefferer <joern.zaefferer@gmail.com>
Fri, 16 Apr 2010 09:05:35 +0000 (11:05 +0200)
demos/autocomplete/index.html
demos/autocomplete/multiple-remote.html [new file with mode: 0644]
demos/autocomplete/multiple.html
demos/autocomplete/remote-with-cache.html
ui/jquery.ui.autocomplete.js

index 0c92d19b4a8d681aa00e6a8ceaf0eacf6219c2c9..c7b7207847c370d310ffcd7b96fa826d90250f72 100644 (file)
@@ -18,6 +18,7 @@
                        <li><a href="xml.html">XML data parsed once</a></li>
                        <li><a href="categories.html">Categories</a></li>
                        <li><a href="multiple.html">Multiple values</a></li>
+                       <li><a href="multiple.html">Multiple, remote</a></li>
                </ul>
        </div>
 </body>
diff --git a/demos/autocomplete/multiple-remote.html b/demos/autocomplete/multiple-remote.html
new file mode 100644 (file)
index 0000000..5e0f4b5
--- /dev/null
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+       <meta charset="UTF-8" />
+       <title>jQuery UI Autocomplete multiple demo</title>
+       <link type="text/css" href="../../themes/base/jquery.ui.all.css" rel="stylesheet" />
+       <script type="text/javascript" src="../../jquery-1.4.2.js"></script>
+       <script type="text/javascript" src="../../ui/jquery.ui.core.js"></script>
+       <script type="text/javascript" src="../../ui/jquery.ui.widget.js"></script>
+       <script type="text/javascript" src="../../ui/jquery.ui.position.js"></script>
+       <script type="text/javascript" src="../../ui/jquery.ui.autocomplete.js"></script>
+       <link type="text/css" href="../demos.css" rel="stylesheet" />
+       <script type="text/javascript">
+       $(function() {
+               function split(val) {
+                       return val.split(/,\s*/);
+               }
+               function extractLast(term) {
+                       return split(term).pop();
+               }
+               
+               $("#birds").autocomplete({
+                       source: function(request, response) {
+                               $.getJSON("search.php", {
+                                       term: extractLast(request.term)
+                               }, response);
+                       },
+                       search: function() {
+                               // custom minLength
+                               var term = extractLast(this.value);
+                               if (term.length < 2) {
+                                       return false;
+                               }
+                       },
+                       focus: function() {
+                               // prevent value inserted on focus
+                               return false;
+                       },
+                       select: function(event, ui) {
+                               var terms = split( this.value );
+                               // remove the current input
+                               terms.pop();
+                               // add the selected item
+                               terms.push( ui.item.value );
+                               // add placeholder to get the comma-and-space at the end
+                               terms.push("");
+                               this.value = terms.join(", ");
+                               return false;
+                       }
+               });
+       });
+       </script>
+</head>
+<body>
+
+<div class="demo">
+
+<div class="ui-widget">
+       <label for="birds">Birds: </label>
+       <input id="birds" size="50" />
+</div>
+
+</div><!-- End demo -->
+
+<div class="demo-description">
+<p>
+Usage: Enter at least two characters to get bird name suggestions. Select a value to continue adding more names.
+</p>
+<p>
+This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field.
+</p>
+</div><!-- End demo-description -->
+
+</body>
+</html>
index 5e0f4b50b7ad3169d18280c1436c1a2d162dca20..908cfe6ce7a494edb64efdace4edf034f9bb4c5b 100644 (file)
@@ -12,6 +12,7 @@
        <link type="text/css" href="../demos.css" rel="stylesheet" />
        <script type="text/javascript">
        $(function() {
+               var availableTags = ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"];
                function split(val) {
                        return val.split(/,\s*/);
                }
                        return split(term).pop();
                }
                
-               $("#birds").autocomplete({
+               $("#tags").autocomplete({
+                       minLength: 0,
                        source: function(request, response) {
-                               $.getJSON("search.php", {
-                                       term: extractLast(request.term)
-                               }, response);
-                       },
-                       search: function() {
-                               // custom minLength
-                               var term = extractLast(this.value);
-                               if (term.length < 2) {
-                                       return false;
-                               }
+                               // delegate back to autocomplete, but extract the last term
+                               response($.ui.autocomplete.filter(availableTags, extractLast(request.term)));
                        },
                        focus: function() {
                                // prevent value inserted on focus
 <div class="demo">
 
 <div class="ui-widget">
-       <label for="birds">Birds: </label>
-       <input id="birds" size="50" />
+       <label for="tags">Tag programming languages: </label>
+       <input id="tags" size="50" />
 </div>
 
 </div><!-- End demo -->
 
 <div class="demo-description">
 <p>
-Usage: Enter at least two characters to get bird name suggestions. Select a value to continue adding more names.
+Usage: Type something, eg. "j" to see suggestions for tagging with programming languages. Select a value, then continue typing to add more.
 </p>
 <p>
 This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field.
index 3688365d4ea5fac761449c0f6742a7b5eabc7764..a00c741e44e7baa63b5ad415be27bf2e0e3c548a 100644 (file)
                        source: function(request, response) {
                                if (cache.term == request.term && cache.content) {
                                        response(cache.content);
+                                       return;
                                }
                                if (new RegExp(cache.term).test(request.term) && cache.content && cache.content.length < 13) {
-                                       var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
-                                       response($.grep(cache.content, function(value) {
-                                       return matcher.test(value.value)
-                                       }));
+                                       response($.ui.autocomplete.filter(cache.content, request.term));
+                                       return;
                                }
                                $.ajax({
                                        url: "search.php",
index 14a19e4b237f3b059603e00ec45242aca8d6763e..070045d16abb6a6e5df8ff9ae3855588c0f8518f 100644 (file)
@@ -166,11 +166,7 @@ $.widget( "ui.autocomplete", {
                if ( $.isArray(this.options.source) ) {
                        array = this.options.source;
                        this.source = function( request, response ) {
-                               // escape regex characters
-                               var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
-                               response( $.grep( array, function(value) {
-                                       return matcher.test( value.label || value.value || value );
-                               }) );
+                               response( $.ui.autocomplete.filter(array, request.term) );
                        };
                } else if ( typeof this.options.source === "string" ) {
                        url = this.options.source;
@@ -308,6 +304,12 @@ $.widget( "ui.autocomplete", {
 $.extend( $.ui.autocomplete, {
        escapeRegex: function( value ) {
                return value.replace( /([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1" );
+       },
+       filter: function(array, term) {
+               var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+               return $.grep( array, function(value) {
+                       return matcher.test( value.label || value.value || value );
+               });
        }
 });