Un plugin d'achèvement automatique cool
http://twitter.github.io/typeahead.js
Utilisez le plugin Typeahead dans Bootstrap pour terminer l'achèvement automatique
Documentation connexe: https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md
Source de données:
Local: tableau
Prefectch: JSON
Méthodes éloignées et autres
--------------------------------------------------------------------------------------------------------------------------------
HTML:
<entrée id = "orderNo" placeholder = "Pays" type = "text" name = "ordersn">
JS:
var states = new Bloodhound ({DatumTokenizer: Bloodhound.Tokenizers.Whitespace, QueryTokenizer: Bloodhound.Tokenizers.Whitespace, // `States` est un éventail de noms d'état définis dans" The Basics "local: States}); var FindOrderByIdVague = New Bloodhound ({DatumTokizer: 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: function (item) {// L'événement après l'élément de sélection, l'élément est actuellement sélectionné. true, saillance: true, minLength: 1}, {nom: 'states', source: states}); ** / $ ('# addcombo .typeahead'). typehead (null, {nom: 'best-pictures', affichage: 'value', source: finderbyidvague}); $ ('# addcombo .typeahead'). {console.log ('sélection:' + suggestion.value);});}); … FindOrderByIdVague / D20150502.JSON: [{"Value": "D20150502173435141299"}, {"Value": "D20150502172928109304"}]precomdbyidvague.json:
[{"valeur": "d201"}]Événements liés aux documents:
Événements personnalisés Les événements suivants sont déclenchés sur l'élément d'entrée pendant le cycle de vie d'un type de type. Tiré lorsque la saisie perd la mise au point et que la valeur a changé car elle a initialement reçu FOCUS. Le gestionnaire d'événements sera invoqué avec 4 arguments: l'objet de l'événement jQuery, les suggestions qui ont été rendues, un drapeau indiquant si les suggestions ont été récupérées de manière asynchrone et le nom de l'ensemble de données sur lequel le rendu s'est produit dans. Le gestionnaire d'événements sera invoqué avec 2 arguments: l'objet d'événement jQuery et l'objet de suggestion qui a été sélectionné. Le gestionnaire d'événements sera invoqué avec 2 arguments: l'objet de l'événement jQuery et l'objet de suggestion qui a été utilisé pour la saisie semi-automatique. Le gestionnaire d'événements sera invoqué avec 2 arguments: l'objet d'événement jQuery et l'objet de suggestion qui a été déplacé vers. Le gestionnaire d'événements sera invoqué avec 3 arguments: l'objet de l'événement jQuery, la requête actuelle et le nom de l'ensemble de données à laquelle appartient la demande asynchrone. Le gestionnaire d'événements sera invoqué avec 3 arguments: l'objet de l'événement jQuery, la requête actuelle et le nom de l'ensemble de données à laquelle la demande asynchrone appartenait à. Le gestionnaire d'événements sera invoqué avec 3 arguments: l'objet de l'événement jQuery, la requête actuelle et le nom de l'ensemble de données à laquelle appartient la demande asynchrone.
typeahead.bundle.js:
/ *! * Typeahead.js 0.11.1 * https://github.com/twitter/typeahead.js* Copyright 2013-2015 Twitter, Inc. et autres contributeurs; MIT sous licence * / (fonction (root, usine) {if (typeof define === "function" && define.amd) {define ("Bloodhound", ["jQuery"], fonction (a0) {return root ["Bloodhound"] = factory (a0);});} else if (typeof exports === "Object") {module.export = Factory (require ("jQuery"));} else {root ["Bloodhound"] = factory (jQuery);}}) (this, function ($) {var _ = function () {"Utiliser Strict"; return {ismsie: function () {return /(msie|Trident)/i.test(Navigator.UserRangent)? | rv:) (/ d + (./ d +)?) / i) [2]: false;}, iSblankString: function (str) {return! Str || Str.replace (/ [/-/)//////{/ }/(/)/*/+/?/.//^/$/ |] / g, "// $ &");}, Isstring: function (obj) {return typeof obj === "String";}, iSNumber: function (obj) {return typeof obj === "" numéro ";}, estaRay: IsAray: IsAray: IsAray: estaRay: $ .isArray, isfunction: $ .isfunction, isObject: $ .isplainObject, isUndEfined: function (obj) {return typeof obj === "Undefined";}, iselement: function (obj) {return !! (obj && obj.nodetype === 1);}, iSjQuery: function (obj) {return nej instance $; Fonction TOSTR (S) {return _.isundefined (s) || s === null? function (obj, test) {var result = true; if (! obj) {return result;} $. Chaque (obj, fonction (key, val) {if (! (result = test.call (null, val, key, obj))) {return false;}}); return !! result;}, un peu: function (obj, test) {var résultat = false; résultat;} $. Chaque (obj, fonction (key, val) {if (result = test.call (null, val, key, obj)) {return false;}}); return !! Result;}, mixin: $ .Extend, identité: function (x) {return x;}, clone: function (obj) {return $ .Extend (true, {}, obj);}, getIdGener function () {var compter = 0; return function () {return compter ++;};}, templatify: function templatify (obj) {return $ .fisfunction (obj)? Résultat; Retour function () {var context = this, args = arguments, ultérieurement, callnow; ulter = function () {timeout = null; if (! immédiat) {result = func.Apply (context, args);}}; callnow = immédiate && !mmutf; cleartimeout (Résultat); fund = settimeout (ultime, wait); Args);} Retour Result;};}, Throttle: Fonction (Func, Wait) {Var Context, Args, Timeout, Result, précédent, plus tard; précédemment = 0; plus tard = fonction (context, args);};}; return function () {var Now = New Date (), resing Arguments; if (restant <= 0) {ClearTimeout (timeout); timeout = null; PREMERSE COLAIRE; Result = func.Apply (contexte, args);} return result;};}, stringtify: function (val) {return _.issstring (val)? function () {}};} (); var version = "0.11.1"; var tokenizers = function () {"use strict"; return {non word: non word, whitespace: whitespace, obj: {non word: getoBjtOKIZIZ _.tostr (str); return str? [] .slice.call (arguments, 0); return function tokenize (o) {var tokens = []; _. Chaque (clés, fonction (k) {tokens = tokens.concat (tokenizer (_. strict "; fonction lrucache (maxSize) {this.maxsize = _.isnumber (maxSize)? MaxSize: 100; this.reset (); if (this.maxsize <= 0) {this.set = this.get = $ .Noop;}}} _. this.list.tail, nœud; if (this.size> = this.maxsize) {this.list.remove (Tailitem); supprimer this.hash [key] {node.Val = Val; this.List.Movetofront (node);} else {Node = New Node, Key, val); this.list.add (node); this.hash [key] = node; this.size ++;}}, get: function get (key) {var node = this.hash [key]; if (node) {this.list.movetofront (node); return node.val;}}, réset: function réset () {this.Size = 0; {}; this.list = new list ();}}); function list () {this.head = this.tail = null;} _. mixin (list.prototype, {add: function add (node) {if (this.head) {node.next = this.head; this.head.prev = node;} this.head = node; this.tail = this.tail |Prev = node;} this.head = node; this.tail = this.tail | Node;}, supprimer: la fonction supprime (node) {node.prev? {this.reMove (node); this.add (node);}}); function node (key, val) {this.key = key; this.val = val; this.prev = this.next = null;} return lrucache;} (); var persistentstorage = function () {"use strict"; var local_storage; try {local_stor = " window.LocalStorage; local_storage.setItem ("~~~", "!"); local_storage.removeitem ("~~~");} catch (err) {local_storage = null;} fonction persistantstorage (namespace, "" "" ] .join (""); this.ttlkey = "__ttl __"; this.keymatcher = new regexp ("^" + _.escaperegexchars (this.prefix)); this.ls = override || local_storage;! {_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.isexpire val) {try {this.ls.setItem (key, val);} catch (err) {if (err.name === "quotaExceedEDerror") {this.clear (); this._noop ();}}}, get: function (key) {if (this.isexpire decode (this.ls.getItem (this._prefix (key)));}, set: function (key, val, ttl) {if (_.isnumber (key), encode (maintenant () + ttl);} else {this.ls. return this._safeset (this._prefix (key), encode (val));}, retire: function (key) {this.ls.removeitem (this._ttlkey (key)); (i = keys.length; i--;) {this.reMove (keys [i]);} return this;}, isExpired: function (key) {var ttl = decode (this.ls.getItem (this._ttlKey (key))); return _.isNumber (ttl) && maintenant ()> ttl? maintenant () {return new Date (). getTime ();} fonction encode (val) {return json.stringify (_. isUnDefined (val)? null: val);} function Decode (val) {return $ .parsejson (val);} fonction Gathermatchingkeys (keyMatcher) {var i, key, keys = [], Len = local_storage.Lolenter; 0; MaxPendingRequests = 6, SharedCache = new Lrucache (10); Fonction Transport (o) {o = o || {}; this.cancelled = false; this.lastreq = null; this._send = o.transport; this._get = o.limiter? LRUCACHE (0): SharedCache;} transport.setMaxPendRequests = fonction setMaxPendingRequests (num) {maxPendingRequests = num;}; transport.resetCache = function resetCache () {sharedCache.reset ();}; _. Mixin (Transport.prototype, {_fingerPrint: Fonction Imprint (o) || {}; return o.url + o.type + $ .param (o.data || {});}, _ get: function (o, cb) {var that = this, digitalprint, jqxhr; digitalprint = this. (jqxhr = en recours en suspension [empreinte digitale]) {jqxhr.done (Done) .fail (échoué);} else if (EntendeRequestScount <maxPendingRequests) {EntendeRequestScount {this.ondeckrequestargs = [] .slice.call (arguments, 0);} fonction fait (resp) {cb (null, resp); (That.ondeckrequestargs) {that._get.apply (that.ondeckrequestargs); {}; digitalPrint = this._fingerPrint (o); Transport;} (); var searchIndex = window.searchIndex = function () {"use strict"; var enfants = "c", ids = "i"; fonction searchIndex (o) {o = o || {}; if (! O.datumTokenizer ||! O.QueryTokenizer) {$. O.Identifier || fonction (data) {var that = this; data = _.isArray (data)? Chars, ch; node = that.trie; chars = token.split (""); while (ch = chars.shift ()) {node = node [node] [ids]. _.map (ids, fonction (id) {return that.datums [id];});}, search: function search (query) {var that = this, tokens, correspond; tokens = normalisetokens (this.queryTokenizer (query)); _. chacun (jetons, fonction (token) {var node, chars, ch, ch, ids; === 0) {return false;} node = that.trie; chars = token.split (""); while (node && (ch = chars.shift ())) {node = node [enfants] [ch];} if (node && chars.length === 0) {ids = node [ids]. ids): ids;} else {correspond = []; return false;}}); return correspond? valeurs;}, réinitialisation: fonction reset () {this.datums = {}; this.trie = newNode ();}, serialize: function serialize () {return {datums: this.datums, trie: this.trie};}}); return searchIndex; function normalisetokens, tokens) {tokens = _.filter (tokens, tokens, tokens) {tokens = _.filter (tokensokens, tokens) {Tokens) function (token) {return !! token;}); tokens = _.map (tokens, function (token) {return token.tolowercase ();}); return tokens;} function newNode () {var node = {}; node node; {}, uniques = []; for (var i = 0, len = array.length; i <len; i ++) {if (! vu [array [i]]) {voir [array [i]] = true; uniques.push (array [i]);}} return uniques;} function getIntersection (arraya, arrayb) {var ai = 0, bernesection (arraya, arrayb) {var ai = 0, bernesection (arraya, arrayb) {var ai = 0, bernesection (arraya, arrayb) {var ai = 0, bernesection (arraya, arrayb) {var ai = 0, bernesection (arraya, arrayb) {var ai = 0, bernesection (Arraya, Arrayb) {var ai) = []; arraya = arraya.sort (); arrayb = arrayb.sort (); var leNarraya = arraya.length, Lenarrayb = arrayB.Length; while (ai <leNarraya && bi <lenarrayb) {if (arraya [ai] <arrayb [bi]) {Ai ++;} ArrayB [BI]) {bi ++;} else {intersection.push (arraya [ai]); ai ++; bi ++;}} return intersection;}} (); var prefetch = function () {"utilise strict"; var clés; keys = {{data: "data", protocole: "protoCol", thumbprint: "thumbprint";; 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; this.thumbprint = o.thumbprint; this.storage = new PersistantStorage (o.cacheKey);} _. Mixin (prefetch.prototype, {_settings: fonctions de fonction () {return {url: this.url, type: "get", dataType: "json"};}, store: function store (data) {if (!cache) {return;} this.storage.Set (keys.data, {return;} this.storage.Set (keys.Data, {return;} this.storage.Set (Keys.Data, Data, {return;} this.storage.Set (Keys. this.ttl); this.storage.set (keys.protocol, location.protoCol, this.ttl); this.storage.set (keys.thumbprint, this.thumbprint, this.ttl);}, FromCache: function fromcache () {var stored = {}, isExpired; if (! this.cache) {return null;} Stored. = this.storage.get (keys.data); stored.protoCol = this.storage.get (keys.protoCol); Stored.thumbprint = this.storage.get (keys.thumbprint); iSExpired = Stored.Tomberg ! IsExpired? onResponse (resp) {cb (null, that.transform (resp));}}, clear: function clear () {this.storage.clear (); return this;}}); return préfetch;} (); var distant = function () {"utiliser strict"; function distant (o) {this.url = o.url; = o.transform; this.transport = new Transport ({cache: o.cache, limiter: o.limiter, transport: o.transport});} _. mixin (reote {var that = this, paramètres; if (! cb) {return;} query = query || cb (that.transform (resp));}}, cancelastReQuest: function cancelastReQuest () {this.transport.cancel ();}}); return télécommande;} (); var oparser = function () {"utiliser strict"; return function parse (o) {var defaults, srser; par défaut = {initialize: true: identifier: identifier: identifier: _.Stringify, DatumTokenizer: Null, QueryTokenizer: NULL, SIFFICIAL: 5, SORTER: NULL, LOCAL: [], Préfetch: NULL, RELOVE: NULL}; O = _.MIXIN (Par défaut, O || {}) ;! O.DatumTokenizer && $. $ .Error ("QueryTokenizer est requis"); SORTER = O. = PARSEREMOTE (O.REMOTE); retour o;}; fonction parseprefetch (o) {var par défaut; if (! o) {return null;} par défaut = {url: null, ttl: 24 * 60 * 60 * 1e3, cache: true, cachekey: null, thumbprint: "", prépare: _. = _.Isstring (o)? O.TrUMPRINT; O.TRANSPORT = O.TRANSPORT? "Debounce", Ratelimitwait: 300, transform: _.Identity, Transport: Null}; o = _.SiSstring (O)? Toremoteprepare (o); o.limiter = tolimiter (o); o.transport = o.transport? Wildcard; Prépare = O.Prepare; Remplacer = O.Replace; Wildcard = O.WildCard; if (prépare) {return préparent;} if (remplace) {préparez = préparez-vous;} else if (o.wildcard) {prepare) préparez-vous Remplace (Settings.Url, Query); Return Settings;} Fonction préparentywildCard (Query, Settings) {Setting = O.ratelimitby; wait = o.ratelimitwait; if (! limiter) {limiter = /^throttle$/i.test(Method)? throttle (fn) {return _.throttle (fn, wait);};}} function callbacktodeferred (fn) {return function wrapper (o) {var deferred = $ .deferred (); fn (o, onSuccess, onError); return Deferred; function onSuccess (resp) {_.defer (fonction ()) {Deferred.Resolve (resp);});} fonction onError (err) {_.defer (function () {deferred.reject (err);});}};}}} (); var bloodhound = function () {"utiliser strict"; var old; old = windows.bloodhound; fonction bloodhound (o) {o = oparser (o); = O.Serter; this.Identify = O.Identify; this.Suffivet = o.Suffivet; this.local = o.local; this.remote = o.remote? this.identify, datumtokenizer: o.datumTokenizer, queryTokenizer: o.QueryTokenizer}); o.initialize! == false && this.inialize ();} Bloodhound.NoConflict = function noconflict () {window && (window.bloodhound = old); retour sang tokenisers; _. mixin (Bloodhound.prototype, {__TtAdapter: fonction ttadapter () {var that = this; return this.remote? withasync: withoutAsync; function withasync (Query, sync, async) {return that.search (werry, sync, async);} function withouta that.search (query, sync);}}, _ loadPrefetch: function loadPrefetch () {var that = this, différé, serialized; deferred = $ .deferred (); if (! this.prefetch) {deferred.resolve ();} ot Deferred.Reject ();} that.add (data); that.prefetch.store (that.index.serialize ()); Deferred.Resolve ();}}, _ initialize: function initialize () {var that, this, reportred; this.clear (); (this.initpromise = this._loadprefetfetch ()). this.initpromise; fonction addLocalToIndex () {that.add (that.local);}}, initié: fonction initialize (force) {return! {ids = _.isArray (ids)? (this.remote && local.length <this.Suffivet) {this.remote.get (query, processRemote);} else if (this.remote) {this.remote.cancelastRequest ();} return this; fonction processRemote (télécom {return that.identify (r) === that.identify (l);}) && nonduplicate.push (r);}); async && async (nonplicated);}}, all: function all () {return this.index.all ();}, clear: clairement: {this.index.reset (); renvoyer ce ClearPrefetchCache () {this.prefetch && this.prefetch.clear (); renvoie ce BloodHound;}); (fonction (root, factory) {if (typeof define === "function" && define.amd) {define ("typeahead.js", ["jQuery"], fonction (a0) {return 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|trident)/i.test(navigator.UserAgent)? Navigator.Userregant.match (/ (msie. | rv:) (/ d + (./ d +)?) / i) [2]: false;}, iSblankString: function (str) {return! Str || Str.replace (/ ■/-/*/ y, isfunction: $ .isfunction, isObject: $ .isplainObject, isUndEfined: function (obj) {return typeof obj === "Undefined";}, iselement: function (obj) {return !! toStr (s) {return _.isundefined (s) || S === NULL? "": s + "";}, bind: $ .proxy, chacun: fonction (collection, cb) {$ .each (collection, reverseargs); fonction reverseargs (index, valeur) {return cb (valeur, index);}}, map: $ .map, filter: $ .grep, chaque: fonction (obj, test) {var résultat = true; if (obj) {retour résultat;} $. Chaque (obj, fonction (key, val) {if (! (result = test.call (null, val, key, obj))) {return false;}}); return !! Result;}, some: function (obj, test) {var result = false; if (! obj) {return result;} $. chaque (obj, fonction (key, val) {if (résultat = tester = null (obj, fonction (key, val) {if (résultat = test. Key, obj)) {return false;}}); return !! result;}, mixin: $ .Extend, identité: function (x) {return x;}, clone: function (obj) {return $ .Extend (true, {}, obj);}, getIdGenerator: function () {var compter = 0; return function () {return compteur ++; Templatify (obj) {return $ .isfunction (obj)? obj: template; function template () {return String (obj);}}, reporter: function (fn) {setTimeout (fn, 0);}, huite: function (func, wait, immédiat) {var timeout, result; return function () {var context = this, args = arguments, ultime, callnow; ultérieurement (fin function () {timeout = null; if (if (ift) {Résultat = ultime () #) func.Apply (contexte, args);}}; callnow = immédiat &&! timeout; cleartimeout (timeout); timeout = settimeout (ultérieurement, attendre); if (callnow) {result = func.Apply (context, args);} return result;};}, throttle: fonction (func, attend) {var contexte, args, temps de temps, timeout, résultat, plus tard; Précédent = 0; ultérieurement = fonction () {PREMER = new Date (); timeout = null; result = func.Apply (context, args);}; return function () {var now = new Date (), resing = wait - (now - précédent); context = this; args = arguments; if (resing <= 0) {Cleartimeout (tempsout); temporisation = null; précédente = maintenant; timeust) (context, args);} else if (! setTimeout (plus tard, restant);} Retour Result;};}, stringify: function (val) {return _.issstring (val)? Val: json.stringify (val);}, noop: function () {}};} (); var www = function () {"use strict"; var defaultClassNames = {wrapper: "Twitter-Typehead", entrée: "tt-int", hint: "tt-hint", "TT-menu", dataset: "tt-dataset", menu: "tt-menu", dataset: "TT-dataset", menu: tt-menu ", dataset:" TT-Dataset ", menu: TT-menu", Dataset: "TT-Dataset", menu: TT-MENU ", Dataset:" TT-Dataset ", Menu: TT-MENU", Dataset: "TT-DATASET" "TT-SuggeStion", sélectionnable: "tt-sélectionnable", vide: "tt-empty", ouvert: "tt-open", curseur: "tt-cursor", highlight: "tt-highlight"}; renvoie build; function build (o) {var www, classes; classes = _.mixin (},, par défaut buildcss (), classes: classes, html: buildHtml (classes), sélecteurs: buildSelectors (classes)}; return {css: www.css, sélecteurs: www.selectors, mixin: fonction (o) {_. www);}};} fonction buildhtml (c) {return {wrapper: '<span> </span>', menu: '<div> </ div>'};} function buildSelectors (classes) {var select {var css = {wrapper: {position: "relatif", affichage: "en ligne de bloc"}, indice: {position: "absolu", en haut: "0", gauche: "0", borderColor: "transparent", boxshadow: "Aucun", OPACITY: "1"}, entrée: {position: "Relatif", vertical VerticalAl "Transparent"}, entréewithNoHint: {position: "relatif", verticalalign: "top"}, menu: {position: "absolu", en haut: "100%", à gauche: "0", zindex: "100", affichage: "Aucun"}, ltr: {gauche: "0", droite: "auto"}, rtl: {gauche: "Auto", droit: "Auto"}, RTL: {Left: "Auto", droite: "}}, RTL: {Left:" Auto ", droit:" "0"}}; if (_.ismsie ()) {_.mixin (css.input, {backgroundImage: "URL (données: image / gif; base64, r0lgodlhaqabaiaaaaaaaaaap /// yh5baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaibraa7)"});} return CSS;}} (); déprécationmap; namespace = "typehead:"; déprécationmap = {rendu: "rendu", cursorchange: "cursorchanged", select: "sélectionné", automatique: "automatique"}; fonction eventbus (o) {if (! o ||! o.el) {$.. $ (o.el);} _. mixin (eventbus.prototype, {_trigger: function (type, args) {var $ e; $ e = $ .event (namespace + type); (args = args || []). unhift ($ e); this. $ el.trrigger.apply (this. $ el, args); $ E {this._trigger(deprecatedType, [].slice.call(arguments, 1));}}});return EventBus;}();var EventEmitter = function() {"use strict";var splitter = //s+/, nextTick = getNextTick();return {onSync: onSync,onAsync: onAsync,off: off,trigger: Trigger}; fonction sur (méthode, types, cb, contexte) {var type; if (! cb) {return this;} types = types.split (Splitter); cb = context? bindContext (cb, contexte): cb; this._callbacks = this._callbacks || {}; while (type = types.shift ()) {this._callbacks [type] = this._callbacks [type] || {sync: [], async: []}; this._callbacks [type] [méthode] .push (cb);} renvoie ce context);} fonction off (types) {var type; if (! this._callbacks) {return this;} types = types.split (Splitter); while (type = types.shift ()) {supprimer this._callbacks [type];} renvoie ce Types.shift ()) && (callbacks = this._callbacks [type])) {syncflush = getflush (callbacks.sync, this, [type] .concat (args)); asyncflush = getflush (callbacks.async, this, [type] .concat (args)); syncflush () && NextTick (asyncflush); getflush (rappel, contexte, args) {return flush; function flush () {var annulé; for (var i = 0, len = callbacks.length ;! annuled && i <len; i + = 1) {annuled = rappels [i] .apply (context, args) === false;} return!}} function getnexttick () {var newtrick (window.setimMediate) {nextTickfn = fonction nextTickSetMediate (fn) {SetImMediate (function () {fn ();});} else {nextTickfn = function nextTickSetTimeout (fn) {settimeout (function () {fn ();}, 0);};} return {return fn.bind? fn.bind (contexte): function () {fn.apply (contexte, [] .slice.call (arguments, 0));};}} (); var highlight = function (doc) {"Utiliser strict"; var par défaut = {node: null, motif: null, tagname: "Strong", classname: null, wuls: false: false, casensitive: false}; {var regex; o = _.mixin ({}, par défaut, 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. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!