5.电影搜索之 自动填充,也叫autocomplete、搜索建议!

         什么叫自动填充,用过百度的应该都知道!当你输入关键词之后,会有一个下拉的候选列表,都是与你输入的内容相关的,这个就是自动填充的搜索建议。一般的搜索引擎或者站内搜索都会有这个功能。

         今天分享下这个功能的实现,演示网址:http://www.mrhso.com/movie    演示图:

        

        可以实现搜索提示,键盘移动选择,回车键确认搜索,可以设置每次访问后台的时间间隔,设置候选 列表的数据数量。

        实现原理:通过一个叫Jquery Autocomplete 的jquery插件实现。

        

        插件的js脚本如下:

        

jQuery.autocomplete = function(input, options) {
    // Create a link to self
    var me = this;

    // Create jQuery object for input element
    var $input = $(input).attr("autocomplete", "off");

    // Apply inputClass if necessary
    if (options.inputClass) $input.addClass(options.inputClass);

    // Create results
    var results = document.createElement("div");
    // Create jQuery object for results
    var $results = $(results);
    $results.hide().addClass(options.resultsClass).css("position", "absolute");
    if( options.width > 0 ) $results.css("width", options.width);

    // Add to body element
    $("body").append(results);

    input.autocompleter = me;

    var timeout = null;
    var prev = "";
    var active = -1;
    var cache = {};
    var keyb = false;
    var hasFocus = false;
    var lastKeyPressCode = null;

    // flush cache
    function flushCache(){
        cache = {};
        cache.data = {};
        cache.length = 0;
    };

    // flush cache
    flushCache();

    // if there is a data array supplied
    if( options.data != null ){
        var sFirstChar = "", stMatchSets = {}, row = [];

        // no url was specified, we need to adjust the cache length to make sure it fits the local data store
        if( typeof options.url != "string" ) options.cacheLength = 1;

        // loop through the array and create a lookup structure
        for( var i=0; i < options.data.length; i++ ){
            // if row is a string, make an array otherwise just reference the array
            row = ((typeof options.data[i] == "string") ? [options.data[i]] : options.data[i]);

            // if the length is zero, don't add to list
            if( row[0].length > 0 ){
                // get the first character
                sFirstChar = row[0].substring(0, 1).toLowerCase();
                // if no lookup array for this character exists, look it up now
                if( !stMatchSets[sFirstChar] ) stMatchSets[sFirstChar] = [];
                // if the match is a string
                stMatchSets[sFirstChar].push(row);
            }
        }

        // add the data items to the cache
        for( var k in stMatchSets ){
            // increase the cache size
            options.cacheLength++;
            // add to the cache
            addToCache(k, stMatchSets[k]);
        }
    }

    $input
    .keydown(function(e) {
        // track last key pressed
        lastKeyPressCode = e.keyCode;
        switch(e.keyCode) {
            case 38: // up
                e.preventDefault();
                moveSelect(-1);
                break;
            case 40: // down
                e.preventDefault();
                moveSelect(1);
                break;
            case 9:  // tab
            case 13: // return
                if( selectCurrent() ){
                    // make sure to blur off the current field
                    $input.get(0).blur();
                    e.preventDefault();
                }
                break;
            default:
                active = -1;
                if (timeout) clearTimeout(timeout);
                timeout = setTimeout(function(){onChange();}, options.delay);
                break;
        }
    })
    .focus(function(){
        // track whether the field has focus, we shouldn't process any results if the field no longer has focus
        hasFocus = true;
    })
    .blur(function() {
        // track whether the field has focus
        hasFocus = false;
        hideResults();
    });

    hideResultsNow();

    function onChange() {
        // ignore if the following keys are pressed: [del] [shift] [capslock]
        if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ) return $results.hide();
        var v = $input.val();
        if (v == prev) return;
        prev = v;
        if (v.length >= options.minChars) {
            $input.addClass(options.loadingClass);
            requestData(v);
        } else {
            $input.removeClass(options.loadingClass);
            $results.hide();
        }
    };

     function moveSelect(step) {

        var lis = $("li", results);
        if (!lis) return;

        active += step;

        if (active < 0) {
            active = 0;
        } else if (active >= lis.size()) {
            active = lis.size() - 1;
        }

        lis.removeClass("ac_over");

        $(lis[active]).addClass("ac_over");

        // Weird behaviour in IE
        // if (lis[active] && lis[active].scrollIntoView) {
        //     lis[active].scrollIntoView(false);
        // }

    };

    function selectCurrent() {
        var li = $("li.ac_over", results)[0];
        if (!li) {
            var $li = $("li", results);
            if (options.selectOnly) {
                if ($li.length == 1) li = $li[0];
            } else if (options.selectFirst) {
                li = $li[0];
            }
        }
        if (li) {
            selectItem(li);
            return true;
        } else {
            return false;
        }
    };

    function selectItem(li) {
        if (!li) {
            li = document.createElement("li");
            li.extra = [];
            li.selectValue = "";
        }
        var v = $.trim(li.selectValue ? li.selectValue : li.innerHTML);
        input.lastSelected = v;
        prev = v;
        $results.html("");
        $input.val(v);
        hideResultsNow();
        if (options.onItemSelect) setTimeout(function() { options.onItemSelect(li) }, 1);
    };

    // selects a portion of the input string
    function createSelection(start, end){
        // get a reference to the input element
        var field = $input.get(0);
        if( field.createTextRange ){
            var selRange = field.createTextRange();
            selRange.collapse(true);
            selRange.moveStart("character", start);
            selRange.moveEnd("character", end);
            selRange.select();
        } else if( field.setSelectionRange ){
            field.setSelectionRange(start, end);
        } else {
            if( field.selectionStart ){
                field.selectionStart = start;
                field.selectionEnd = end;
            }
        }
        field.focus();
    };

    // fills in the input box w/the first match (assumed to be the best match)
    function autoFill(sValue){
        // if the last user key pressed was backspace, don't autofill
        if( lastKeyPressCode != 8 ){
            // fill in the value (keep the case the user has typed)
            $input.val($input.val() + sValue.substring(prev.length));
            // select the portion of the value not typed by the user (so the next character will erase)
            createSelection(prev.length, sValue.length);
        }
    };

    function showResults() {
        // get the position of the input field right now (in case the DOM is shifted)
        var pos = findPos(input);
        // either use the specified width, or autocalculate based on form element
        var iWidth = (options.width > 0) ? options.width : $input.width();
        // reposition
        $results.css({
             parseInt(iWidth) + "px",
            top: (pos.y + input.offsetHeight) + "px",
            left: pos.x + "px"
        }).show();
    };

    function hideResults() {
        if (timeout) clearTimeout(timeout);
        timeout = setTimeout(hideResultsNow, 200);
    };

    function hideResultsNow() {
        if (timeout) clearTimeout(timeout);
        $input.removeClass(options.loadingClass);
        if ($results.is(":visible")) {
            $results.hide();
        }
        if (options.mustMatch) {
            var v = $input.val();
            if (v != input.lastSelected) {
                selectItem(null);
            }
        }
    };

    function receiveData(q, data) {
        if (data) {
            $input.removeClass(options.loadingClass);
            results.innerHTML = "";

            // if the field no longer has focus or if there are no matches, do not display the drop down
            if( !hasFocus || data.length == 0 ) return hideResultsNow();

            if ($.browser.msie) {
                // we put a styled iframe behind the calendar so HTML SELECT elements don't show through
                $results.append(document.createElement('iframe'));
            }
            results.appendChild(dataToDom(data));
            // autofill in the complete box w/the first match as long as the user hasn't entered in more data
            if( options.autoFill && ($input.val().toLowerCase() == q.toLowerCase()) ) autoFill(data[0][0]);
            showResults();
        } else {
            hideResultsNow();
        }
    };

    function parseData(data) {
        if (!data) return null;
        var parsed = [];
        var rows = data.split(options.lineSeparator);
        for (var i=0; i < rows.length; i++) {
            var row = $.trim(rows[i]);
            if (row) {
                parsed[parsed.length] = row.split(options.cellSeparator);
            }
        }
        return parsed;
    };

    function dataToDom(data) {
        var ul = document.createElement("ul");
        var num = data.length;

        // limited results to a max number
        if( (options.maxItemsToShow > 0) && (options.maxItemsToShow < num) ) num = options.maxItemsToShow;

        for (var i=0; i < num; i++) {
            var row = data[i];
            if (!row) continue;
            var li = document.createElement("li");
            if (options.formatItem) {
                li.innerHTML = options.formatItem(row, i, num);
                li.selectValue = row[0];
            } else {
                li.innerHTML = row[0];
                li.selectValue = row[0];
            }
            var extra = null;
            if (row.length > 1) {
                extra = [];
                for (var j=1; j < row.length; j++) {
                    extra[extra.length] = row[j];
                }
            }
            li.extra = extra;
            ul.appendChild(li);
            $(li).hover(
                function() { $("li", ul).removeClass("ac_over"); $(this).addClass("ac_over"); active = $("li", ul).indexOf($(this).get(0)); },
                function() { $(this).removeClass("ac_over"); }
            ).click(function(e) { e.preventDefault(); e.stopPropagation(); selectItem(this) });
        }
        return ul;
    };

    function requestData(q) {
        if (!options.matchCase) q = q.toLowerCase();
        var data = options.cacheLength ? loadFromCache(q) : null;
        // recieve the cached data
        if (data) {
            receiveData(q, data);
        // if an AJAX url has been supplied, try loading the data now
        } else if( (typeof options.url == "string") && (options.url.length > 0) ){
            $.get(makeUrl(q), function(data) {
                data = parseData(data);
                addToCache(q, data);
                receiveData(q, data);
            });
        // if there's been no data found, remove the loading class
        } else {
            $input.removeClass(options.loadingClass);
        }
    };

    function makeUrl(q) {
        var url = options.url + "?q=" + encodeURI(q);
        for (var i in options.extraParams) {
            url += "&" + i + "=" + encodeURI(options.extraParams[i]);
        }
        return url;
    };

    function loadFromCache(q) {
        if (!q) return null;
        if (cache.data[q]) return cache.data[q];
        if (options.matchSubset) {
            for (var i = q.length - 1; i >= options.minChars; i--) {
                var qs = q.substr(0, i);
                var c = cache.data[qs];
                if (c) {
                    var csub = [];
                    for (var j = 0; j < c.length; j++) {
                        var x = c[j];
                        var x0 = x[0];
                        if (matchSubset(x0, q)) {
                            csub[csub.length] = x;
                        }
                    }
                    return csub;
                }
            }
        }
        return null;
    };

    function matchSubset(s, sub) {
        if (!options.matchCase) s = s.toLowerCase();
        var i = s.indexOf(sub);
        if (i == -1) return false;
        return i == 0 || options.matchContains;
    };

    this.flushCache = function() {
        flushCache();
    };

    this.setExtraParams = function(p) {
        options.extraParams = p;
    };

    this.findValue = function(){
        var q = $input.val();

        if (!options.matchCase) q = q.toLowerCase();
        var data = options.cacheLength ? loadFromCache(q) : null;
        if (data) {
            findValueCallback(q, data);
        } else if( (typeof options.url == "string") && (options.url.length > 0) ){
            $.get(makeUrl(q), function(data) {
                data = parseData(data)
                addToCache(q, data);
                findValueCallback(q, data);
            });
        } else {
            // no matches
            findValueCallback(q, null);
        }
    }

    function findValueCallback(q, data){
        if (data) $input.removeClass(options.loadingClass);

        var num = (data) ? data.length : 0;
        var li = null;

        for (var i=0; i < num; i++) {
            var row = data[i];

            if( row[0].toLowerCase() == q.toLowerCase() ){
                li = document.createElement("li");
                if (options.formatItem) {
                    li.innerHTML = options.formatItem(row, i, num);
                    li.selectValue = row[0];
                } else {
                    li.innerHTML = row[0];
                    li.selectValue = row[0];
                }
                var extra = null;
                if( row.length > 1 ){
                    extra = [];
                    for (var j=1; j < row.length; j++) {
                        extra[extra.length] = row[j];
                    }
                }
                li.extra = extra;
            }
        }

        if( options.onFindValue ) setTimeout(function() { options.onFindValue(li) }, 1);
    }

    function addToCache(q, data) {
        if (!data || !q || !options.cacheLength) return;
        if (!cache.length || cache.length > options.cacheLength) {
            flushCache();
            cache.length++;
        } else if (!cache[q]) {
            cache.length++;
        }
        cache.data[q] = data;
    };

    function findPos(obj) {
        var curleft = obj.offsetLeft || 0;
        var curtop = obj.offsetTop || 0;
        while (obj = obj.offsetParent) {
            curleft += obj.offsetLeft
            curtop += obj.offsetTop
        }
        return {x:curleft,y:curtop};
    }
}

