ปลั๊กอินเสร็จอัตโนมัติเย็น
http://twitter.github.io/typeahead.js
ใช้ปลั๊กอิน typeahead ใน bootstrap เพื่อให้เสร็จสมบูรณ์โดยอัตโนมัติ
เอกสารที่เกี่ยวข้อง: https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md
แหล่งข้อมูล:
ท้องถิ่น: อาร์เรย์
PREFECTCH: JSON
ระยะไกลและวิธีอื่น ๆ
-
html:
<อินพุต id = "orderno" placeHolder = "ประเทศ" type = "text" name = "ordersn">
JS:
var state = ใหม่ Bloodhound ({datumTokenizer: Bloodhound.tokenizers.whitespace, queryTokenizer: Bloodhound.Tokenizers.whitespace, // `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `{datumtoken Bloodhound.tokenizers.obj.whitespace ('value'), queryTokenizer: Bloodhound.tokenizers.whitespace, prefetch: '$ {ctx} /admin/order/preorterbyidvague.json' '$ {ctx} /admin/order/findorderbyidvague/%Query.json', wildcard:'%Query '}, afterselect: ฟังก์ชั่น (รายการ) {// เหตุการณ์หลังจากรายการที่เลือก, รายการถูกเลือกในปัจจุบัน .Typeahead '). typeahead ({คำแนะนำ: จริง, ไฮไลต์: จริง, minlength: 1}, {ชื่อ:' state ', แหล่งที่มา: สถานะ}); **/$ ('#addcombo .TypeAhead '). typeAhead (null, {ชื่อ: .TypeAhead '). bind (' typeahead: select ', ฟังก์ชั่น (ev, คำแนะนำ) {console.log (' การเลือก: ' + คำแนะนำ. value);});}); … FindOrderByIdVague/D20150502.json: [{"value": "D20150502173435141299"}, {"value": "D20150502172928109304"Preorterbyidvague.json:
[{"value": "d201"}]เหตุการณ์ที่เกี่ยวข้องกับเอกสาร:
เหตุการณ์ที่กำหนดเองเหตุการณ์ต่อไปนี้จะถูกกระตุ้นในองค์ประกอบอินพุตในช่วงชีวิตของ typeahead.ypeahead: ใช้งานอยู่เมื่อ typeahead ย้ายไปยัง state ที่ใช้งาน Typeahead: ไม่ได้ใช้งานการยิงเมื่อ typeahead เคลื่อนที่ไปยังสถานะที่ไม่ได้ใช้งาน ถูกยิงเมื่ออินพุตสูญเสียโฟกัสและค่ามีการเปลี่ยนแปลงเนื่องจากได้รับโฟกัสเดิม Typeahead: แสดงการยิงเมื่อคำแนะนำจะแสดงผลสำหรับชุดข้อมูล ตัวจัดการเหตุการณ์จะถูกเรียกใช้ด้วยอาร์กิวเมนต์ 4 ข้อ: วัตถุเหตุการณ์ jQuery คำแนะนำที่แสดงผลธงที่ระบุว่าคำแนะนำถูกดึงแบบอะซิงโครนัสและชื่อของชุดข้อมูลที่การแสดงผลเกิดขึ้นใน Typeahead: เลือกยิงเมื่อมีการเลือกคำแนะนำ ตัวจัดการเหตุการณ์จะถูกเรียกใช้ด้วยอาร์กิวเมนต์ 2 ข้อ: วัตถุเหตุการณ์ jQuery และวัตถุข้อเสนอแนะที่ถูกเลือก Typeahead: การเติมอัตโนมัติถูกยิงเมื่อมีการเติมข้อความอัตโนมัติ ตัวจัดการเหตุการณ์จะถูกเรียกใช้ด้วยอาร์กิวเมนต์ 2 ข้อ: วัตถุเหตุการณ์ jQuery และวัตถุข้อเสนอแนะที่ใช้สำหรับการเติมข้อความอัตโนมัติ Typeahead: Cursorchange ถูกยิงเมื่อเคอร์เซอร์คอนเทนเนอร์เคลื่อนย้าย ตัวจัดการเหตุการณ์จะถูกเรียกใช้ด้วยอาร์กิวเมนต์ 2 ข้อ: วัตถุเหตุการณ์ jQuery และวัตถุข้อเสนอแนะที่ถูกย้ายไปที่ Typeahead: AsyncRequest ถูกไล่ออกเมื่อมีการส่งคำแนะนำ Async สำหรับคำแนะนำ ตัวจัดการเหตุการณ์จะถูกเรียกใช้ด้วย 3 อาร์กิวเมนต์: วัตถุเหตุการณ์ jQuery, แบบสอบถามปัจจุบันและชื่อของชุดข้อมูลคำขอ async เป็นของ Typeahead: AsyncCancel ถูกไล่ออกเมื่อคำขอ Async ถูกยกเลิก ตัวจัดการเหตุการณ์จะถูกเรียกใช้ด้วย 3 อาร์กิวเมนต์: วัตถุเหตุการณ์ jQuery, แบบสอบถามปัจจุบันและชื่อของชุดข้อมูลคำขอ async เป็นของ Typeahead: Asyncreceive ถูกไล่ออกเมื่อคำขอ async เสร็จสมบูรณ์ ตัวจัดการเหตุการณ์จะถูกเรียกใช้ด้วย 3 อาร์กิวเมนต์: วัตถุเหตุการณ์ jQuery, การสืบค้นปัจจุบันและชื่อของชุดข้อมูลคำขอ async เป็นของตัวอย่างการใช้งานตัวอย่าง: $ ('. typeahead'). bind (typeahead: select ', ฟังก์ชั่น (ev, ข้อเสนอแนะ) {console.logtypeahead.bundle.js:
/*!* typeahead.js 0.11.1* https://github.com/twitter/typeahead.js* ลิขสิทธิ์ 2013-2015 Twitter, Inc. และผู้สนับสนุนอื่น ๆ ; mit ที่ได้รับอนุญาต*/(ฟังก์ชั่น (รูท, โรงงาน) {ถ้า (typeof define === "ฟังก์ชั่น" && define.amd) {define ("Bloodhound", ["jQuery"], ฟังก์ชั่น (a0) {return root ["Bloodhound"] = โรงงาน (a0);}; โรงงาน (ต้องการ ("jQuery"));} else {root ["bloodhound"] = โรงงาน (jQuery);}}) (นี่, ฟังก์ชั่น ($) {var _ = function () {"ใช้อย่างเข้มงวด"; return {ismsie: function () | rv :) (/d+(./ d+)?)/i) [2]: false;}, isblankstring: ฟังก์ชั่น (str) {return! str || str.replace (/[/-//- /////// //}/(/)/*/+/?/.///^/$/ |]/g, "// $ &");}, isstring: function (obj) {return typeof obj === "string";}, isnumber: ฟังก์ชั่น (obj) $ .Isarray, isfunction: $ .isfunction, isObject: $ .isplainobject, isundefined: ฟังก์ชั่น (obj) {return typeof obj === "undefined";}, isElement: function (obj) {return !! (obj && obj.nodetype === 1) $;}, TOSTR: ฟังก์ชั่น TOSTR (s) {return _.isundefined (s) || s === null? $ .Grep, ทุก: ฟังก์ชั่น (obj, ทดสอบ) {var result = true; if (! obj) {ผลตอบแทน;} $. แต่ละ (obj, ฟังก์ชั่น (key, val) {ถ้า (! (result = test.call (null, val, key, obj)) ผลลัพธ์;} $. แต่ละ (obj, ฟังก์ชั่น (คีย์, val) {if (result = test.call (null, val, key, obj) {return false;}}); return !! ผลลัพธ์;}, mixin: $. extend, ตัวตน: ฟังก์ชัน (x) {return x; function () {var counter = 0; return function () {return counter ++;};}, templatify: function templatify (obj) {return $ .isfunction (obj)? หมดเวลาผลลัพธ์; ฟังก์ชั่นการส่งคืน () {var context = this, args = อาร์กิวเมนต์, ภายหลัง, callnow; later = function () {timeout = null; ถ้า (! ทันที) {result = func.apply (บริบท, args);}}; callnow = ทันที args);} ผลตอบแทนผลลัพธ์;};}, เค้น: ฟังก์ชั่น (func, รอ) {บริบท var, args, หมดเวลา, ผลลัพธ์, ก่อนหน้า, ภายหลัง; previous = 0; later = function () {previous = วันที่ใหม่ (); TimeOut = null; result = func.apply (บริบท, args);}; อาร์กิวเมนต์; ถ้า (ที่เหลืออยู่ <= 0) {ClearTimeOut (หมดเวลา); TimeOut = null; previous = now; result = func.apply (บริบท, args);} ถ้า (! function () {}};} (); var version = "0.11.1"; var tokenizers = function () {"ใช้เข้มงวด"; return {nonword: nonword, whitespace: whitespace, obj: {nonword: getobjtokenizer _.toStr (str); return str? [] .slice.call (อาร์กิวเมนต์, 0); ฟังก์ชั่นการส่งคืน tokenize (o) {var tokens = []; _. แต่ละ (ปุ่ม, ฟังก์ชั่น (k) {โทเค็น = tokens.concat (tokenizer (}};};};};};};}; เข้มงวด "; ฟังก์ชั่น lrucache (maxsize) {this.maxsize = _.isnumber (maxsize)? maxsize: 100; this.reset (); ถ้า (this.maxsize <= 0) {this.set = this.get = $ .noop;}} _. this.list.tail, node; if (this.size> = this.maxsize) {this.list.remove (tailitem); ลบ this.hash [tailitem.key]; this.size-;} ถ้า (node = this.hash [key]) {node.val = val; val); this.list.add (node); this.hash [key] = node; this.size ++;}}, get: ฟังก์ชั่นรับ (key) {var node = this.hash [key]; if (node) {this.list.movetofront (node); return node.val;}}} {}; this.list = new list ();}}); รายการฟังก์ชัน () {this.head = this.tail = null;} _. mixin (list.prototype, {เพิ่ม: ฟังก์ชันเพิ่ม (node) {ถ้า (this.head) {node.next = this.head; Node;}, ลบ: ฟังก์ชันลบ (โหนด) {node.prev? {this.remove (node); this.add (node);}}); ฟังก์ชันโหนด (คีย์, val) {this.key = key; this.val = val; this.prev = this.next = null;} return lrucache; window.localstorage; local_storage.setItem ("~~~", "!"); local_storage.removeitem ("~~~");} จับ (err) {local_storage = null; ] .oin (""); this.ttlkey = "__ttl __"; this.keymatcher = new Regexp ("^" + _.escaperegexchars (this.prefix)); {_prefix: ฟังก์ชัน (คีย์) {return this.prefix + key;}, _ ttlkey: ฟังก์ชัน (คีย์) {return this._prefix (key) + this.ttlkey;}, _ noop: function () {this.get = this.set.set = this.remove {ลอง {this.ls.setItem (key, val);} catch (err) {ถ้า (err.name === "quotaExceedEdError") {this.clear (); this._noop ();}}}, get: function (key) decode (this.ls.getItem (this._prefix (key)));}, set: function (key, val, ttl) {ถ้า (_.isnumber (ttl)) {this._safeset (this._ttlkey (key), เข้ารหัส this._safeset (this._prefix (key), encode (val));}, remove: function (key) {this.ls.removeitem (this._ttlkey (key)); keys.length; i--;) {this.remove (keys [i]);} return;}, isexpired: function (key) {var ttl = decode (this.ls.getItem {ส่งคืนวันที่ใหม่ (). getTime ();} ฟังก์ชั่นเข้ารหัส (val) {return json.stringify (_. isundefined (val)? null: val);} ฟังก์ชัน decode (val) {return $ .parsejson (val); len; i ++) {if ((key = local_storage.key (i)). การจับคู่ (keymatcher)) {keys.push (key.replace (keymatcher, ""));}} keys;}} (); 6, SharedCache = ใหม่ lrucache (10); การขนส่งฟังก์ชั่น (o) {o = o || {}; this.cancelled = false; this.lastreq = null; this._send = o.transport; SharedCache;} transport.setMaxPendingRequests = function setMaxPendingRequests (num) {maxpendingRequests = num;}; transport.resetCache = ฟังก์ชั่นรีเซ็ต () {SharedCache.Reset ();}; _. mixin (transport.prototype {}; return o.url + o.type + $ .param (o.data || {});}, _ get: function (o, cb) {var that = this, fingerprint, jqxhr; fingerprint = this._fingerprint (o); pendingRequests [fingerprint]) {jqxhr.done (เสร็จแล้ว) .fail (ล้มเหลว);} อื่นถ้า (pendingRequestScount <maxpendingRequests) {pendingRequestScount ++; pendingRequests [fingerprint] = this._send (o). {this.ondeckrequestargs = [] .slice.call (อาร์กิวเมนต์, 0);} ฟังก์ชั่นที่ทำ (resp) {cb (null, resp); (นั่นคือ ondeckrequestargs) {that._get.apply (นั่นคือ ondeckrequestargs); {}; fingerprint = this._fingerprint (o); การขนส่ง;} (); var searchIndex = window.searchindex = function () {"ใช้อย่างเข้มงวด"; var children = "c", ids = "i"; ฟังก์ชั่น searchindex (o) {o = o || {}; ถ้า (! o.datumtokenizer ||! O.Identify || _.stringify; ฟังก์ชั่น (data) {var that = this; data = _.isarray (ข้อมูล)? chars, ch; node = that.trie; chars = token.split ("); _.map (ids, ฟังก์ชั่น (id) {return that.datums [id];});}, การค้นหา: การค้นหาฟังก์ชั่น (แบบสอบถาม) {var that = this, โทเค็น, จับคู่; tokens = normalizetokens === 0) {return false;} node = that.trie; chars = token.split ("); ในขณะที่ (node && (ch = chars.shift ())) {node = node [เด็ก] [ch]; ids): ids;} else {matches = []; return false;}}); return matches? ค่า;}, รีเซ็ต: ฟังก์ชั่นรีเซ็ต () {this.datums = {}; this.trie = newNode ();}, serialize: ฟังก์ชั่น serialize () {return {datums: this.datums, trie: this.trie};}}); ฟังก์ชั่น (โทเค็น) {return !! token;}); tokens = _.map (โทเค็น, ฟังก์ชัน (โทเค็น) {return token.toLowerCase ();}); return tokens;} function newNode () {var node = {}; node [ids] = {}, Uniques = []; สำหรับ (var i = 0, len = array.length; i <len; i ++) {ถ้า (! เห็น [array [i]]) {เห็น [array [i]] = true; uniques.push (array [i]); intersection = []; arraya = arraya.sort (); arrayb = arrayb.sort (); var lenarraya = arraya.length, lenarrayb = arrayb.length; ในขณะที่ (ai <lenarraya && bi <lenarrayb) > arrayb [bi]) {bi ++;} else {intersection.push (arraya [ai]); ai ++; bi ++;}} return intersection;}} (); var prefetch = function () {"ใช้งานเข้มงวด"; prefetch (o) {this.url = o.url; this.ttl = o.ttl; this.cache = o.cache; this.prepare = o.prepare; this.transform = o.transform; than.transport = o.transport; this.thumbprint = o.thumbprint; StensistentStorage (O.Cachekey);} _. mixin (prefetch.prototype, {_settings: การตั้งค่าฟังก์ชั่น () {return {url: this.url, ประเภท: "get" this.ttl); this.storage.set (keys.protocol, location.protocol, this.ttl); this.storage.set (keys.thumbprint, thishumbprint, this.ttl);}, fromcache: ฟังก์ชั่น fromcache () {var stored = {} = this.storage.get (keys.data); stored.protocol = this.storage.get (keys.protocol); stored.thumbprint = this.storage.get (keys.thumbprint); ! isexpired? onResponse (resp) {cb (null, that.transform (resp));}}, ชัดเจน: ฟังก์ชั่นชัดเจน () {this.storage.clear (); return this;}}); return prefetch;} (); var remote = function () o.transform; this.transport = การขนส่งใหม่ ({cache: o.cache, limiter: o.limiter, การขนส่ง: o.transport});} _. mixin (รีโมต. cb) {var that = this, การตั้งค่า; if (! cb) {return;}} query = query || ""; การตั้งค่า = this.pare.pare (Query, this._settings ()); return.transport.get (การตั้งค่า cb (that.transform (resp));}}, cancellastrequest: function cancellastrequest () {this.transport.cancel ();}}); retion remote;} (); var oparser = function () {"ใช้อย่างเข้มงวด"; null, querytokenizer: null, พอเพียง: 5, sorter: null, local: [], prefetch: null, รีโมต: null}; o = _.mixin (ค่าเริ่มต้น, o || {}); จำเป็น "); sorter = o.sorter; o.sorter = sorter? function (x) {return x.sort (sorter);}: _.identity; o.local = _.isfunction (o.local)? o.local (): o.local; parseremote (o.remote); return o;}; function parseprefetch (o) {var ค่าเริ่มต้น; ถ้า (! o) {return null;} ค่าเริ่มต้น = {url: null, ttl: 24 * 60 * 60 * 1e3, แคช: จริง _.isstring (O)? O.thumbprint; O.Transport = O.Transport? "Debounce", Ratelimitwait: 300, Transform: _.identity, การขนส่ง: null}; o = _.isstring (o)? Toremoteprepare (O); O.limiter = ToLimiter (O); O.Transport = O.Transport? wildcard; preper = o.prepare; แทนที่ = o.replace; wildcard = o.wildcard; ถ้า (เตรียม) {return preper;} ถ้า (แทนที่) {prepay = preparybyreplace;} อื่น ๆ ถ้า (o.wildcard) {prepay = preparybywildcard; แทนที่ (settings.url, query); การตั้งค่า return;} function prepaybywildcard (การสืบค้น, การตั้งค่า) {settings.url = settings.url.replace (wildcard, enchodeuricomponent (retury); o.limiter; method = o.ratelimitby; wait = o.ratelimitwait; if (! limiter) {limiter = /^throttle$/i.test(method)? คันเร่ง (รอ) {return function throttle (fn) {return _.throttle (fn, wait);};}} ฟังก์ชั่น callbacktodeferred (fn) {return function wrapper (O) {var deferred = $ {_.defer (ฟังก์ชั่น () {deferred.resolve (resp);});} ฟังก์ชั่น onerror (err) {_.defer (ฟังก์ชั่น () {deferred.reject (err);});}};}} (); {o = oparser (o); this.sorter = o.sorter; this.identify = o.identify; this.suffivet = o.suffivet; this.local = o.local; this.remote = o.remote? SearchIndex ({identify: this.identify, datumTokenizer: O.DatumTokenizer, queryTokenizer: o.QueryTokenizer}); o.initialize! == FALSE && this.initialize ();} bloodhound.noconflict = ฟังก์ชั่น noconflict Bloodhound;}; Bloodhound.tokenizers = Tokenizers; _. Mixin (Bloodhound.prototype, {__ttadapter: ฟังก์ชั่น ttadapter () {var that = this; return this.remote? ไม่มี Aasync (Query, sync) {return that.search (query, sync);}}, _ loadprefetch: function loadprefetch () {var that = this, deferred, serialized; deferred = $ .deferred (); if (! {this.index.bootstrap (serialized); deferred.resolve ();} else {this.prefetch.fromnetwork (เสร็จแล้ว);} return deverred.promise (); deferred.reject ();} that.add (data); that.prefetch.store (that.index.serialize ()); deferred.resolve ();}}, _ เริ่มต้น: ฟังก์ชั่นเริ่มต้น () {var that = this this.initpromise; ฟังก์ชั่น addlocaltoindex () {that.add (that.local);}}, เริ่มต้น: ฟังก์ชั่นเริ่มต้น (บังคับ) {return! {ids = _.isarray (ids)? ids: [] .slice.call (อาร์กิวเมนต์); return.index.get (ids);}, ค้นหา: การค้นหาฟังก์ชั่น (คำถาม, ซิงค์, async) (this.remote && local.length <this.suffivet) {this.remote.get (Query, processRemote);} อื่นถ้า (this.remote) {this.remote.cancellastrequest (); ฟังก์ชั่น (l) {return that.identify (r) === that.identify (l);}) && nonduplicates.push (r);}); async && async (nonduplicates);}}, ทั้งหมด: ฟังก์ชั่นทั้งหมด this;}, clearprefetchcache: function clearprefetchcache () {this.prefetch && this.prefetch.clear (); return this;}, clearremotecache: function clearremotecache () {transport.resetcache (); return; Bloodhound;} (); return bloodhound;}); (ฟังก์ชั่น (รูท, โรงงาน) {ถ้า (typeof define === "function" && define.amd) {define ("typeahead.js", ["jQuery"], ฟังก์ชั่น (A0) โรงงาน (ต้องการ ("jQuery"));} else {โรงงาน (jQuery);}}) (นี่, ฟังก์ชั่น ($) {var _ = function () {"ใช้เข้มงวด"; return {ismsie: function () {return /(MSieTrident | rv :) (/d+(./ d+)?)/i) [2]: false;}, isblankstring: ฟังก์ชั่น (str) {return! str || str.replace (/[/-//[/////// {/}/(/)/*/+/?/.///^/$/ |]/g, "// $ &");}, isstring: ฟังก์ชั่น (ob j) {return typeof obj === "string";}, isnumber: ฟังก์ชั่น y, isfunction: $ .isfunction, isObject: $ .isplainobject, isundefined: function (obj) {return typeof obj === "undefined";}, isElement: function (obj) {return !! (obj && obj.nodetype === 1); ToStr (S) {return _.isundefined (S) || s === null? "": s + "";}, bind: $ .proxy, แต่ละ: ฟังก์ชั่น (คอลเลกชัน, cb) {$ .each (คอลเลกชัน, การกลับรายการ); ฟังก์ชั่นย้อนกลับ (ดัชนี, ค่า) {return cb (ค่า, ดัชนี);}}, แผนที่: $ .map, ตัวกรอง: $. -grep ผลลัพธ์;} $. แต่ละ (obj, ฟังก์ชั่น (คีย์, val) {ถ้า (! (result = test.call (null, val, key, obj))) {return false;}}); return !! ผลลัพธ์;}, บางส่วน: obj, test) {var result = false; คีย์, obj)) {return false;}}); return !! ผลลัพธ์;}, mixin: $. extend, ตัวตน: ฟังก์ชั่น (x) {return x;}, โคลน: ฟังก์ชั่น (obj) {return $. extend (true, {}, obj); templatify (obj) {return $ .isfunction (OBJ)? obj: เทมเพลต; เทมเพลตฟังก์ชัน () {return string (obj);}}, defer: function (fn) {settimeout (fn, 0);}, debounce: ฟังก์ชั่น (func, รอทันที) {var timeout, result; return function () func.apply (บริบท, args);}}; callnow = ทันที &&! หมดเวลา; cleartimeout (หมดเวลา); หมดเวลา = settimeout (ต่อมารอ) ถ้า (callnow) {result = func.apply (บริบท, args); previous = 0; later = function () {previous = new date (); timeout = null; result = func.apply (บริบท, args);}; return function () {var now = new date (), ที่เหลือ = รอ - (ตอนนี้ - ก่อนหน้า); บริบท = this; args = อาร์กิวเมนต์; ถ้า (เหลืออยู่ <= 0) {cleartimeout (หมดเวลา); ที่เหลือ);} ผลตอบแทนผลลัพธ์;};}, stringify: ฟังก์ชัน (val) {return _.isstring (val)? val: json.stringify (val);}, noop: function () {}};} (); var www = function () {"ใช้อย่างเข้มงวด"; var defaultclassNames = {wrapper: "Twitter-typeahead", อินพุต: "tt-input" "tt-suggestion", เลือกได้: "tt-selectable", ว่างเปล่า: "tt-empty", เปิด: "tt-open", เคอร์เซอร์: "tt-cursor", ไฮไลต์: "tt-highlight"}; return build; function build (o) {var www, คลาส; buildcss (), คลาส: คลาส, html: buildhtml (คลาส), ตัวเลือก: buildSelectors (คลาส)}; return {css: www.css, html: www.html, คลาส: www.classes, selectors: www.selectors www);}};} ฟังก์ชั่น buildhtml (c) {return {wrapper: '<span> </span>', เมนู: '<div> </div>'};} function buildSelectors (คลาส) {var selector = {}; _. buildcss () {var css = {wrapper: {ตำแหน่ง: "ญาติ", จอแสดงผล: "inline-block"}, คำใบ้: {ตำแหน่ง: "สัมบูรณ์", ด้านบน: "0", ซ้าย: "0", bordercolor: "โปร่งใส", boxshadow: " "transparent"}, inputwithnohint: {ตำแหน่ง: "ญาติ", แนวตั้ง: "top"}, เมนู: {ตำแหน่ง: "สัมบูรณ์", ด้านบน: "100%", ซ้าย: "0", zindex: "100", แสดง: "ไม่มี"}, ltr: {ซ้าย: "0" "0"}}; ถ้า (_.ismsie ()) {_.mixin (css.input, {backgroundimage: "url (ข้อมูล: image/gif; base64, r0lgodlhaqabaaaaaaaaaaap /// yh5baeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiibraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiibraa DEPRECATIONMAP; namespace = "typeahead:"; deprecationMap = {render: "rendered", cursorchange: "cursorChanged", เลือก: "เลือก", Autocomplete: "Autocompleted"}; eventbus (o) {ถ้า ( $ (o.el);} _. mixin (eventbus.prototype, {_trigger: function (ประเภท, args) {var $ e; $ e = $ .Event (namespace + type); (args = args || []). args, $ e; args = [] .slice.call (อาร์กิวเมนต์, 1); $ e = this._trigger ("ก่อน" + type, args); return $ e.isdefaultprevented ();}, ทริกเกอร์: ฟังก์ชั่น (ประเภท) DEPRECATIONMAP [type]) {this._trigger (deprecatedType, [] .slice.call (อาร์กิวเมนต์, 1));}}}); return eventbus;} (); var eventemitter = function () {"ใช้" var splitter = // s+/, nexttick = getnextick (); onasync, ปิด: ปิด, ทริกเกอร์: ทริกเกอร์}; ฟังก์ชั่นบน (วิธี, ประเภท, cb, บริบท) {ประเภท var; ถ้า (! cb) {ส่งคืนสิ่งนี้;} types = types.split (splitter); cb = บริบท? bindContext (cb, บริบท): cb; this._callbacks = this._callbacks || {}; ในขณะที่ (type = type.shift ()) {this._callbacks [type] = this._callbacks [type] || {sync: [], async: []}; this._callbacks [type] [method] .push (cb);} ส่งคืนสิ่งนี้;} ฟังก์ชั่น onasync (ประเภท, cb, บริบท) {return on.call (this, "async", ประเภท, cb, บริบท); บริบท);} ฟังก์ชั่นปิด (ประเภท) {ประเภท var; if (! this._callbacks) {ส่งคืนสิ่งนี้;} types = types.split (splitter); ในขณะที่ (type = types.shift ()) {ลบ this._callbacks [type];} ส่งคืนสิ่งนี้;} ฟังก์ชันทริกเกอร์ (ประเภท) {ประเภท var, การเรียกกลับ, args, syncflush, asyncflush; if (! this._callbacks) types.shift ()) && (callbacks = this._callbacks [type])) {syncflush = getFlush (callbacks.sync, นี่, [type] .concat (args)); asyncflush = getFlush getFlush (callbacks, บริบท, args) {return flush; function flush () {var ยกเลิก; สำหรับ (var i = 0, len = callbacks.length;! canceled && i <len; i += 1) {canceled = callbacks [i] nexttickfn; if (window.setimmediate) {nexttickfn = ฟังก์ชั่น nextticksetimmediate (fn) {setimmediate (ฟังก์ชั่น () {fn ();});} else {nexttickfn = ฟังก์ชั่น nextticksettimeout (fn) {settimeout bindContext (fn, บริบท) {return fn.bind? fn.bind (บริบท): function () {fn.apply (บริบท, [] .slice.call (อาร์กิวเมนต์, 0));};}} (); var ไฮไลต์ = ฟังก์ชั่น (doc) {"ใช้อย่างเข้มงวด"; var ค่าเริ่มต้น = {node: null, รูปแบบ: null, tagname: "strong" {var regex; o = _.mixin ({}, ค่าเริ่มต้น, o); ถ้า (! 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 : โมฆะ;}})();});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. ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!