Ein cooles Automatik -Fertigstellungs -Plugin
http://twitter.github.io/typeahead.js
Verwenden Sie das TypeAhead -Plugin in Bootstrap, um die automatische Fertigstellung abzuschließen
Verwandte Dokumentation: https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md
Datenquelle:
Lokal: Array
Präfekte: JSON
Fern- und andere Methoden
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
HTML:
<input id = "orderno" placeholder = "Länder" Typ = "Text" name = "ordnersn">
JS:
var States = New Bloodhound ({datumTokenizer: bloodhound.tokenizers.whITespace, queryTokenizer: bloodhound.tokenizers Bloodhound.tokenizers.obj.whITespace ('value'), queryTokenizer: bloodhound.tokenizers.whITespace, prefetch: '$ {ctx} /admin/order/preorderByIdvague.json',remote: {url: '$ {ctx} /admin/order/findOrderByIdvague/%Query.json'WILDCARD:'%query '}, AfterSelect: Funktion (Element) {// Das Ereignis nach dem Auswahlelement ist derzeit ausgewählt .TypeAhead '). TypeAdhead ({Hinweis: TRUE, Highlight: TRUE, MINSCHALT: 1}, {Name:' States ', Quelle: States}); .TypeAwhead '). Bind (' typeAeAt: select ', function (ev, suggestion) {console.log (' Selektion: ' + suggestion.Value);});}); … FindOrderByIdvague/d20150502.json: [{"Wert": "D20150502173435141299"}, {"Wert": "D20150502172928109304"}]PreordbyIdvague.json:
[{"Wert": "D201"}]Ereignisse mit Dokumenten:
Benutzerdefinierte Ereignisse, auf dem die folgenden Ereignisse im Eingangselement während des Lebenszyklus einer Typeakhead ausgelöst werden. Feuert beim Verlust der Eingabe den Fokus und der Wert hat sich geändert, seit er ursprünglich Focus erhalten hat. Der Ereignishandler wird mit 4 Argumenten aufgerufen: dem JQuery -Ereignisobjekt, den Vorschlägen, die wiedergegeben wurden, ein Flag, das angibt, ob die Vorschläge asynchron abgerufen wurden, und der Name des Datensatzes, das das Rendering in einem in der Typeabie ausgewählten Vorschlag ausgewählt wurde, wenn ein Vorschlag ausgewählt wird. Der Ereignishandler wird mit 2 Argumenten aufgerufen: das JQuery -Ereignisobjekt und das ausgewählte Vorschlagsobjekt. Der Ereignishandler wird mit 2 Argumenten aufgerufen: dem JQuery -Ereignisobjekt und dem Vorschlagsobjekt, das für die automatische Vervollständigung verwendet wurde. Der Ereignishandler wird mit 2 Argumenten aufgerufen: das JQuery -Ereignisobjekt und das Vorschlagsobjekt, das auf die Typeaehead: Asyncrequest verschoben wurde, wenn eine asynchronisierte Anfrage nach Vorschlägen gesendet wird. Der Ereignishandler wird mit 3 Argumenten aufgerufen: das JQuery -Ereignisobjekt, die aktuelle Abfrage und der Name des Datensatzes Die Async -Anforderung gehört zu. Der Ereignishandler wird mit 3 Argumenten aufgerufen: das JQuery -Ereignisobjekt, die aktuelle Abfrage und der Name des Datensatzes Die asynchronisierte Anforderung gehörte zu. Der Ereignishandler wird mit 3 Argumenten aufgerufen: das JQuery -Ereignisobjekt, die aktuelle Abfrage und der Name des Datensatzes Die asynchronisierende Anforderung gehört zu. Beispiele: $ ('. TypeAwhead'). Bind ('typeAwhead: select', function (ev, Vorschlag) {console.log ('selection:' + Vorschlag);};};};};};typeAeaad.bundle.js:
/*!* typeAead.js 0.11.1* https://github.com/twitter/typeahead.js* Copyright 2013-2015 Twitter, Inc. und andere Mitwirkende; Lizenzierte MIT*/(Funktion (root, factory) {if (typeof define === "function" && define.amd) {define ("bloodhound", ["jQuery"], function (a0) {return root ["bloodhound"] = factory (a0);}); factory (fordert ("jQuery"));} else {root ["bloodHound"] = factory (jQuery);}}) (this, function ($) {var _ = function () {"strict"; return {ismsie: function () {return /(msie|/i.Test(Navigator.UnaVig.UnaTent ((Masseragent). | RV :) (/d+(./ D+)?)/I) [2]: Falsch;}, IsblanString: Funktion (str) {return! str || /^/s*$/.test(str); Str.Replace (/= //-/[///iverwalt $ .isarray, isfunction: $ .isfunktion, isObject: $ .SlainObject, isundefined: function (obj) {return typeof obj === "undefined";}, iSelement: function (obj) {return !! (obj.nodetype ==== 1); $;}, tostr: Funktion tostr (s) {return _.isundefined (s) || s === null? $ .grep, jede: Funktion (obj, test) {var result = true; if (! obj) {return Ergebnis;} $. Jede (obj, function (key, val) {if (! (result = test.call (null, val, taste, taste)) {return false;}}); result;} $. Jeweils (obj, function (Schlüssel, val) {if (result = test.call (null, val, key, obj)) {return false;}}; return !! result;}, mixin: $ .extend, identität: function (x) {return x;}, clone: oBj) {{EXTRING $. function () {var counter = 0; return function () {return counter ++;};}, templatify: function temlatify (obj) {return $ .isfunction (obj)? Timeout, Ergebnis; return function () {var context = this, args = arguments, später, callnow; später = function () {timeout = null; if (! unmittelbar) {result = func.apply (Kontext, args);}}; Func.Apply (Kontext, args);} Rückgabeergebnis;};}, Droseltle: function (func, wait) {var context, args, timeout, resots, vorher, später; voreiner = 0; später = function () {vorher = neuer Date () timeout = null; result = func.apply (context, args) {};};}; vorher); context = this; args = arguments; if (resting <= 0) {ClearTimeOut (Timeout); Timeout = null; vorher; nun; result = func.apply (Kontext, Args);} else wenn (! Timeout) {Timeout = SetTimeout (später, return); JSON.Stringify (Val);}, Noop: function () {}};} (); var Version = "0.11.1"; GetObjtokenizer (Whitespace)}}; setKey (keys) {keys = _.isArray (keys)? Tokens;};};}} (); var lrucache = function () {"Strict"; Funktion lrucache (maxSize) {this.maxsize = _.isNumber (maxSize)? $ .noop;}} _. mixin (lrucache.prototype, {set: function set (taste, val) {var Tailitem = this.list.tail, node; if (this.size> = this.maxsize) {this.list.lemove (Taily); {node.val = val; this.list.movetofront (node);} else {node = neuer node (taste, val); this.list.add (node); thash [key] = node; this.size ++;}} {this.list.movetofront (Knoten); return node.val;}}, reset: function reset () {this.size = 0; this.hash = {}; this.list = new list ();}}); Funktionsliste () {this.head = this.tail = add. (this.head) {node.next = this.head; this.head.prev = node;} this.head = node; node.prev: this.tail = node.prev;}, moveTofront: function (node) {this.remove (node); function () {"Strict"; var local_storage; try {local_storage = window.localstorage; local_storage.setItem ("~~~", "!"); local_storage.removeItem ("~~~"); ["__", Namespace, "__"] .Join (""); this.ttlkey = "__ttl __"; this._noop();}_.mixin(PersistentStorage.prototype, {_prefix: function(key) {return this.prefix + key;},_ttlKey: function(key) {return this._prefix(key) + this.ttlKey;},_noop: function() {this.get = this.set = this.remove = this.clear = this.isexpired = _.noop;}, _ Safeset: function (key, val) {try {this.setItem (key, val);} catch (err) {if (err.name === "quotaexedereRror") {this.clear (); (this.isexpired (Schlüssel)) {this.remove (key);} return decode (this.ls.getItem (this._prefix (Schlüssel));}, set: function (key, val, ttl) {if (_.isnumber (ttl) {this._Safeset (this._ttly) (tttl) (ths._ttlkey (tttly), usw. (this._ttlkey (tttly), usw. (this._ttlkey (tttly), usw. (this._ttlkey (tttlkey {this.ls.removeem (this._ttlkey (key));} return this._safeset (this._prefix (key), codieren (val));}, Funktion (Schlüssel) {this.ls.removeIntem (this.tttlkey); function () {var i, keys = gathermatchingKeys (this.keyMatcher); für (i = keys.length; i--;) {this.remove (keys [i]);} return this;}, iSexpired: function (key) {var ttl = decode (this.ls.Getitem (ttttlkey jetzt ()> ttl? i, key, keys = [], len = local_storage.length; für (i = 0; i <len; i ++) {if ((key = local_Storage.Key (i)). Match (keymatcher)) {keys.push.push (key.Replace (Keymatcher), "); strict "; var PendingRequestSCOUNT = 0, anhängigRequests = {}, maxpendingRequests = 6, SharedCache = new lrucache (10); Funktion transport (o) {o = o || {}; this.cancelled = false; O.Limiter (this._get): this._get; this._cache = o.cache === false? {SharedCache.reset ();}; _. mixin (transport.Prototyp, {_fingerabdruck: Funktion fingerabdruck (o) {o = o || {}; JQXHR; {PendingRequestScount ++; resp);} Funktion fail () {cb (true); {var resp, Fingerabdruck; CB = CB || resp);} else {this._get (o, cb);}}, abbrechen: function () {this.cancelled = true;}}); (! O.DatumTokenizer ||! this.reset ();} _. mixin (SearchIndex.Prototype, {Bootstrap: Funktion bootstrap (o) {this.datums = o.datums; this.trie = O.TRIE;}, add: function (Data) {var that this; Data = _.isarray (Data) _ Data) _ Data) _, ahd (Data). Token; Knoten [Kinder] [CH] ||. Token, Übereinstimmungen; Tokens = Normalizetokens (this.QueryTokenizer (Abfrage)); chars.Shift ()) {node = node [children] [ch];} if (node && chars.length === 0) {ids = node [ids] .lice (0); Matches = Übereinstimmungen? function(id) {return that.datums[id];}) : [];},all: function all() {var values = [];for (var key in this.datums) {values.push(this.datums[key]);}return values;},reset: function reset() {this.datums = {};this.trie = newNode();},serialize: function serialize() {return {datums: this.datums,trie: this.trie};}});return SearchIndex;function normalizeTokens(tokens) {tokens = _.filter(tokens, function(token) {return !!token;});tokens = _.map(tokens, function(token) {return token.tolowerCase ();}); return tokens;} function newnode () {var node = {}; node [ids] = []; node [Kinder] = {}; return node;} function eindeutig (Array) {var segth = {}, uniques = []; für (var i = 0, len (! Sehen [Array [i]]) {gesehen [Array [i]] = true; uniques.push (Array [i]);}} return uniques;} Funktion getintersection (Arraya, arrayb) {var ai = 0, bi = 0, Intersection = [] arraya = arraya.sort (); arraya.sort (); arrayA.length, lenArrayB = arrayB.length;while (ai < lenArrayA && bi < lenArrayB) {if (arrayA[ai] < arrayB[bi]) {ai++;} else if (arrayA[ai] > arrayB[bi]) {bi++;} else {intersection.push(arrayA[ai]);ai++;bi++;}}return intersection;}}();var Prefetch = function() {"use strict";var keys;keys = {data: "data",protocol: "protocol",thumbprint: "thumbprint"};function Prefetch(o) {this.url = o.url; this.ttl = o.ttl; this.cache = o.cache; this.prepare = o.prepare; this.transform = o.transform; this.transport = o.transport; thumbprint = O.Thumbprint; thum.storage = new PersistentStorage (O.CacheKey); {_Settings: Funktionseinstellungen () {return {url: this.url, Typ: "get", DataType: "JSON"};}, speichern: function Store (data) {if (! this.cache) {return;} this.storage.set (keys.data, data.ttl); this.ttl); this.storage.set (keys.thumbprint, thumbprint, this.ttl);}, FromCache: Funktion fromCache () {var laged = {}, isexpired; if (! this.cache) {return null;} Stored. this.storage.get (keys.protocol); gespeichert.Thumbprint = this.storage.get (Keys.Thumbprint); Funktion (cb) {var that = this, Einstellungen; if (! cb) {return;} Einstellungen = this.prepare (this._Setings ()); this.transport (Einstellungen) .Fail (OnError). that.transform (resp));}}, Clear: function clear () {this.storage.clear (); return this;}}); Transport ({Cache: O.Cache, Limiter: O.Limiter, Transport: O.Transport});} _. Mixin (Remote.Prototype, {_Setings: Funktionseinstellungen () {return {url: this.url, Typ: "Get", DataType: "JSON;};};}; (! cb) {return;} query = query || ""; "; {this.transport.cancel();}});return Remote;}();var oParser = function() {"use strict";return function parse(o) {var defaults, sorter;defaults = {initialize: true,identify: _.stringify,datumTokenizer: null,queryTokenizer: null,sufficial: 5,sorter: null,local: [], Prefetch: Null, Remote: NULL}; X.Sort (SORTER);}: _. Identität; O.Local = _.isfunction (O.Local)? {return null;} defaults = {url: null, ttl: 24 * 60 * 60 * 1e3, cache: true, cachekey: null, thumbprint: "", vorbereiten: _. identisch, Transformation: _. Identität, Transport: Null}; o);! O.url && $ .Error ("Vorbereitungen erfordert URL"); O.Transform = O.filter || o;} Funktion parsereMote (o) {var defaults; if (! o) {return;} defaults = {url: null, cache: true, vorbereiten: null, ersetzen: null, windcard: null, limit: null, ratelimitby: "dunounion", ratelimitwait: 300, _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. _. {url: o}: o; o = _.mixin (Standards, O);! O.url && $ .Error ("Remote erfordert eine URL"); O.Transform = O.filter || callbackTodeferred (O.Transport): $ .ajax; lösche o.replace; löte o.wildcard; lösche o.Ratelimitby; (vorbereiten) {return prepe;} if (ersetzen) {prepeByByReplace;} else if (o.wildcard) {preped = prepeByWildCard;} else {prepe = identityPrepare;} return prepe; function prepeByRyReplace (Abfrage, Einstellungen) {{settys. {Einstellungen.Url = Settings.Url.Replace (Wildcard, Encodeuricomponent (Abfrage)); Return -Einstellungen;} Funktion identityPrepare (Abfrage, Einstellungen) {Return -Einstellungen;}} Funktion Tolimiter (o) {var limitierer, method, wait; (! Limiter) {Limiter = /^ Throttle$/i.test(Method)? Warten Sie);};}} Funktion callbackTodeferred (fn) {return function wrapper (o) {var deferred = $ .Deferred (); {_. O.Suffivet; this.Local = O.Local; this.remote = o.remote? O.QueryTokenizer}); o.initialize! ttadapter () {var that = this; this.remote? {var that = this, deferred, serialized;deferred = $.Deferred();if (!this.prefetch) {deferred.resolve();} else if (serialized = this.prefetch.fromCache()) {this.index.bootstrap(serialized);deferred.resolve();} else {this.prefetch.fromNetwork (done);} return deferred.promise (); Funktion DEM (ERR, Daten) {if (err) {return depered.Reject ();}, dass.add (data); that.prefetch.store (this.index.Serialize (); = this, aufgeschoben; this.clear (); (this.initpromise = this._loadprefetch ()). this.initpromise;}, fördern Sie: Funktion add (data) {this.index.add (data); zurück; = this.Sorter (this.index.search (query)); processRemote(remote) {var nonDuplicates = [];_.each(remote, function(r) {!_.some(local, function(l) {return that.identify(r) === that.identify(l);}) && nonDuplicates.push(r);});async && async(nonDuplicates);}},all: function all() {return this.index.All ();}, Clear: function clear () {this.index.reset (); return this;}, ClearPrefetchcache: Funktion clearprefetchcache () {this.prefetch && this.prefetch.clear (); this;}, ttadapter: function ttadapter () {return this .__ ttAdapter ();}}); return bloodhound;} (); factory(a0);});} else if (typeof exports === "object") {module.exports = factory(require("jquery"));} else {factory(jQuery);}})(this, function($) {var _ = function() {"use strict";return {isMsie: function() {return /(msie| {return str.replace(/[/-/[/]///{/}/(/)/*/+/?/.///^/$/|]/g, "//$&");},isString: function(ob j) {return typeof obj === "string";},isNumber: function(obj) {return typeof obj === "number";},isArray: $ .Isarra y, isfunction: $ .isfunction, isObject: $ .SlainObject, isundefined: Funktion (obj) {return typeof obj === "undefined";}, ISElement: Funktion (obj) {return !! (obj && obj.nodetype ==== 1); tostr (s) {return _.isundefined (s) || S === NULL? ": Ergebnis;} $. Jeweils (obj, function (Schlüssel, val) {if (! (result = test.call (null, val, taste, obj)) {return false;}}); Ergebnis;}, einige: Funktion (obj, test) {var result = false; if (! obj) {return {ca.}} $. Schlüssel, obj)) {return false;}}); return !! result;}, mixin: $ .extend, identität: function (x) {return x;}, klon: function (obj) {return $ .extend (true, {}, OBJ); templatify (obj) {return $ .isFunction (obj)? OBJ: Template; Funktion template () {return String (obj);}}, Defer: Funktion (fn) {setTimeout (fn, 0);}, dabounce: function (func, wait, unmittelbar) {var timeout, Ergebnis; return function () {var context = this, Argumente, später, später, später, später. func.apply(context, args);}};callNow = immediate && !timeout;clearTimeout(timeout);timeout = setTimeout(later, wait);if (callNow) {result = func.apply(context, args);}return result;};},throttle: function(func, wait) {var context, args, timeout, result, previous, later; vorher = 0; später = function () {vorher = neuer Datum (); timeout = null; result = func.apply (context, args);}; return function () {var nun = new Date (), resting = wait - (jetzt - vorher); context = this; args = argumente; if (resting <= 0) {ClearTimeout (Timeout); Timeout = null; nun; nun; ergebnis = func.Antly (texts) {{text) {texte ({text) {{texts ({textec) {{textec. setTimeout (später, verbleibend);} Rückgabeergebnis;};}, Stringify: Funktion (val) {return _.isstring (val)? val : JSON.stringify(val);},noop: function() {}};}();var WWW = function() {"use strict";var defaultClassNames = {wrapper: "twitter-typeahead",input: "tt-input",hint: "tt-hint",menu: "tt-menu",dataset: "tt-dataset",suggestion: "tt-suggestion", wählbar: "tt-selektierbar", leer: "tt-tempy", öffnen: "tt-open", Cursor: "tt-cursor", highlight: "tt-highlight"}; {CSS: Buildcss (), Klassen: Klassen, HTML: Buildhtml (Klassen), Selektoren: BuildSelectors (Klassen)}; www);}};} Funktion Buildhtml (c) {return {wrack: '<span> </span>', Menü: '<div> </div>'};} Funktion BuildSelectors (Klassen) {var selektoren = {}; _. BuildCSS () {var css = {Wrapper: {Position: "Relative", Anzeige: "Inline-Block"}, Hinweis: {Position: "Absolute", oben: "0", links: "0", BorderColor: "Transparent", BoxShadow: "None", Opacity: 1 "TOP: "transparent"},inputWithNoHint: {position: "relative",verticalAlign: "top"},menu: {position: "absolute",top: "100%",left: "0",zIndex: "100",display: "none"},ltr: {left: "0",right: "auto"},rtl: {left: "auto",right: "0"}}; if (_.ismsie ()) {_.mixin (css.input, {HintergrundImage: "URL (Daten: Image/Gif; Base64, r0lgodlhaqabaiaaaaaaaaaaap /// Yh5baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7)"}); Depressionmap; Namespace = "TypeAdhead:"; DepressMap = {Render: "gerendert", Cursorchange: "CursorChanged", SELECT: "Selected", AutoComplete: "automatisch vervollständigt"}; $ (o.el);} _. mixin (EventBus.Prototype, {_trigger: function (type, args) {var $ e; $ e = $ .event (namespace + type); $ e; args = [] .Slice.call (Argumente, 1); $ e = this._trigger ("vor" + Typ, Args); return $ e.isdefaultPrevented ();}, Trigger: Funktion (Typ) {var deprescatedtype; {this._trigger (deprescatedType, [] .lice.call (Argumente, 1));}}}); return eventbus;} (); var eventemitter = function () {"strikt verwenden"; var splitter = // s+/, nextTick = getnextTick (); Trigger}; Funktion auf (Methode, Typen, CB, Kontext) {var type; if (! cb) {return this;} Typen = Typen.Split (splitter); cb = context? BindContext (CB, Kontext): CB; this._callbacks = this._callbacks || {}; while (type = type.shift ()) {this._callbacks [type] = this._callbacks [type] || {sync: [], async: []}; this._callbacks [type] [methode] .push (cb);} return this;} Funktion onaSync (Typen, cb, context) {return on.call (this, "async", Typ, CB, Context); CB, Kontext);} Funktion off (Typen) {var type; if (! this.callbacks) {return this;} Typen = Typen.Split (splitter); while (type = type.shift ()) {löschen this._callbacks [type];} return this;} Funktion Trigger (Typen) {var Typ, Rückrufe, Argumente, Syncflush, Asyncflush; if (! Dies._callbacks) {return this; Typen.Shift ()) && (callbacks = this._callbacks [type]) {syncflush = getflush (callbacks.sync, this, [type] .concat (args)); Getflush (Callbacks, Kontext, Args) {return Flush; Funktion flush () {var storniert; für (var i = 0, len = callbacks.length;! Abgebrochen && i <len; i += 1) {abgebrochen = Rückrufe [i] .And (Kontext, Argumente) == false;} zurück; (window.setimmediate) {NextTickfn = Funktion NextTickSetimmediate (fn) {setimmediate (function (function () {fn ();});} else {nextTickfn = function NextTickSettimeout (fn) {setTimeout (function () {{)}, 0)};};};};}}} usw.}; Kontext) {return fn.bind? fn.bind (context): function () {fn.apply (context, [] .lice.call (Argumente, 0));};}} (); var highlight = function (doc) {"Verwenden Sie strikte"; Highlight (o) {var regex; o = _.mixin ({}, Standards, o); if (! o.node ||! o.pattern) {return;} o.pattern = _.isArray (o.pattern)? o.pattern : [ o.pattern ];regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);traverse(o.node, highlightTextNode);function highlightlightTextNode(textNode) {var match, patternNode, wrapperNode;if (match = regex.exec(textNode.data)) {wrapperNode = doc.createElement(o.tagName);o.className && (wrapperNode.className = o.className);patternNode = textNode.splitText(match.index);patternNode.splitText(match[0].length);wrapperNode.appendChild(patternNode.cloneNode(true));textNode.parentNode.replaceChild(wrapperNode, patternNode);}return !!match;}function traverse(el, highlightTextNode) {var childNode, TEXT_NODE_TYPE = 3;for (var i = 0; i < el.childNodes.length; i++) {childNode = el.childNodes[i];if (childNode.nodeType === TEXT_NODE_TYPE) {i += highlightTextNode(childNode) ? 1 : 0;} else {traverse(childNode, highlightTextNode);}}}};function getRegex(patterns, caseSensitive, wordsOnly) {var escapedPatterns = [], regexStr;for (var i = 0, len = patterns.length; i < len; i++) {escapedPatterns.push(_.escapeRegExChars(patterns[i]));}regexStr = wordsOnly ? "//b(" + escapedPatterns.join("|") + ")//b" : "(" + escapedPatterns.join("|") + ")";return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i");}}(window.document);var Input = function() {"use strict";var specialKeyCodeMap;specialKeyCodeMap = {9: "tab",27: "esc",37: "left",39: "right",13: "enter",38: "up",40: "down"};function Input(o, www) {o = o || {};if (!o.input) {$.error("input is missing");}www.mixin(this);this.$hint = $(o.hint);this.$input = $(o.input);this.query = this.$input.val(); this.queryWhenFocused = this.hasFocus() ? this.query : null;this.$overflowHelper = buildOverflowHelper(this.$input);this._checkLanguageDirection();if (this.$hint.length === 0) {this.setHint = this.getHint = this.clearHint = this.clearHint IfInvalid = _.noop;}}Input.normalizeQuery = function(str) {return _.toStr(str).replace(/^/s*/g, "").replace(//s{2,}/g, " ");};_.mixin(Input.prototype, EventEmitter, {_onBlur: function onBlur() {this.resetInputValue();this.trigger("blurred");},_onFocus: function onFocus() {this.queryWhenFocused = this.query;this.trigger("focused");},_onKeydown: function onKeydown($e) {var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; this._managePreventDefault(keyName, $e);if (keyName && this._shouldTrigger(keyName, $e)) {this.trigger(keyName + "Keyed", $e);}},_onInput: function onInput() {this._setQuery(this.getInputValue());this.clearHintIfInvalid();this._checkLanguageDirection();},_managePreventDefault: function managePreventDefault(keyName, $e) {var preventDefault;switch (keyName) {case "up":case "down":preventDefault = !withModifier($e);break;default:preventDefault = false;}preventDefault && $e.preventDefault();},_shouldTrigger: function shouldTrigger(keyName, $e) {var trigger;switch (keyName) {case "tab":trigger = !withModifier($e);break;default:trigger = true;}return trigger;},_checkLanguageDirection: function checkLanguageDirection() {var dir = (this.$input.css("direction") || "ltr").toLowerCase();if (this.dir !== dir) {this.dir = dir;this.$hint.attr("dir", dir);this.trigger("langDirChanged", dir);}},_setQuery: function setQuery(val, silent) {var areEquivalent, hasDifferentWhitespace; areEquivalent = areQueriesEquivalent(val, this.query);hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;this.query = val;if (!silent && !areEquivalent) {this.trigger("queryChanged", this.query);} else if (!silent && hasDifferentWhitespace) {this.trigger("whitespaceChanged", this.query);}},bind: function() {var that = onBlur, onFocus, onKeydown, onInput;onBlur = _.bind(this._onBlur, this);onFocus = _.bind(this._onFocus, this);onKeydown = _.bind(this._onKeydown, this);onInput = _.bind(this._onInput, this);onInput = _.bind(this._onInput, this);this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown);if (!_.isMsie() || _.isMsie() > 9) {this.$input.on("input.tt", onInput);} else {this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) {if (specialKeyCodeMap[$e.which || $e.keyCode]) {return;}_.defer(_.bind(that._onInput, that, $e));});});} return this;},focus: function focus() {this.$input.focus();},blur: function blur() {this.$input.blur();},getLangDir: function getLangDir() {return this.dir;},getQuery: function getQuery() {return this.query || "";},setQuery: function setQuery(val, silent) {this.setInputValue(val);this._setQuery(val, silent);},hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {return this.query !== this.queryWhenFocused;},getInputValue: function getInputValue() {return this.$input.val();},setInputValue: function setInputValue(value) {this.$input.val(value);this.clearHintIfInvalid();this._checkLanguageDirection();},resetInputValue: function resetInputValue() {this.setInputValue(this.query);},getHint: function getHint() {return this.$hint.val();},setHint: function setHint(value) {this.$hint.val(value);},clearHint: function clearHint() {this.setHint("");},clearHintIfInvalid: function clearHintIfInvalid() {var val, hint, valIsPrefixOfHint, isValid;val = this.getInputValue();hint = this.getHint();valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow();!isValid && this.clearHint();},hasFocus: function hasFocus() {return this.$input.is(":focus");},hasOverflow: function hasOverflow() {var constraint = this.$input.width() - 2;this.$overflowHelper.text(this.getInputValue());return this.$overflowHelper.width() >= constraint;},isCursorAtEnd: function() {var valueLength, selectionStart, range;valueLength = this.$input.val().length;selectionStart = this.$input[0].selectionStart;if (_.isNumber(selectionStart)) {return selectionStart === valueLength;} else if (document.selection) {range = document.selection.createRange();range.moveStart("character", -valueLength);return valueLength === range.text.length;}return true;},destroy: function destroy() {this.$hint.off(".tt");this.$input.off(".tt");this.$overflowHelper.remove();this.$hint = this.$input = this.$overflowHelper = $("<div>");}});return Input;function buildOverflowHelper($input) {return $('<pre aria-hidden="true"></pre>').css({position: "absolute",visibility: "hidden",whiteSpace: "pre",fontFamily: $input.css("font-family"),fontSize: $input.css("font-size"),fontStyle: $input.css("font-style"),fontVariant: $input.css("font-variant"),fontWeight: $input.css("font-weight"),wordSpacing: $input.css("word-spacing"),letterSpacing: $input.css("letter-spacing"),textIndent: $input.css("text-indent"),textRendering: $input.css("text-rendering"),textTransform: $input.css("text-transform")}).insertAfter($input);}function areQueriesEquivalent(a, b) {return Input.normalizeQuery(a) === Input.normalizeQuery(b);}function withModifier($e) {return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;}}();var Dataset = function() {"use strict";var keys, nameGenerator;keys = {val: "tt-selectable-display",obj: "tt-selectable-object"};nameGenerator = _.getIdGenerator();function Dataset(o, www) {o = o || {};o.templates = o.templates || {};o.templates.notFound = o.templates.notFound || o.templates.empty;if (!o.source) {$.error("missing source");}if (!o.node) {$.error("missing node");}if (o.name && !isValidName(o.name)) {$.error("invalid dataset name: " + o.name);}www.mixin(this); this.highlight = !!o.highlight; this.name = o.name || nameGenerator(); this.limit = o.limit || 5; this.displayFn = getDisplayFn(o.display || o.displayKey); this.templates = getTemplates(o.templates, this.displayFn);this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;this._resetLastSuggestion();this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name);}Dataset.extractData = function extractData(el) {var $el = $(el);if ($el.data(keys.obj)) {return {val: $el.data(keys.val) || "",obj: $el.data(keys.obj) || null};}return null;};_.mixin(Dataset.prototype, EventEmitter, {_overwrite: function overwrite(query, suggestions) {suggestions = suggestions || [];if (suggestions.length) {this._renderSuggestions(query, suggestions);} else if (this.async && this.templates.pending) {this._renderPending(query);} else if (!this.async && this.templates.notFound) {this._renderNotFound(query);} else {this._empty();} this.trigger("rendered", this.name, suggestions, false);},_append: function append(query, suggestions) {suggestions = suggestions || [];if (suggestions.length && this.$lastSuggestion.length) {this._appendSuggestions(query, suggestions);} else if (suggestions.length) {this._renderSuggestions(query, suggestions);} else if (!this.$lastSuggestions.length && this.templates.notFound) {this._renderNotFound(query);} this.trigger("rendered", this.name, suggestions, true);},_renderSuggestions: function renderSuggestions(query, suggestions) {var $fragment;$fragment = this._getSuggestionsFragment(query, suggestions); this.$lastSuggestion = $fragment.children().last(); this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));},_appendSuggestions: function appendSuggestions(query, suggestions) {var $fragment, $lastSuggestion;$fragment = this._getSuggestionsFragment(query, suggestions));},_appendSuggestions: function appendSuggestions(query, suggestions) {var $fragment, $lastSuggestion;$fragment = this._getSuggestionsFragment(query, suggestions);$lastSuggestion = $fragment.children().last();this.$lastSuggestion.after($fragment);this.$lastSuggestion = $lastSuggestion;},_renderPending: function renderPending(query) {var template = this.templates.pending;this._resetLastSuggestion();template && this.$el.html(template({query: query,dataset: this.name}));},_renderNotFound: function renderNotFound(query) {var template = this.templates.notFound; this._resetLastSuggestion();template && this.$el.html(template({query: query,dataset: this.name}));},_empty: function empty() {this.$el.empty(); this._resetLastSuggestion();},_getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {var that = this, fragment;fragment = document.createDocumentFragment();_.each(suggestions, function getSuggestionNode(suggestion) {var $el, context;context = that._injectQuery(query, suggestion);$el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable);fragment.appendChild($el[0]);});this.highlight && highlight({className: this.classes.highlight,node: fragment,pattern: query});return $(fragment);},_getFooter: function getFooter(query, suggestions) {return this.templates.footer ? this.templates.footer({query: query,suggestions: suggestions,dataset: this.name}) : null;},_getHeader: function getHeader(query, suggestions) {return this.templates.header ? this.templates.header({query: query,suggestions: suggestions,dataset: this.name}) : null;},_resetLastSuggestion: function resetLastSuggestion() {this.$lastSuggestion = $();},_injectQuery: function injectQuery(query, obj) {return _.isObject(obj) ? _.mixin({_query: query}, obj) : obj;},update: function update(query) {var that = this, canceled = false, syncCalled = false, rendered = 0;this.cancel();this.cancel = function cancel() {cancel = true;that.cancel = $.noop;that.async && that.trigger("asyncCanceled", query);};this.source(query, sync, async);!syncCalled && sync([]);function sync(suggestions) {if (syncCalled) {return;}syncCalled = true;suggestions = (suggestions || []).slice(0, that.limit);reendered = suggestions.length;that._overwrite(query, suggestions);if (rendered < that.limit && that.async) {that.trigger("asyncRequested", query);}}function async(suggestions) {suggestions = suggestions || [];if (!cancel && rendered < that.limit) {that.cancel = $.noop;rendered += suggestions.length;that._append(query, suggestions.slice(0, that.limit - rendered));that.async && that.trigger("asyncReceived", query);}}},cancel: $.noop,clear: function clear() {this._empty();this.cancel();this.trigger("cleared");},isEmpty: function isEmpty() {return this.$el.is(":empty");},destroy: function destroy() {this.$el = $("<div>");}});return Dataset;function getDisplayFn(display) {display = display || _.stringify;return _.isFunction(display) ? display : displayFn;function displayFn(obj) {return obj[display];}}function getTemplates(templates, displayFn) {return {notFound: templates.notFound && _.templatify(templates.notFound),pending: templates.pending && _.templatify(templates.pending),header: templates.header && _.templatify(templates.header),footer: templates.footer && _.templatify(templates.footer),suggestion: templates.suggestion || suggestionTemplate};function suggestionTemplate(context) {return $("<div>").text(displayFn(context));}}function isValidName(str) {return /^[_a-zA-Z0-9-]+$/.test(str);}}();var Menu = function() {"use strict";function Menu(o, www) {var that = this;o = o || {};if (!o.node) {$.error("node is required");}www.mixin(this);this.$node = $(o.node);this.query = null;this.datasets = _.map(o.datasets, initializeDataset);function initializeDataset(oDataset) {var node = that.$node.find(oDataset.node).first();oDataset.node = node.length? node : $("<div>").appendTo(that.$node);return new Dataset(oDataset, www);}}_.mixin (Menu.prototype, EventEmitter, {_onSelectableClick: function onSelectableClick($e) {this.trigger("selectableClicked", $($e.currentTarget));},_onRendered: function onRendered(type, dataset, suggestions, async) {this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());this.trigger("datasetRendered", dataset, suggestions, async);},_onCleared: function onCleared() {this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); this.trigger("datasetCleared");},_propagate: function propagate() {this.trigger.apply(this, arguments);},_allDatasetsEmpty: function allDatasetsEmpty() {return _.every(this.datasets, isDatasetEmpty);function isDatasetEmpty(dataset) {return dataset.isEmpty();}},_getSelectables: function getSelectables() {return this.$node.find(this.selectors.selectable);},_removeCursor: function _removeCursor() {var $selectable = this.getActiveSelectable();$selectable && $selectable.removeClass(this.classes.cursor);},_ensureVisible: function ensureVisible($el) {var elTop, elBottom, nodeScrollTop, nodeHeight;elTop = $el.position().top;elBottom = elTop + $el.outerHeight(true);nodeScrollTop = this.$node.scrollTop();nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10);if (elTop < 0) {this.$node.scrollTop(nodeScrollTop + elTop);} else if (nodeHeight < elBottom) {this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));}},bind: function() {var that = this, onSelectableClick;onSelectableClick = _.bind(this._onSelectableClick, this);this.$node.on("click.tt", this.selectors.selectable, onSelectableClick);_.each(this.datasets, function(dataset) {dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that);});return this;},isOpen: function isOpen() {return this.$node.hasClass(this.classes.open);},open: function open() {this.$node.addClass(this.classes.open);},close: function close() {this.$node.removeClass(this.classes.open);this._removeCursor();},setLanguageDirection: function setLanguageDirection(dir) {this.$node.attr("dir", dir);},selectableRelativeToCursor: function selectableRelativeToCursor(delta) {var $selectables, $oldCursor, oldIndex, newIndex;$oldCursor = this.getActiveSelectable();$selectables = this._getSelectables();oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;newIndex = oldIndex + delta;newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;return newIndex === -1 ? null : $selectables.eq(newIndex);},setCursor: function setCursor($selectable) {this._removeCursor();if ($selectable = $selectable && $selectable.first()) {$selectable.addClass(this.classes.cursor);this._ensureVisible($selectable);}},getSelectableData: function getSelectableData($el) {return $el && $el.length ? Dataset.extractData($el) : null;},getActiveSelectable: function getActiveSelectable() {var $selectable = this._getSelectables().filter(this.selectors.cursor).first();return $selectable.length ? $selectable : null;},getTopSelectable: function getTopSelectable() {var $selectable = this._getSelectables().first();return $selectable.length ? $selectable : null;},update: function update(query) {var isValidUpdate = query !== this.query;if (isValidUpdate) {this.query = query;_.each(this.datasets, updateDataset);}return isValidUpdate;function updateDataset(dataset) {dataset.update(query);}},empty: function empty() {_.each(this.datasets, clearDataset);this.query = null;this.$node.addClass(this.classes.empty);function clearDataset(dataset) {dataset.clear();}},destroy: function destroy() {this.$node.off(".tt");this.$node = $("<div>");_.each(this.datasets, destroyDataset);function destroyDataset(dataset) {dataset.destroy();}}});return Menu;}();var DefaultMenu = function() {"use strict";var s = Menu.prototype;function DefaultMenu() {Menu.apply(this, [].slice.call(arguments, 0));}_.mixin(DefaultMenu.prototype, Menu.prototype, {open: function open() {!this._allDatasetsEmpty() && this._show();return s.open.apply(this, [].slice.call(arguments, 0));},close: function close() {this._hide();return s.close.apply(this, [].slice.call(arguments, 0));},_onRendered: function onRendered() {if (this._allDatasetsEmpty()) {this._hide();} else {this.isOpen() && this._show();} return s._onRendered.apply(this, [].slice.call(arguments, 0));},_onCleared: function onCleared() {if (this._allDatasetsEmpty()) {this._hide();} else {this.isOpen() && this._show();} return s._onCleared.apply(this, [].slice.call(arguments, 0));},setLanguageDirection: function setLanguageDirection(dir) {this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl);return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));},_hide: function hide() {this.$node.hide();},_show: function show() {this.$node.css("display", "block");}});return DefaultMenu;}();var Typeahead = function() {"use strict";function Typeahead(o, www) {var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;o = o || {};if (!o.input) {$.error("missing input");}if (!o.menu) {$.error("missing menu");}if (!o.eventBus) {$.error("missing event bus");}www.mixin(this);this.eventBus = o.eventBus;this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;this.input = o.input;this.menu = o.menu;this.enabled = true;this.active = false;this.input.hasFocus() && this.activate();this.dir = this.input.getLangDir();this._hacks();this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this);onFocused = c(this, "activate", "open", "_onFocused");onBlurred = c(this, "deactivate", "_onBlurred");onEnterKeyed = c(this, "isActivate", "isOpen", "_onEnterKeyed");onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed");onEscKeyed = c(this, "isActive", "_onEscKeyed");onUpKeyed = c(this, "isActive", "open", "_onUpKeyed");onDownKeyed = c(this, "isActive", "open", "_onDownKeyed");onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed");onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed");onQueryChanged = c(this, "_openIfActive", "_onQueryChanged");onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged");this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this);}_.mixin(Typeahead.prototype, {_hacks: function hacks() {var $input, $menu;$input = this.input.$input || $("<div>");$menu = this.menu.$node || $("<div>");$input.on("blur.tt", function($e) {var active, isActive, hasActive;active = document.activeElement; isActive = $menu.is(active); hasActive = $menu.has(active).length > 0;if (_.isMsie() && (isActive || hasActive)) {$e.preventDefault();$e.stopImmediatePropagation();_.defer(function() {$input.focus();});}});$menu.on("mousedown.tt", function($e) {$e.preventDefault();});},_onSelectableClicked: function onSelectableClicked(type, $el) {this.select($el);},_onDatasetCleared: function onDatasetCleared() {this._updateHint();},_onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) {this._updateHint();this.eventBus.trigger("render", suggestions, async, dataset);},_onAsyncRequested: function onAsyncRequested(type, dataset, query) {this.eventBus.trigger("asyncrequest", query, dataset);},_onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {this.eventBus.trigger("asynccancel", query, dataset);},_onAsyncReceived: function onAsyncReceived(type, dataset, query) {this.eventBus.trigger("asyncreceive", query, dataset);},_onFocused: function onFocused() {this._minLengthMet() && this.menu.update(this.input.getQuery());},_onBlurred: function onBlurred() {if (this.input.hasQueryChangedSinceLastFocus()) {this.eventBus.trigger("change", this.input.getQuery());}},_onEnterKeyed: function onEnterKeyed(type, $e) {var $selectable;if ($selectable = this.menu.getActiveSelectable()) {this.select($selectable) && $e.preventDefault();}},_onTabKeyed: function onTabKeyed(type, $e) {var $selectable;if ($selectable = this.menu.getActiveSelectable()) {this.select($selectable) && $e.preventDefault();} else if ($selectable = this.menu.getTopSelectable()) {this.autocomplete($selectable) && $e.preventDefault();}},_onEscKeyed: function onEscKeyed() {this.close();},_onUpKeyed: function onUpKeyed() {this.moveCursor(-1);},_onDownKeyed: function onDownKeyed() {this.moveCursor(+1);},_onLeftKeyed: function onLeftKeyed() {if (this.dir === "rtl" && this.input.isCursorAtEnd()) {this.autocomplete(this.menu.getTopSelectable());}},_onRightKeyed: function onRightKeyed() {if (this.dir === "ltr" && this.input.isCursorAtEnd()) {this.autocomplete(this.menu.getTopSelectable());}},_onQueryChanged: function onQueryChanged(e, query) {this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();},_onWhitespaceChanged: function onWhitespaceChanged() {this._updateHint();},_onLangDirChanged: function onLangDirChanged(e, dir) {if (this.dir !== dir) {this.dir = dir;this.menu.setLanguageDirection(dir);}},_openIfActive: function openIfActive() {this.isActive() && this.open();},_minLengthMet: function minLengthMet(query) {query = _.isString(query) ? query : this.input.getQuery() || "";return query.length >= this.minLength;},_updateHint: function updateHint() {var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;$selectable = this.menu.getTopSelectable();data = this.menu.getSelectableData($selectable);val = this.input.getInputValue();if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {query = Input.normalizeQuery(val);escapedQuery = _.escapeRegExChars(query);frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i");match = frontMatchRegEx.exec(data.val);match && this.input.setHint(val + match[1]);} else {this.input.clearHint();}},isEnabled: function isEnabled() {return this.enabled;},enable: function enable() {this.enabled = true;},disable: function disable() {this.enabled = false;},isActive: function isActive() {return this.active;},activate: function activated() {if (this.isActive()) {return true;} else if (!this.isEnabled() || this.eventBus.before("active")) {return false;} else {this.active = true; this.eventBus.trigger("active");return true;}},deactivate: function deactivate() {if (!this.isActive()) {return true;} else if (this.eventBus.before("idle")) {return false;} else {this.active = false;this.close();this.eventBus.trigger("idle");return true;}},isOpen: function isOpen() {return this.menu.isOpen();},open: function open() {if (!this.isOpen() && !this.eventBus.before("open")) {this.menu.open();this._updateHint();this.eventBus.trigger("open");}return this.isOpen();},close: function close() {if (this.isOpen() && !this.eventBus.before("close")) {this.menu.close();this.input.clearHint();this.input.resetInputValue();this.eventBus.trigger("close");} return !this.isOpen();},setVal: function setVal(val) {this.input.setQuery(_.toStr(val));},getVal: function getVal() {return this.input.getQuery();},select: function select($selectable) {var data = this.menu.getSelectableData($selectable);if (data && !this.eventBus.before("select", data.obj)) {this.input.setQuery(data.val, true);this.eventBus.trigger("select", data.obj);this.close();return true;} return false;},autocomplete: function autocomplete($selectable) {var query, data, isValid;query = this.input.getQuery();data = this.menu.getSelectableData($selectable);isValid = data && query !== data.val;if (isValid && !this.eventBus.before("autocomplete", data.obj)) {this.input.setQuery(data.val);this.eventBus.trigger("autocomplete", data.obj);return true;} return false;},moveCursor: function moveCursor(delta) {var query, $candidate, data, payload, cancelMove;query = this.input.getQuery();$candidate = this.menu.selectableRelativeToCursor(delta);data = this.menu.getSelectableData($candidate);payload = data ? data.obj : null;cancelMove = this._minLengthMet() && this.menu.update(query);if (!cancelMove && !this.eventBus.before("cursorchange", payload)) {this.menu.setCursor($candidate);if (data) {this.input.setInputValue(data.val);} else {this.input.resetInputValue();this._updateHint();}this.eventBus.trigger("cursorchange", payload);return true;}return false;},destroy: function destroy() {this.input.destroy();this.menu.destroy();}});return Typeahead;function c(ctx) {var methods = [].slice.call(arguments, 1);return function() {var args = [].slice.call(arguments);_.each(methods, function(method) {return ctx[method].apply(ctx, args);});};}}();(function() {"use strict";var old, keys, methods;old = $.fn.typeahead;keys = {www: "tt-www",attrs: "tt-attrs",typeahead: "tt-typeahead"};methods = {initialize: function initialize(o, datasets) {var www;datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);o = o || {};www = WWW(o.classNames);return this.each(attach);function attach() {var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, typeahead, MenuConstructor;_.each(datasets, function(d) {d.highlight = !!o.highlight;});$input = $(this);$wrapper = $(www.html.wrapper);$hint = $elOrNull(o.hint);$menu = $elOrNull(o.menu);defaultHint = o.hint !== false && !$hint;defaultMenu = o.menu !== false && !$menu;defaultHint && ($hint = buildHintFromInput($input, www));defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));$hint && $hint.val("");$input = prepInput($input, www);if (defaultHint || defaultMenu) {$wrapper.css(www.css.wrapper);$input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);$input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);}MenuConstructor = defaultMenu ? DefaultMenu : Menu;eventBus = new EventBus({el: $input});input = new Input({hint: $hint,input: $input}, www);menu = new MenuConstructor({node: $menu,datasets: datasets}, www);typeahead = new Typeahead({input: input,menu: menu,eventBus: eventBus,minLength: o.minLength}, www);$input.data(keys.typeahead, typeahead);}},isEnabled: function isEnabled() {var enabled;ttEach(this.first(), function(t) {enabled = t.isEnabled();});return enabled;},enable: function enable() {ttEach(this, function(t) {t.enable();});return this;},disable: function disable() {ttEach(this, function(t) {t.disable();});return this;},isActive: function isActive() {var active;ttEach(this.first(), function(t) {active = t.isActivate();});return active;},activate: function activated() {ttEach(this, function(t) {t.activate();});return this;},deactivate: function deactivate() {ttEach(this, function(t) {t.deactivate();});return this;},isOpen: function isOpen() {var open;ttEach(this.first(), function(t) {open = t.isOpen();});return open;},open: function open() {ttEach(this, function(t) {t.open();});return this;},close: function close() {ttEach(this, function(t) {t.close();});return this;},select: function select(el) {var success = false, $el = $(el);ttEach(this.first(), function(t) {success = t.select($el);});return success;},autocomplete: function autocomplete(el) {var success = false, $el = $(el);ttEach(this.first(), function(t) {success = t.autocomplete($el);});return success;},moveCursor: function moveCursoe(delta) {var success = false;ttEach(this.first(), function(t) {success = t.moveCursor(delta);});return success;},val: function val(newVal) {var query;if (!arguments.length) {ttEach(this.first(), function(t) {query = t.getVal();});return query;} else {ttEach(this, function(t) {t.setVal(newVal);});return this;}},destroy: function destroy() {ttEach(this, function(typeahead, $input) {revert($input);typeahead.destroy();});return this;}};$.fn.typeahead = function(method) {if (methods[method]) {return methods[method].apply(this, [].slice.call(arguments, 1));} else {return methods.initialize.apply(this, arguments);}};$.fn.typeahead.noConflict = function noConflict() {$.fn.typeahead = old;return this;};function ttEach($els, fn) {$els.each(function() {var $input = $(this), typeahead;(typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);});}function buildHintFromInput($input, www) {return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly", true).removeAttr("id name placeholder required").attr({autocomplete: "off",spellcheck: "false",tabindex: -1});}function prepInput($input, www) {$input.data(keys.attrs, {dir: $input.attr("dir"),autocomplete: $input.attr("autocomplete"),spellcheck: $input.attr("spellcheck"),style: $input.attr("style")});$input.addClass(www.classes.input).attr({autocomplete: "off",spellcheck: false});try {!$input.attr("dir") && $input.attr("dir", "auto");} catch (e) {}return $input;}function getBackgroundStyles($el) {return {backgroundAttachment: $el.css("background-attachment"),backgroundClip: $el.css("background-clip"),backgroundColor: $el.css("background-color"),backgroundImage: $el.css("background-image"),backgroundOrigin: $el.css("background-origin"),backPosition: $el.css("background-position"),backgroundRepeat: $el.css("background-repeat"),backgroundSize: $el.css("background-size")};}function revert($input) {var www, $wrapper;www = $input.data(keys.www);$wrapper = $input.parent().filter(www.selectors.wrapper);_.each($input.data(keys.attrs), function(val, key) {_.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);});$input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);if ($wrapper.length) {$input.detach().insertAfter($wrapper);$wrapper.remove();}}function $elOrNull(obj) {var isValid, $el;isValid = _.isJQuery(obj) || _.isElement(obj);$el = isValid ? $(obj).first() : [];return $el.length ? $el : null;}})();});typeahead.css:
.typeahead,.tt-query,.tt-hint {width: 396px;height: 30px;padding: 8px 12px;font-size: 24px;line-height: 30px;border: 2px solid #ccc;-webkit-border-radius: 8px;-moz-border-radius: 8px;border-radius: 8px;outline: none;}.typeahead {background-color: #fff;}.typeahead:focus {border: 2px solid #0097cf;}.tt-query {-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);}.tt-hint {color: #999}.tt-menu {width: 422px;margin: 12px 0;padding: 8px 0;background-color: #fff;border: 1px solid #ccc;border: 1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius: 8px;-moz-border-radius: 8px;border-radius: 8px;-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);box-shadow: 0 5px 10px rgba(0,0,0,.2);}.tt-suggestion {padding: 3px 20px;font-size: 18px;line-height: 24px;}.tt-suggestion:hover {cursor: pointer;color: #fff;background-color: #0097cf;}.tt-suggestion.tt-cursor {color: #fff;background-color: #0097cf;}.tt-suggestion p {margin: 0;}.gist {font-size: 14px;}/* example specific styles *//* ----------------------- */#custom-templates .empty-message {padding: 5px 10px;text-align: center;}#multiple-datasets .league-name {margin: 0 20px 5px 20px;padding: 3px 0;border-bottom: 1px solid #ccc;}#scrollable-dropdown-menu .tt-menu {max-height: 150px;overflow-y: auto;}#rtl-support .tt-menu {text-align: right;}The above is what the editor introduced to you. Bootstrap3 uses the typeahead plug-in to achieve automatic completion function. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!