jQuery.fn.autocomplete = function(url, options, data) {
    // Make sure options exists
    options = options || {};
    // Set url as option
    options.url = url;
    // set some bulk local data
    options.data = ((typeof data == "object") && (data.constructor == Array)) ? data : null;

    // Set default values for required options
    options.inputClass = options.inputClass || "ac_input";
    options.resultsClass = options.resultsClass || "ac_results";
    options.lineSeparator = options.lineSeparator || "
";
    options.cellSeparator = options.cellSeparator || "|";
    options.minChars = options.minChars || 1;
    options.delay = options.delay || 400;
    options.matchCase = options.matchCase || 0;
    options.matchSubset = options.matchSubset || 1;
    options.matchContains = options.matchContains || 0;
    options.cacheLength = options.cacheLength || 1;
    options.mustMatch = options.mustMatch || 0;
    options.extraParams = options.extraParams || {};
    options.loadingClass = options.loadingClass || "ac_loading";
    options.selectFirst = options.selectFirst || false;
    options.selectOnly = options.selectOnly || false;
    options.maxItemsToShow = options.maxItemsToShow || -1;
    options.autoFill = options.autoFill || false;
    options.width = parseInt(options.width, 10) || 0;

    this.each(function() {
        var input = this;
        new jQuery.autocomplete(input, options);
    });

    // Don't break the chain
    return this;
}

jQuery.fn.autocompleteArray = function(data, options) {
    return this.autocomplete(null, options, data);
}

jQuery.fn.indexOf = function(e){
    for( var i=0; i<this.length; i++ ){
        if( this[i] == e ) return i;
    }
    return -1;
};

css样式如下:

.ac_results {
    padding: 0px;
    border: 1px solid WindowFrame;
    background-color: Window;
    overflow: hidden;
}

.ac_results ul {
     100%;
    list-style-position: outside;
    list-style: none;
    padding: 0;
    margin: 0;
}

.ac_results iframe {
    display:none;/*sorry for IE5*/
    display/**/:block;/*sorry for IE5*/
    position:absolute;
    top:0;
    left:0;
    z-index:-1;
    filter:mask();
    3000px;
    height:3000px;
}

.ac_results li {
    margin: 0px;
    padding: 2px 5px;
    cursor: pointer;
    display: block;
     100%;
    font: menu;
    font-size: 12px;
    overflow: hidden;
}

.ac_loading {
    background : Window url('./indicator.gif') right center no-repeat;
}

.ac_over {
    background-color: Highlight;
    color: HighlightText;
}

      使用示例演示:

AJax数据传输格式:Sparta|896 Spencer|897 Spencerville|898 Spring Valley|899 Springboro|900 Springfield|901


下面演示了两种使用方法:通过ajax访问数据 和通过js数组获取数据!
<script type="text/javascript">
function findValue(li) {
    if( li == null ) return alert("No match!");

    // if coming from an AJAX call, let's use the CityId as the value
    if( !!li.extra ) var sValue = li.extra[0];

    // otherwise, let's just display the value in the text box
    else var sValue = li.selectValue;

    alert("The value you selected was: " + sValue);
}

function selectItem(li) {
    findValue(li);
}

function formatItem(row) {
    return row[0] + " (id: " + row[1] + ")";
}

function lookupAjax(){
    var oSuggest = $("#CityAjax")[0].autocompleter;

    oSuggest.findValue();

    return false;
}

function lookupLocal(){
    var oSuggest = $("#CityLocal")[0].autocompleter;

    oSuggest.findValue();

    return false;
}

$(document).ready(function() {
    $("#CityAjax").autocomplete(
        "autocomplete_ajax.cfm",
        {
            delay:10,
            minChars:2,
            matchSubset:1,
            matchContains:1,
            cacheLength:10,
            onItemSelect:selectItem,
            onFindValue:findValue,
            formatItem:formatItem,
            autoFill:true
        }
    );

    $("#CityLocal").autocompleteArray(
        [
            "Aberdeen", "Ada", "Adamsville", "Addyston", "Adelphi", "Adena", "Adrian", "Akron",
            "Albany", "Alexandria", "Alger", "Alledonia", "Alliance", "Alpha", "Alvada",
            "Alvordton", "Amanda", "Amelia", "Amesville", "Amherst", "Amlin", "Amsden",
            "Amsterdam", "Andover", "Anna", "Ansonia", "Antwerp", "Apple Creek", "Arcadia",
            "Arcanum", "Archbold", "Arlington", "Ashland", "Ashley", "Ashtabula", "Ashville",
            "Athens", "Attica", "Atwater", "Augusta", "Aurora", "Austinburg", "Ava", "Avon",
            "Avon Lake", "Bainbridge", "Bakersville", "Baltic", "Baltimore", "Bannock",
            "Barberton", "Barlow", "Barnesville", "Bartlett", "Barton", "Bascom", "Batavia",
            "Bath", "Bay Village", "Beach City", "Beachwood", "Beallsville", "Beaver",
            "Beaverdam", "Bedford", "Bellaire", "Bellbrook", "Belle Center", "Belle Valley",
            "Bellefontaine", "Bellevue", "Bellville", "Belmont", "Belmore", "Beloit", "Belpre",
            "Benton Ridge", "Bentonville", "Berea", "Bergholz", "Berkey", "Berlin",
            "Berlin Center", "Berlin Heights", "Bethel", "Bethesda", "Bettsville", "Beverly",
            "Bidwell", "Big Prairie", "Birmingham", "Blacklick", "Bladensburg", "Blaine",
            "Blakeslee", "Blanchester", "Blissfield", "Bloomdale", "Bloomingburg",
            "Bloomingdale", "Bloomville", "Blue Creek", "Blue Rock", "Bluffton",
            "Bolivar", "Botkins", "Bourneville", "Bowerston", "Bowersville",
            "Bowling Green", "Bradford", "Bradner", "Brady Lake", "Brecksville",
            "Bremen", "Brewster", "Brice", "Bridgeport", "Brilliant", "Brinkhaven",
            "Bristolville", "Broadview Heights", "Broadway", "Brookfield", "Brookpark",
            "Brookville", "Brownsville", "Brunswick", "Bryan", "Buchtel", "Buckeye Lake",
            "Buckland", "Bucyrus", "Buffalo", "Buford", "Burbank", "Burghill", "Burgoon",
            "Burkettsville", "Burton", "Butler", "Byesville", "Cable", "Cadiz", "Cairo",
            "Caldwell", "Caledonia", "Cambridge", "Camden", "Cameron", "Camp Dennison",
            "Campbell", "Canal Fulton", "Canal Winchester", "Canfield", "Canton", "Carbon Hill",
            "Carbondale", "Cardington", "Carey", "Carroll", "Carrollton", "Casstown",
            "Castalia", "Catawba", "Cecil", "Cedarville", "Celina", "Centerburg",
            "Chagrin Falls", "Chandlersville", "Chardon", "Charm", "Chatfield", "Chauncey",
            "Cherry Fork", "Chesapeake", "Cheshire", "Chester", "Chesterhill", "Chesterland",
            "Chesterville", "Chickasaw", "Chillicothe", "Chilo", "Chippewa Lake",
            "Christiansburg", "Cincinnati", "Circleville", "Clarington", "Clarksburg",
            "Clarksville", "Clay Center", "Clayton", "Cleveland", "Cleves", "Clifton",
            "Clinton", "Cloverdale", "Clyde", "Coal Run", "Coalton", "Coldwater", "Colerain",
            "College Corner", "Collins", "Collinsville", "Colton", "Columbia Station",
            "Columbiana", "Columbus", "Columbus Grove", "Commercial Point", "Conesville",
            "Conneaut", "Conover", "Continental", "Convoy", "Coolville", "Corning", "Cortland",
            "Coshocton", "Covington", "Creola", "Crestline", "Creston", "Crooksville",
            "Croton", "Crown City", "Cuba", "Cumberland", "Curtice", "Custar", "Cutler",
            "Cuyahoga Falls", "Cygnet", "Cynthiana", "Dalton", "Damascus", "Danville",
            "Dayton", "De Graff", "Decatur", "Deerfield", "Deersville", "Defiance",
            "Delaware", "Dellroy", "Delphos", "Delta", "Dennison", "Derby", "Derwent",
            "Deshler", "Dexter City", "Diamond", "Dillonvale", "Dola", "Donnelsville",
            "Dorset", "Dover", "Doylestown", "Dresden", "Dublin", "Dunbridge", "Duncan Falls",
            "Dundee", "Dunkirk", "Dupont", "East Claridon", "East Fultonham",
            "East Liberty", "East Liverpool", "East Palestine", "East Rochester",
            "East Sparta", "East Springfield", "Eastlake", "Eaton", "Edgerton", "Edison",
            "Edon", "Eldorado", "Elgin", "Elkton", "Ellsworth", "Elmore", "Elyria",
            "Empire", "Englewood", "Enon", "Etna", "Euclid", "Evansport", "Fairborn",
            "Fairfield", "Fairpoint", "Fairview", "Farmdale", "Farmer", "Farmersville",
            "Fayette", "Fayetteville", "Feesburg", "Felicity", "Findlay", "Flat Rock",
            "Fleming", "Fletcher", "Flushing", "Forest", "Fort Jennings", "Fort Loramie",
            "Fort Recovery", "Fostoria", "Fowler", "Frankfort", "Franklin",
            "Franklin Furnace", "Frazeysburg", "Fredericksburg", "Fredericktown",
            "Freeport", "Fremont", "Fresno", "Friendship", "Fulton", "Fultonham",
            "Galena", "Galion", "Gallipolis", "Galloway", "Gambier", "Garrettsville",
            "Gates Mills", "Geneva", "Genoa", "Georgetown", "Germantown", "Gettysburg",
            "Gibsonburg", "Girard", "Glandorf", "Glencoe", "Glenford", "Glenmont",
            "Glouster", "Gnadenhutten", "Gomer", "Goshen", "Grafton", "Grand Rapids",
            "Grand River", "Granville", "Gratiot", "Gratis", "Graysville", "Graytown",
            "Green", "Green Camp", "Green Springs", "Greenfield", "Greenford",
            "Greentown", "Greenville", "Greenwich", "Grelton", "Grove City",
            "Groveport", "Grover Hill", "Guysville", "Gypsum", "Hallsville",
            "Hamden", "Hamersville", "Hamilton", "Hamler", "Hammondsville",
            "Hannibal", "Hanoverton", "Harbor View", "Harlem Springs", "Harpster",
            "Harrisburg", "Harrison", "Harrisville", "Harrod", "Hartford", "Hartville",
            "Harveysburg", "Haskins", "Haverhill", "Haviland", "Haydenville", "Hayesville",
            "Heath", "Hebron", "Helena", "Hicksville", "Higginsport", "Highland", "Hilliard",
            "Hillsboro", "Hinckley", "Hiram", "Hockingport", "Holgate", "Holland",
            "Hollansburg", "Holloway", "Holmesville", "Homer", "Homerville", "Homeworth",
            "Hooven", "Hopedale", "Hopewell", "Houston", "Howard", "Hoytville", "Hubbard",
            "Hudson", "Huntsburg", "Huntsville", "Huron", "Iberia", "Independence",
            "Irondale", "Ironton", "Irwin", "Isle Saint George", "Jackson", "Jackson Center",
            "Jacksontown", "Jacksonville", "Jacobsburg", "Jamestown", "Jasper",
            "Jefferson", "Jeffersonville", "Jenera", "Jeromesville", "Jerry City",
            "Jerusalem", "Jewell", "Jewett", "Johnstown", "Junction City", "Kalida",
            "Kansas", "Keene", "Kelleys Island", "Kensington", "Kent", "Kenton",
            "Kerr", "Kettlersville", "Kidron", "Kilbourne", "Killbuck", "Kimbolton",
            "Kings Mills", "Kingston", "Kingsville", "Kinsman", "Kipling", "Kipton",
            "Kirby", "Kirkersville", "Kitts Hill", "Kunkle", "La Rue", "Lacarne",
            "Lafayette", "Lafferty", "Lagrange", "Laings", "Lake Milton", "Lakemore",
            "Lakeside Marblehead", "Lakeview", "Lakeville", "Lakewood", "Lancaster",
            "Langsville", "Lansing", "Latham", "Latty", "Laura", "Laurelville",
            "Leavittsburg", "Lebanon", "Lees Creek", "Leesburg", "Leesville",
            "Leetonia", "Leipsic", "Lemoyne", "Lewis Center", "Lewisburg",
            "Lewistown", "Lewisville", "Liberty Center", "Lima", "Limaville",
            "Lindsey", "Lisbon", "Litchfield", "Lithopolis", "Little Hocking",
            "Lockbourne", "Lodi", "Logan", "London", "Londonderry",
            "Long Bottom", "Lorain", "Lore City", "Loudonville", "Louisville",
            "Loveland", "Lowell", "Lowellville", "Lower Salem", "Lucas",
            "Lucasville", "Luckey", "Ludlow Falls", "Lynchburg", "Lynx",
            "Lyons", "Macedonia", "Macksburg", "Madison", "Magnetic Springs",
            "Magnolia", "Maineville", "Malaga", "Malinta", "Malta", "Malvern",
            "Manchester", "Mansfield", "Mantua", "Maple Heights", "Maplewood",
            "Marathon", "Marengo", "Maria Stein", "Marietta", "Marion",
            "Mark Center", "Marshallville", "Martel", "Martin", "Martins Ferry",
            "Martinsburg", "Martinsville", "Marysville", "Mason", "Massillon",
            "Masury", "Maumee", "Maximo", "Maynard", "Mc Arthur", "Mc Clure",
            "Mc Comb", "Mc Connelsville", "Mc Cutchenville", "Mc Dermott",
            "Mc Donald", "Mc Guffey", "Mechanicsburg", "Mechanicstown",
            "Medina", "Medway", "Melmore", "Melrose", "Mendon", "Mentor",
            "Mesopotamia", "Metamora", "Miamisburg", "Miamitown", "Miamiville",
            "Middle Bass", "Middle Point", "Middlebranch", "Middleburg",
            "Middlefield", "Middleport", "Middletown", "Midland", "Midvale",
            "Milan", "Milford", "Milford Center", "Millbury", "Milledgeville",
            "Miller City", "Millersburg", "Millersport", "Millfield",
            "Milton Center", "Mineral City", "Mineral Ridge", "Minerva",
            "Minford", "Mingo", "Mingo Junction", "Minster", "Mogadore",
            "Monclova", "Monroe", "Monroeville", "Montezuma", "Montpelier",
            "Montville", "Morral", "Morristown", "Morrow", "Moscow",
            "Mount Blanchard", "Mount Cory", "Mount Eaton", "Mount Gilead",
            "Mount Hope", "Mount Liberty", "Mount Orab", "Mount Perry",
            "Mount Pleasant", "Mount Saint Joseph", "Mount Sterling",
            "Mount Vernon", "Mount Victory", "Mowrystown", "Moxahala",
            "Munroe Falls", "Murray City", "Nankin", "Napoleon", "Nashport",
            "Nashville", "Navarre", "Neapolis", "Neffs", "Negley",
            "Nelsonville", "Nevada", "Neville", "New Albany", "New Athens",
            "New Bavaria", "New Bloomington", "New Bremen", "New Carlisle",
            "New Concord", "New Hampshire", "New Haven", "New Holland",
            "New Knoxville", "New Lebanon", "New Lexington", "New London",
            "New Madison", "New Marshfield", "New Matamoras", "New Middletown",
            "New Paris", "New Philadelphia", "New Plymouth", "New Richmond",
            "New Riegel", "New Rumley", "New Springfield", "New Straitsville",
            "New Vienna", "New Washington", "New Waterford", "New Weston",
            "Newark", "Newbury", "Newcomerstown", "Newport", "Newton Falls",
            "Newtonsville", "Ney", "Niles", "North Baltimore", "North Bend",
            "North Benton", "North Bloomfield", "North Fairfield",
            "North Georgetown", "North Hampton", "North Jackson",
            "North Kingsville", "North Lawrence", "North Lewisburg",
            "North Lima", "North Olmsted", "North Ridgeville", "North Robinson",
            "North Royalton", "North Star", "Northfield", "Northwood", "Norwalk",
            "Norwich", "Nova", "Novelty", "Oak Harbor", "Oak Hill", "Oakwood",
            "Oberlin", "Oceola", "Ohio City", "Okeana", "Okolona", "Old Fort",
            "Old Washington", "Olmsted Falls", "Ontario", "Orangeville",
            "Oregon", "Oregonia", "Orient", "Orrville", "Orwell", "Osgood",
            "Ostrander", "Ottawa", "Ottoville", "Otway", "Overpeck",
            "Owensville", "Oxford", "Painesville", "Palestine", "Pandora",
            "Paris", "Parkman", "Pataskala", "Patriot", "Paulding", "Payne",
            "Pedro", "Peebles", "Pemberton", "Pemberville", "Peninsula",
            "Perry", "Perrysburg", "Perrysville", "Petersburg", "Pettisville",
            "Phillipsburg", "Philo", "Pickerington", "Piedmont", "Pierpont",
            "Piketon", "Piney Fork", "Pioneer", "Piqua", "Pitsburg",
            "Plain City", "Plainfield", "Pleasant City", "Pleasant Hill",
            "Pleasant Plain", "Pleasantville", "Plymouth", "Polk",
            "Pomeroy", "Port Clinton", "Port Jefferson", "Port Washington",
            "Port William", "Portage", "Portland", "Portsmouth", "Potsdam",
            "Powell", "Powhatan Point", "Proctorville", "Prospect", "Put in Bay",
            "Quaker City", "Quincy", "Racine", "Radnor", "Randolph", "Rarden",
            "Ravenna", "Rawson", "Ray", "Rayland", "Raymond", "Reedsville",
            "Reesville", "Reno", "Republic", "Reynoldsburg", "Richfield",
            "Richmond", "Richmond Dale", "Richwood", "Ridgeville Corners",
            "Ridgeway", "Rio Grande", "Ripley", "Risingsun", "Rittman",
            "Robertsville", "Rock Camp", "Rock Creek", "Rockbridge", "Rockford",
            "Rocky Ridge", "Rocky River", "Rogers", "Rome", "Rootstown", "Roseville",
            "Rosewood", "Ross", "Rossburg", "Rossford", "Roundhead", "Rudolph",
            "Rushsylvania", "Rushville", "Russells Point", "Russellville", "Russia",
            "Rutland", "Sabina", "Saint Clairsville", "Saint Henry", "Saint Johns",
            "Saint Louisville", "Saint Marys", "Saint Paris", "Salem", "Salesville",
            "Salineville", "Sandusky", "Sandyville", "Sarahsville", "Sardinia",
            "Sardis", "Savannah", "Scio", "Scioto Furnace", "Scott", "Scottown",
            "Seaman", "Sebring", "Sedalia", "Senecaville", "Seven Mile", "Seville",
            "Shade", "Shadyside", "Shandon", "Sharon Center", "Sharpsburg",
            "Shauck", "Shawnee", "Sheffield Lake", "Shelby", "Sherrodsville",
            "Sherwood", "Shiloh", "Short Creek", "Shreve", "Sidney", "Sinking Spring",
            "Smithfield", "Smithville", "Solon", "Somerdale", "Somerset",
            "Somerville", "South Bloomingville", "South Charleston", "South Lebanon",
            "South Point", "South Salem", "South Solon", "South Vienna",
            "South Webster", "Southington", "Sparta", "Spencer", "Spencerville",
            "Spring Valley", "Springboro", "Springfield", "Stafford", "Sterling",
            "Steubenville", "Stewart", "Stillwater", "Stockdale", "Stockport",
            "Stone Creek", "Stony Ridge", "Stout", "Stoutsville", "Stow", "Strasburg",
            "Stratton", "Streetsboro", "Strongsville", "Struthers", "Stryker",
            "Sugar Grove", "Sugarcreek", "Sullivan", "Sulphur Springs", "Summerfield",
            "Summit Station", "Summitville", "Sunbury", "Swanton", "Sycamore",
            "Sycamore Valley", "Sylvania", "Syracuse", "Tallmadge", "Tarlton",
            "Terrace Park", "The Plains", "Thompson", "Thornville", "Thurman",
            "Thurston", "Tiffin", "Tiltonsville", "Tipp City", "Tippecanoe", "Tiro",
            "Toledo", "Tontogany", "Torch", "Toronto", "Tremont City", "Trenton",
            "Trimble", "Trinway", "Troy", "Tuppers Plains", "Tuscarawas", "Twinsburg",
            "Uhrichsville", "Union City", "Union Furnace", "Unionport", "Uniontown",
            "Unionville", "Unionville Center", "Uniopolis", "Upper Sandusky", "Urbana",
            "Utica", "Valley City", "Van Buren", "Van Wert", "Vandalia", "Vanlue",
            "Vaughnsville", "Venedocia", "Vermilion", "Verona", "Versailles",
            "Vickery", "Vienna", "Vincent", "Vinton", "Wadsworth", "Wakefield",
            "Wakeman", "Walbridge", "Waldo", "Walhonding", "Walnut Creek", "Wapakoneta",
            "Warnock", "Warren", "Warsaw", "Washington Court House",
            "Washingtonville", "Waterford", "Waterloo", "Watertown", "Waterville",
            "Wauseon", "Waverly", "Wayland", "Wayne", "Waynesburg", "Waynesfield",
            "Waynesville", "Wellington", "Wellston", "Wellsville", "West Alexandria",
            "West Chester", "West Elkton", "West Farmington", "West Jefferson",
            "West Lafayette", "West Liberty", "West Manchester", "West Mansfield",
            "West Millgrove", "West Milton", "West Point", "West Portsmouth",
            "West Rushville", "West Salem", "West Union", "West Unity", "Westerville",
            "Westfield Center", "Westlake", "Weston", "Westville", "Wharton",
            "Wheelersburg", "Whipple", "White Cottage", "Whitehouse", "Wickliffe",
            "Wilberforce", "Wilkesville", "Willard", "Williamsburg", "Williamsfield",
            "Williamsport", "Williamstown", "Williston", "Willoughby", "Willow Wood",
            "Willshire", "Wilmington", "Wilmot", "Winchester", "Windham", "Windsor",
            "Winesburg", "Wingett Run", "Winona", "Wolf Run", "Woodsfield",
            "Woodstock", "Woodville", "Wooster", "Wren", "Xenia", "Yellow Springs",
            "Yorkshire", "Yorkville", "Youngstown", "Zaleski", "Zanesfield", "Zanesville",
            "Zoar"
        ],
        {
            delay:10,
            minChars:1,
            matchSubset:1,
            onItemSelect:selectItem,
            onFindValue:findValue,
            autoFill:true,
            maxItemsToShow:10
        }
    );
});
</script>

   

 delay:10 表示每次请求演示 10毫秒
 maxItemsToShow:10 表示每次结果只显示 10条
 autoFill:true, 表示自动填充

其他选项可以默认,也可以直接查看源代码进行设置! 如果觉得这个插件太过简单,可以在此基础上添加功能!


原文地址:https://www.cnblogs.com/wangpg/p/3470899.html