cqwcns 发表于 2019-10-13 16:24

twitter typeahead文本自动补全JS库

twitter typeahead是个非常好用的文本自动补全填充JS,功能用户在input输入关键字过,会出现列表用户点选补全(类似百度搜索框),引入我的网址,功能已经实现,还有两个问题未解决,不知道怎么下手,请各位大哥帮忙看看。
twitter typeahead官网:http://twitter.github.io/typeahead.js/examples/

1、引入JS后,input都宽度不是100%了,经过排查,就是typeahead.js影响的,不知道怎么解决。
2、我想实现当input失去焦点,就判断input内容是否在列表中,如果不在,则清空input(目的是input最后提交的内容必须是在列表选择的,不允许用户随便填)。

HTML:
    <div>
      <label>装维网格</label>
      <div class="divTypeahead" id="divInpWangGe">
      <div class="divTypeaheadInput" style=" background-color:burlywood ">
          <input id="inpWangGe" type="text" class="form-control input BiTian typeahead" placeholder="装维网格" maxlength="16"autocomplete="off" data-sousuo="/php/huodeziduanPost.php,dizhi,WangGe,DISTINCT" style="background-color:chocolate">
      </div>
      </div>
    </div>

JS:
        function funTypeahead() {

                var bestPictures = new Bloodhound({
                        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
                        queryTokenizer: Bloodhound.tokenizers.whitespace,
                        remote: {
                                url: '/php/huodeziduanPost.php?key=%QUERY&vBiao=dizhi&vZiDuan=WangGe&vDISTINCT=DISTINCT',
                                wildcard: '%QUERY',
                                rateLimitBy: 'throttle',
                                rateLimitWait: 2000
                        }
                });

                $('#divInpWangGe .typeahead').typeahead(null, {
                        name: 'best-pictures',
                        display: 'value',
                        source: bestPictures
                });
        };

typeahead JS:
/*!
* typeahead.js 0.11.1
* https://github.com/twitter/typeahead.js
* Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
*/

! function (a, b) {
        "function" == typeof define && define.amd ? define("bloodhound", ["jquery"], function (c) {
                return a.Bloodhound = b(c)
        }) : "object" == typeof exports ? module.exports = b(require("jquery")) : a.Bloodhound = b(jQuery)
}(this, function (a) {
        var b = function () {
                        "use strict";
                        return {
                                isMsie: function () {
                                        return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i) : !1
                                },
                                isBlankString: function (a) {
                                        return !a || /^\s*$/.test(a)
                                },
                                escapeRegExChars: function (a) {
                                        return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")
                                },
                                isString: function (a) {
                                        return "string" == typeof a
                                },
                                isNumber: function (a) {
                                        return "number" == typeof a
                                },
                                isArray: a.isArray,
                                isFunction: a.isFunction,
                                isObject: a.isPlainObject,
                                isUndefined: function (a) {
                                        return "undefined" == typeof a
                                },
                                isElement: function (a) {
                                        return !(!a || 1 !== a.nodeType)
                                },
                                isJQuery: function (b) {
                                        return b instanceof a
                                },
                                toStr: function (a) {
                                        return b.isUndefined(a) || null === a ? "" : a + ""
                                },
                                bind: a.proxy,
                                each: function (b, c) {
                                        function d(a, b) {
                                                return c(b, a)
                                        }
                                        a.each(b, d)
                                },
                                map: a.map,
                                filter: a.grep,
                                every: function (b, c) {
                                        var d = !0;
                                        return b ? (a.each(b, function (a, e) {
                                                return (d = c.call(null, e, a, b)) ? void 0 : !1
                                        }), !!d) : d
                                },
                                some: function (b, c) {
                                        var d = !1;
                                        return b ? (a.each(b, function (a, e) {
                                                return (d = c.call(null, e, a, b)) ? !1 : void 0
                                        }), !!d) : d
                                },
                                mixin: a.extend,
                                identity: function (a) {
                                        return a
                                },
                                clone: function (b) {
                                        return a.extend(!0, {}, b)
                                },
                                getIdGenerator: function () {
                                        var a = 0;
                                        return function () {
                                                return a++
                                        }
                                },
                                templatify: function (b) {
                                        function c() {
                                                return String(b)
                                        }
                                        return a.isFunction(b) ? b : c
                                },
                                defer: function (a) {
                                        setTimeout(a, 0)
                                },
                                debounce: function (a, b, c) {
                                        var d, e;
                                        return function () {
                                                var f, g, h = this,
                                                        i = arguments;
                                                return f = function () {
                                                        d = null, c || (e = a.apply(h, i))
                                                }, g = c && !d, clearTimeout(d), d = setTimeout(f, b), g && (e = a.apply(h, i)), e
                                        }
                                },
                                throttle: function (a, b) {
                                        var c, d, e, f, g, h;
                                        return g = 0, h = function () {
                                                        g = new Date, e = null, f = a.apply(c, d)
                                                },
                                                function () {
                                                        var i = new Date,
                                                                j = b - (i - g);
                                                        return c = this, d = arguments, 0 >= j ? (clearTimeout(e), e = null, g = i, f = a.apply(c, d)) : e || (e = setTimeout(h, j)), f
                                                }
                                },
                                stringify: function (a) {
                                        return b.isString(a) ? a : JSON.stringify(a)
                                },
                                noop: function () {}
                        }
                }(),
                c = "0.11.1",
                d = function () {
                        "use strict";

                        function a(a) {
                                return a = b.toStr(a), a ? a.split(/\s+/) : []
                        }

                        function c(a) {
                                return a = b.toStr(a), a ? a.split(/\W+/) : []
                        }

                        function d(a) {
                                return function (c) {
                                        return c = b.isArray(c) ? c : [].slice.call(arguments, 0),
                                                function (d) {
                                                        var e = [];
                                                        return b.each(c, function (c) {
                                                                e = e.concat(a(b.toStr(d)))
                                                        }), e
                                                }
                                }
                        }
                        return {
                                nonword: c,
                                whitespace: a,
                                obj: {
                                        nonword: d(c),
                                        whitespace: d(a)
                                }
                        }
                }(),
                e = function () {
                        "use strict";

                        function c(c) {
                                this.maxSize = b.isNumber(c) ? c : 100, this.reset(), this.maxSize <= 0 && (this.set = this.get = a.noop)
                        }

                        function d() {
                                this.head = this.tail = null
                        }

                        function e(a, b) {
                                this.key = a, this.val = b, this.prev = this.next = null
                        }
                        return b.mixin(c.prototype, {
                                set: function (a, b) {
                                        var c, d = this.list.tail;
                                        this.size >= this.maxSize && (this.list.remove(d), delete this.hash, this.size--), (c = this.hash) ? (c.val = b, this.list.moveToFront(c)) : (c = new e(a, b), this.list.add(c), this.hash = c, this.size++)
                                },
                                get: function (a) {
                                        var b = this.hash;
                                        return b ? (this.list.moveToFront(b), b.val) : void 0
                                },
                                reset: function () {
                                        this.size = 0, this.hash = {}, this.list = new d
                                }
                        }), b.mixin(d.prototype, {
                                add: function (a) {
                                        this.head && (a.next = this.head, this.head.prev = a), this.head = a, this.tail = this.tail || a
                                },
                                remove: function (a) {
                                        a.prev ? a.prev.next = a.next : this.head = a.next, a.next ? a.next.prev = a.prev : this.tail = a.prev
                                },
                                moveToFront: function (a) {
                                        this.remove(a), this.add(a)
                                }
                        }), c
                }(),
                f = function () {
                        "use strict";

                        function c(a, c) {
                                this.prefix = ["__", a, "__"].join(""), this.ttlKey = "__ttl__", this.keyMatcher = new RegExp("^" + b.escapeRegExChars(this.prefix)), this.ls = c || h, !this.ls && this._noop()
                        }

                        function d() {
                                return (new Date).getTime()
                        }

                        function e(a) {
                                return JSON.stringify(b.isUndefined(a) ? null : a)
                        }

                        function f(b) {
                                return a.parseJSON(b)
                        }

                        function g(a) {
                                var b, c, d = [],
                                        e = h.length;
                                for (b = 0; e > b; b++)(c = h.key(b)).match(a) && d.push(c.replace(a, ""));
                                return d
                        }
                        var h;
                        try {
                                h = window.localStorage, h.setItem("~~~", "!"), h.removeItem("~~~")
                        } catch (i) {
                                h = null
                        }
                        return b.mixin(c.prototype, {
                                _prefix: function (a) {
                                        return this.prefix + a
                                },
                                _ttlKey: function (a) {
                                        return this._prefix(a) + this.ttlKey
                                },
                                _noop: function () {
                                        this.get = this.set = this.remove = this.clear = this.isExpired = b.noop
                                },
                                _safeSet: function (a, b) {
                                        try {
                                                this.ls.setItem(a, b)
                                        } catch (c) {
                                                "QuotaExceededError" === c.name && (this.clear(), this._noop())
                                        }
                                },
                                get: function (a) {
                                        return this.isExpired(a) && this.remove(a), f(this.ls.getItem(this._prefix(a)))
                                },
                                set: function (a, c, f) {
                                        return b.isNumber(f) ? this._safeSet(this._ttlKey(a), e(d() + f)) : this.ls.removeItem(this._ttlKey(a)), this._safeSet(this._prefix(a), e(c))
                                },
                                remove: function (a) {
                                        return this.ls.removeItem(this._ttlKey(a)), this.ls.removeItem(this._prefix(a)), this
                                },
                                clear: function () {
                                        var a, b = g(this.keyMatcher);
                                        for (a = b.length; a--;) this.remove(b);
                                        return this
                                },
                                isExpired: function (a) {
                                        var c = f(this.ls.getItem(this._ttlKey(a)));
                                        return b.isNumber(c) && d() > c ? !0 : !1
                                }
                        }), c
                }(),
                g = function () {
                        "use strict";

                        function c(a) {
                                a = a || {}, this.cancelled = !1, this.lastReq = null, this._send = a.transport, this._get = a.limiter ? a.limiter(this._get) : this._get, this._cache = a.cache === !1 ? new e(0) : h
                        }
                        var d = 0,
                                f = {},
                                g = 6,
                                h = new e(10);
                        return c.setMaxPendingRequests = function (a) {
                                g = a
                        }, c.resetCache = function () {
                                h.reset()
                        }, b.mixin(c.prototype, {
                                _fingerprint: function (b) {
                                        return b = b || {}, b.url + b.type + a.param(b.data || {})
                                },
                                _get: function (a, b) {
                                        function c(a) {
                                                b(null, a), k._cache.set(i, a)
                                        }

                                        function e() {
                                                b(!0)
                                        }

                                        function h() {
                                                d--, delete f, k.onDeckRequestArgs && (k._get.apply(k, k.onDeckRequestArgs), k.onDeckRequestArgs = null)
                                        }
                                        var i, j, k = this;
                                        i = this._fingerprint(a), this.cancelled || i !== this.lastReq || ((j = f) ? j.done(c).fail(e) : g > d ? (d++, f = this._send(a).done(c).fail(e).always(h)) : this.onDeckRequestArgs = [].slice.call(arguments, 0))
                                },
                                get: function (c, d) {
                                        var e, f;
                                        d = d || a.noop, c = b.isString(c) ? {
                                                url: c
                                        } : c || {}, f = this._fingerprint(c), this.cancelled = !1, this.lastReq = f, (e = this._cache.get(f)) ? d(null, e) : this._get(c, d)
                                },
                                cancel: function () {
                                        this.cancelled = !0
                                }
                        }), c
                }(),
                h = window.SearchIndex = function () {
                        "use strict";

                        function c(c) {
                                c = c || {}, c.datumTokenizer && c.queryTokenizer || a.error("datumTokenizer and queryTokenizer are both required"), this.identify = c.identify || b.stringify, this.datumTokenizer = c.datumTokenizer, this.queryTokenizer = c.queryTokenizer, this.reset()
                        }

                        function d(a) {
                                return a = b.filter(a, function (a) {
                                        return !!a
                                }), a = b.map(a, function (a) {
                                        return a.toLowerCase()
                                })
                        }

                        function e() {
                                var a = {};
                                return a = [], a = {}, a
                        }

                        function f(a) {
                                for (var b = {}, c = [], d = 0, e = a.length; e > d; d++) b] || (b] = !0, c.push(a));
                                return c
                        }

                        function g(a, b) {
                                var c = 0,
                                        d = 0,
                                        e = [];
                                a = a.sort(), b = b.sort();
                                for (var f = a.length, g = b.length; f > c && g > d;) a < b ? c++ : a > b ? d++ : (e.push(a), c++, d++);
                                return e
                        }
                        var h = "c",
                                i = "i";
                        return b.mixin(c.prototype, {
                                bootstrap: function (a) {
                                        this.datums = a.datums, this.trie = a.trie
                                },
                                add: function (a) {
                                        var c = this;
                                        a = b.isArray(a) ? a : , b.each(a, function (a) {
                                                var f, g;
                                                c.datums = a, g = d(c.datumTokenizer(a)), b.each(g, function (a) {
                                                        var b, d, g;
                                                        for (b = c.trie, d = a.split(""); g = d.shift();) b = b || (b = e()), b.push(f)
                                                })
                                        })
                                },
                                get: function (a) {
                                        var c = this;
                                        return b.map(a, function (a) {
                                                return c.datums
                                        })
                                },
                                search: function (a) {
                                        var c, e, j = this;
                                        return c = d(this.queryTokenizer(a)), b.each(c, function (a) {
                                                var b, c, d, f;
                                                if (e && 0 === e.length) return !1;
                                                for (b = j.trie, c = a.split(""); b && (d = c.shift());) b = b;
                                                return b && 0 === c.length ? (f = b.slice(0), void(e = e ? g(e, f) : f)) : (e = [], !1)
                                        }), e ? b.map(f(e), function (a) {
                                                return j.datums
                                        }) : []
                                },
                                all: function () {
                                        var a = [];
                                        for (var b in this.datums) a.push(this.datums);
                                        return a
                                },
                                reset: function () {
                                        this.datums = {}, this.trie = e()
                                },
                                serialize: function () {
                                        return {
                                                datums: this.datums,
                                                trie: this.trie
                                        }
                                }
                        }), c
                }(),
                i = function () {
                        "use strict";

                        function a(a) {
                                this.url = a.url, this.ttl = a.ttl, this.cache = a.cache, this.prepare = a.prepare, this.transform = a.transform, this.transport = a.transport, this.thumbprint = a.thumbprint, this.storage = new f(a.cacheKey)
                        }
                        var c;
                        return c = {
                                data: "data",
                                protocol: "protocol",
                                thumbprint: "thumbprint"
                        }, b.mixin(a.prototype, {
                                _settings: function () {
                                        return {
                                                url: this.url,
                                                type: "GET",
                                                dataType: "json"
                                        }
                                },
                                store: function (a) {
                                        this.cache && (this.storage.set(c.data, a, this.ttl), this.storage.set(c.protocol, location.protocol, this.ttl), this.storage.set(c.thumbprint, this.thumbprint, this.ttl))
                                },
                                fromCache: function () {
                                        var a, b = {};
                                        return this.cache ? (b.data = this.storage.get(c.data), b.protocol = this.storage.get(c.protocol), b.thumbprint = this.storage.get(c.thumbprint), a = b.thumbprint !== this.thumbprint || b.protocol !== location.protocol, b.data && !a ? b.data : null) : null
                                },
                                fromNetwork: function (a) {
                                        function b() {
                                                a(!0)
                                        }

                                        function c(b) {
                                                a(null, e.transform(b))
                                        }
                                        var d, e = this;
                                        a && (d = this.prepare(this._settings()), this.transport(d).fail(b).done(c))
                                },
                                clear: function () {
                                        return this.storage.clear(), this
                                }
                        }), a
                }(),
                j = function () {
                        "use strict";

                        function a(a) {
                                this.url = a.url, this.prepare = a.prepare, this.transform = a.transform, this.transport = new g({
                                        cache: a.cache,
                                        limiter: a.limiter,
                                        transport: a.transport
                                })
                        }
                        return b.mixin(a.prototype, {
                                _settings: function () {
                                        return {
                                                url: this.url,
                                                type: "GET",
                                                dataType: "json"
                                        }
                                },
                                get: function (a, b) {
                                        function c(a, c) {
                                                b(a ? [] : e.transform(c))
                                        }
                                        var d, e = this;
                                        if (b) return a = a || "", d = this.prepare(a, this._settings()), this.transport.get(d, c)
                                },
                                cancelLastRequest: function () {
                                        this.transport.cancel()
                                }
                        }), a
                }(),
                k = function () {
                        "use strict";

                        function d(d) {
                                var e;
                                return d ? (e = {
                                        url: null,
                                        ttl: 864e5,
                                        cache: !0,
                                        cacheKey: null,
                                        thumbprint: "",
                                        prepare: b.identity,
                                        transform: b.identity,
                                        transport: null
                                }, d = b.isString(d) ? {
                                        url: d
                                } : d, d = b.mixin(e, d), !d.url && a.error("prefetch requires url to be set"), d.transform = d.filter || d.transform, d.cacheKey = d.cacheKey || d.url, d.thumbprint = c + d.thumbprint, d.transport = d.transport ? h(d.transport) : a.ajax, d) : null
                        }

                        function e(c) {
                                var d;
                                if (c) return d = {
                                        url: null,
                                        cache: !0,
                                        prepare: null,
                                        replace: null,
                                        wildcard: null,
                                        limiter: null,
                                        rateLimitBy: "debounce",
                                        rateLimitWait: 300,
                                        transform: b.identity,
                                        transport: null
                                }, c = b.isString(c) ? {
                                        url: c
                                } : c, c = b.mixin(d, c), !c.url && a.error("remote requires url to be set"), c.transform = c.filter || c.transform, c.prepare = f(c), c.limiter = g(c), c.transport = c.transport ? h(c.transport) : a.ajax, delete c.replace, delete c.wildcard, delete c.rateLimitBy, delete c.rateLimitWait, c
                        }

                        function f(a) {
                                function b(a, b) {
                                        return b.url = f(b.url, a), b
                                }

                                function c(a, b) {
                                        return b.url = b.url.replace(g, encodeURIComponent(a)), b
                                }

                                function d(a, b) {
                                        return b
                                }
                                var e, f, g;
                                return e = a.prepare, f = a.replace, g = a.wildcard, e ? e : e = f ? b : a.wildcard ? c : d
                        }

                        function g(a) {
                                function c(a) {
                                        return function (c) {
                                                return b.debounce(c, a)
                                        }
                                }

                                function d(a) {
                                        return function (c) {
                                                return b.throttle(c, a)
                                        }
                                }
                                var e, f, g;
                                return e = a.limiter, f = a.rateLimitBy, g = a.rateLimitWait, e || (e = /^throttle$/i.test(f) ? d(g) : c(g)), e
                        }

                        function h(c) {
                                return function (d) {
                                        function e(a) {
                                                b.defer(function () {
                                                        g.resolve(a)
                                                })
                                        }

                                        function f(a) {
                                                b.defer(function () {
                                                        g.reject(a)
                                                })
                                        }
                                        var g = a.Deferred();
                                        return c(d, e, f), g
                                }
                        }
                        return function (c) {
                                var f, g;
                                return f = {
                                        initialize: !0,
                                        identify: b.stringify,
                                        datumTokenizer: null,
                                        queryTokenizer: null,
                                        sufficient: 5,
                                        sorter: null,
                                        local: [],
                                        prefetch: null,
                                        remote: null
                                }, c = b.mixin(f, c || {}), !c.datumTokenizer && a.error("datumTokenizer is required"), !c.queryTokenizer && a.error("queryTokenizer is required"), g = c.sorter, c.sorter = g ? function (a) {
                                        return a.sort(g)
                                } : b.identity, c.local = b.isFunction(c.local) ? c.local() : c.local, c.prefetch = d(c.prefetch), c.remote = e(c.remote), c
                        }
                }(),
                l = function () {
                        "use strict";

                        function c(a) {
                                a = k(a), this.sorter = a.sorter, this.identify = a.identify, this.sufficient = a.sufficient, this.local = a.local, this.remote = a.remote ? new j(a.remote) : null, this.prefetch = a.prefetch ? new i(a.prefetch) : null, this.index = new h({
                                        identify: this.identify,
                                        datumTokenizer: a.datumTokenizer,
                                        queryTokenizer: a.queryTokenizer
                                }), a.initialize !== !1 && this.initialize()
                        }
                        var e;
                        return e = window && window.Bloodhound, c.noConflict = function () {
                                return window && (window.Bloodhound = e), c
                        }, c.tokenizers = d, b.mixin(c.prototype, {
                                __ttAdapter: function () {
                                        function a(a, b, d) {
                                                return c.search(a, b, d)
                                        }

                                        function b(a, b) {
                                                return c.search(a, b)
                                        }
                                        var c = this;
                                        return this.remote ? a : b
                                },
                                _loadPrefetch: function () {
                                        function b(a, b) {
                                                return a ? c.reject() : (e.add(b), e.prefetch.store(e.index.serialize()), void c.resolve())
                                        }
                                        var c, d, e = this;
                                        return c = a.Deferred(), this.prefetch ? (d = this.prefetch.fromCache()) ? (this.index.bootstrap(d), c.resolve()) : this.prefetch.fromNetwork(b) : c.resolve(), c.promise()
                                },
                                _initialize: function () {
                                        function a() {
                                                b.add(b.local)
                                        }
                                        var b = this;
                                        return this.clear(), (this.initPromise = this._loadPrefetch()).done(a), this.initPromise
                                },
                                initialize: function (a) {
                                        return !this.initPromise || a ? this._initialize() : this.initPromise
                                },
                                add: function (a) {
                                        return this.index.add(a), this
                                },
                                get: function (a) {
                                        return a = b.isArray(a) ? a : [].slice.call(arguments), this.index.get(a)
                                },
                                search: function (a, c, d) {
                                        function e(a) {
                                                var c = [];
                                                b.each(a, function (a) {
                                                        !b.some(f, function (b) {
                                                                return g.identify(a) === g.identify(b)
                                                        }) && c.push(a)
                                                }), d && d(c)
                                        }
                                        var f, g = this;
                                        return f = this.sorter(this.index.search(a)), c(this.remote ? f.slice() : f), this.remote && f.length < this.sufficient ? this.remote.get(a, e) : this.remote && this.remote.cancelLastRequest(), this
                                },
                                all: function () {
                                        return this.index.all()
                                },
                                clear: function () {
                                        return this.index.reset(), this
                                },
                                clearPrefetchCache: function () {
                                        return this.prefetch && this.prefetch.clear(), this
                                },
                                clearRemoteCache: function () {
                                        return g.resetCache(), this
                                },
                                ttAdapter: function () {
                                        return this.__ttAdapter()
                                }
                        }), c
                }();
        return l
}),
function (a, b) {
        "function" == typeof define && define.amd ? define("typeahead.js", ["jquery"], function (a) {
                return b(a)
        }) : "object" == typeof exports ? module.exports = b(require("jquery")) : b(jQuery)
}(this, function (a) {
        var b = function () {
                        "use strict";
                        return {
                                isMsie: function () {
                                        return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i) : !1
                                },
                                isBlankString: function (a) {
                                        return !a || /^\s*$/.test(a)
                                },
                                escapeRegExChars: function (a) {
                                        return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")
                                },
                                isString: function (a) {
                                        return "string" == typeof a
                                },
                                isNumber: function (a) {
                                        return "number" == typeof a
                                },
                                isArray: a.isArray,
                                isFunction: a.isFunction,
                                isObject: a.isPlainObject,
                                isUndefined: function (a) {
                                        return "undefined" == typeof a
                                },
                                isElement: function (a) {
                                        return !(!a || 1 !== a.nodeType)
                                },
                                isJQuery: function (b) {
                                        return b instanceof a
                                },
                                toStr: function (a) {
                                        return b.isUndefined(a) || null === a ? "" : a + ""
                                },
                                bind: a.proxy,
                                each: function (b, c) {
                                        function d(a, b) {
                                                return c(b, a)
                                        }
                                        a.each(b, d)
                                },
                                map: a.map,
                                filter: a.grep,
                                every: function (b, c) {
                                        var d = !0;
                                        return b ? (a.each(b, function (a, e) {
                                                return (d = c.call(null, e, a, b)) ? void 0 : !1
                                        }), !!d) : d
                                },
                                some: function (b, c) {
                                        var d = !1;
                                        return b ? (a.each(b, function (a, e) {
                                                return (d = c.call(null, e, a, b)) ? !1 : void 0
                                        }), !!d) : d
                                },
                                mixin: a.extend,
                                identity: function (a) {
                                        return a
                                },
                                clone: function (b) {
                                        return a.extend(!0, {}, b)
                                },
                                getIdGenerator: function () {
                                        var a = 0;
                                        return function () {
                                                return a++
                                        }
                                },
                                templatify: function (b) {
                                        function c() {
                                                return String(b)
                                        }
                                        return a.isFunction(b) ? b : c
                                },
                                defer: function (a) {
                                        setTimeout(a, 0)
                                },
                                debounce: function (a, b, c) {
                                        var d, e;
                                        return function () {
                                                var f, g, h = this,
                                                        i = arguments;
                                                return f = function () {
                                                        d = null, c || (e = a.apply(h, i))
                                                }, g = c && !d, clearTimeout(d), d = setTimeout(f, b), g && (e = a.apply(h, i)), e
                                        }
                                },
                                throttle: function (a, b) {
                                        var c, d, e, f, g, h;
                                        return g = 0, h = function () {
                                                        g = new Date, e = null, f = a.apply(c, d)
                                                },
                                                function () {
                                                        var i = new Date,
                                                                j = b - (i - g);
                                                        return c = this, d = arguments, 0 >= j ? (clearTimeout(e), e = null, g = i, f = a.apply(c, d)) : e || (e = setTimeout(h, j)), f
                                                }
                                },
                                stringify: function (a) {
                                        return b.isString(a) ? a : JSON.stringify(a)
                                },
                                noop: function () {}
                        }
                }(),
                c = function () {
                        "use strict";

                        function a(a) {
                                var g, h;
                                return h = b.mixin({}, f, a), g = {
                                        css: e(),
                                        classes: h,
                                        html: c(h),
                                        selectors: d(h)
                                }, {
                                        css: g.css,
                                        html: g.html,
                                        classes: g.classes,
                                        selectors: g.selectors,
                                        mixin: function (a) {
                                                b.mixin(a, g)
                                        }
                                }
                        }

                        function c(a) {
                                return {
                                        wrapper: '<span class="' + a.wrapper + '"></span>',
                                        menu: '<div class="' + a.menu + '"></div>'
                                }
                        }

                        function d(a) {
                                var c = {};
                                return b.each(a, function (a, b) {
                                        c = "." + a
                                }), c
                        }

                        function e() {
                                var a = {
                                        wrapper: {
                                                position: "relative",
                                                display: "inline-block"
                                        },
                                        hint: {
                                                position: "absolute",
                                                top: "0",
                                                left: "0",
                                                borderColor: "transparent",
                                                boxShadow: "none",
                                                opacity: "1"
                                        },
                                        input: {
                                                position: "relative",
                                                verticalAlign: "top",
                                                backgroundColor: "transparent"
                                        },
                                        inputWithNoHint: {
                                                position: "relative",
                                                verticalAlign: "top"
                                        },
                                        menu: {
                                                position: "absolute",
                                                top: "100%",
                                                left: "0",
                                                zIndex: "100",
                                                display: "none"
                                        },
                                        ltr: {
                                                left: "0",
                                                right: "auto"
                                        },
                                        rtl: {
                                                left: "auto",
                                                right: " 0"
                                        }
                                };
                                return b.isMsie() && b.mixin(a.input, {
                                        backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"
                                }), a
                        }
                        var f = {
                                wrapper: "twitter-typeahead",
                                input: "tt-input",
                                hint: "tt-hint",
                                menu: "tt-menu",
                                dataset: "tt-dataset",
                                suggestion: "tt-suggestion",
                                selectable: "tt-selectable",
                                empty: "tt-empty",
                                open: "tt-open",
                                cursor: "tt-cursor",
                                highlight: "tt-highlight"
                        };
                        return a
                }(),
                d = function () {
                        "use strict";

                        function c(b) {
                                b && b.el || a.error("EventBus initialized without el"), this.$el = a(b.el)
                        }
                        var d, e;
                        return d = "typeahead:", e = {
                                render: "rendered",
                                cursorchange: "cursorchanged",
                                select: "selected",
                                autocomplete: "autocompleted"
                        }, b.mixin(c.prototype, {
                                _trigger: function (b, c) {
                                        var e;
                                        return e = a.Event(d + b), (c = c || []).unshift(e), this.$el.trigger.apply(this.$el, c), e
                                },
                                before: function (a) {
                                        var b, c;
                                        return b = [].slice.call(arguments, 1), c = this._trigger("before" + a, b), c.isDefaultPrevented()
                                },
                                trigger: function (a) {
                                        var b;
                                        this._trigger(a, [].slice.call(arguments, 1)), (b = e) && this._trigger(b, [].slice.call(arguments, 1))
                                }
                        }), c
                }(),
                e = function () {
                        "use strict";

                        function a(a, b, c, d) {
                                var e;
                                if (!c) return this;
                                for (b = b.split(i), c = d ? h(c, d) : c, this._callbacks = this._callbacks || {}; e = b.shift();) this._callbacks = this._callbacks || {
                                        sync: [],
                                        async: []
                                }, this._callbacks.push(c);
                                return this
                        }

                        function b(b, c, d) {
                                return a.call(this, "async", b, c, d)
                        }

                        function c(b, c, d) {
                                return a.call(this, "sync", b, c, d)
                        }

                        function d(a) {
                                var b;
                                if (!this._callbacks) return this;
                                for (a = a.split(i); b = a.shift();) delete this._callbacks;
                                return this
                        }

                        function e(a) {
                                var b, c, d, e, g;
                                if (!this._callbacks) return this;
                                for (a = a.split(i), d = [].slice.call(arguments, 1);
                                        (b = a.shift()) && (c = this._callbacks);) e = f(c.sync, this, .concat(d)), g = f(c.async, this, .concat(d)), e() && j(g);
                                return this
                        }

                        function f(a, b, c) {
                                function d() {
                                        for (var d, e = 0, f = a.length; !d && f > e; e += 1) d = a.apply(b, c) === !1;
                                        return !d
                                }
                                return d
                        }

                        function g() {
                                var a;
                                return a = window.setImmediate ? function (a) {
                                        setImmediate(function () {
                                                a()
                                        })
                                } : function (a) {
                                        setTimeout(function () {
                                                a()
                                        }, 0)
                                }
                        }

                        function h(a, b) {
                                return a.bind ? a.bind(b) : function () {
                                        a.apply(b, [].slice.call(arguments, 0))
                                }
                        }
                        var i = /\s+/,
                                j = g();
                        return {
                                onSync: c,
                                onAsync: b,
                                off: d,
                                trigger: e
                        }
                }(),
                f = function (a) {
                        "use strict";

                        function c(a, c, d) {
                                for (var e, f = [], g = 0, h = a.length; h > g; g++) f.push(b.escapeRegExChars(a));
                                return e = d ? "\\b(" + f.join("|") + ")\\b" : "(" + f.join("|") + ")", c ? new RegExp(e) : new RegExp(e, "i")
                        }
                        var d = {
                                node: null,
                                pattern: null,
                                tagName: "strong",
                                className: null,
                                wordsOnly: !1,
                                caseSensitive: !1
                        };
                        return function (e) {
                                function f(b) {
                                        var c, d, f;
                                        return (c = h.exec(b.data)) && (f = a.createElement(e.tagName), e.className && (f.className = e.className), d = b.splitText(c.index), d.splitText(c.length), f.appendChild(d.cloneNode(!0)), b.parentNode.replaceChild(f, d)), !!c
                                }

                                function g(a, b) {
                                        for (var c, d = 3, e = 0; e < a.childNodes.length; e++) c = a.childNodes, c.nodeType === d ? e += b(c) ? 1 : 0 : g(c, b)
                                }
                                var h;
                                e = b.mixin({}, d, e), e.node && e.pattern && (e.pattern = b.isArray(e.pattern) ? e.pattern : , h = c(e.pattern, e.caseSensitive, e.wordsOnly), g(e.node, f))
                        }
                }(window.document),
                g = function () {
                        "use strict";

                        function c(c, e) {
                                c = c || {}, c.input || a.error("input is missing"), e.mixin(this), this.$hint = a(c.hint), this.$input = a(c.input), this.query = this.$input.val(), this.queryWhenFocused = this.hasFocus() ? this.query : null, this.$overflowHelper = d(this.$input), this._checkLanguageDirection(), 0 === this.$hint.length && (this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = b.noop)
                        }

                        function d(b) {
                                return a('<pre aria-hidden="true"></pre>').css({
                                        position: "absolute",
                                        visibility: "hidden",
                                        whiteSpace: "pre",
                                        fontFamily: b.css("font-family"),
                                        fontSize: b.css("font-size"),
                                        fontStyle: b.css("font-style"),
                                        fontVariant: b.css("font-variant"),
                                        fontWeight: b.css("font-weight"),
                                        wordSpacing: b.css("word-spacing"),
                                        letterSpacing: b.css("letter-spacing"),
                                        textIndent: b.css("text-indent"),
                                        textRendering: b.css("text-rendering"),
                                        textTransform: b.css("text-transform")
                                }).insertAfter(b)
                        }

                        function f(a, b) {
                                return c.normalizeQuery(a) === c.normalizeQuery(b)
                        }

                        function g(a) {
                                return a.altKey || a.ctrlKey || a.metaKey || a.shiftKey
                        }
                        var h;
                        return h = {
                                9: "tab",
                                27: "esc",
                                37: "left",
                                39: "right",
                                13: "enter",
                                38: "up",
                                40: "down"
                        }, c.normalizeQuery = function (a) {
                                return b.toStr(a).replace(/^\s*/g, "").replace(/\s{2,}/g, " ")
                        }, b.mixin(c.prototype, e, {
                                _onBlur: function () {
                                        this.resetInputValue(), this.trigger("blurred")
                                },
                                _onFocus: function () {
                                        this.queryWhenFocused = this.query, this.trigger("focused")
                                },
                                _onKeydown: function (a) {
                                        var b = h;
                                        this._managePreventDefault(b, a), b && this._shouldTrigger(b, a) && this.trigger(b + "Keyed", a)
                                },
                                _onInput: function () {
                                        this._setQuery(this.getInputValue()), this.clearHintIfInvalid(), this._checkLanguageDirection()
                                },
                                _managePreventDefault: function (a, b) {
                                        var c;
                                        switch (a) {
                                                case "up":
                                                case "down":
                                                        c = !g(b);
                                                        break;
                                                default:
                                                        c = !1
                                        }
                                        c && b.preventDefault()
                                },
                                _shouldTrigger: function (a, b) {
                                        var c;
                                        switch (a) {
                                                case "tab":
                                                        c = !g(b);
                                                        break;
                                                default:
                                                        c = !0
                                        }
                                        return c
                                },
                                _checkLanguageDirection: function () {
                                        var a = (this.$input.css("direction") || "ltr").toLowerCase();
                                        this.dir !== a && (this.dir = a, this.$hint.attr("dir", a), this.trigger("langDirChanged", a))
                                },
                                _setQuery: function (a, b) {
                                        var c, d;
                                        c = f(a, this.query), d = c ? this.query.length !== a.length : !1, this.query = a, b || c ? !b && d && this.trigger("whitespaceChanged", this.query) : this.trigger("queryChanged", this.query)
                                },
                                bind: function () {
                                        var a, c, d, e, f = this;
                                        return a = b.bind(this._onBlur, this), c = b.bind(this._onFocus, this), d = b.bind(this._onKeydown, this), e = b.bind(this._onInput, this), this.$input.on("blur.tt", a).on("focus.tt", c).on("keydown.tt", d), !b.isMsie() || b.isMsie() > 9 ? this.$input.on("input.tt", e) : this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function (a) {
                                                h || b.defer(b.bind(f._onInput, f, a))
                                        }), this
                                },
                                focus: function () {
                                        this.$input.focus()
                                },
                                blur: function () {
                                        this.$input.blur()
                                },
                                getLangDir: function () {
                                        return this.dir
                                },
                                getQuery: function () {
                                        return this.query || ""
                                },
                                setQuery: function (a, b) {
                                        this.setInputValue(a), this._setQuery(a, b)
                                },
                                hasQueryChangedSinceLastFocus: function () {
                                        return this.query !== this.queryWhenFocused
                                },
                                getInputValue: function () {
                                        return this.$input.val()
                                },
                                setInputValue: function (a) {
                                        this.$input.val(a), this.clearHintIfInvalid(), this._checkLanguageDirection()
                                },
                                resetInputValue: function () {
                                        this.setInputValue(this.query)
                                },
                                getHint: function () {
                                        return this.$hint.val()
                                },
                                setHint: function (a) {
                                        this.$hint.val(a)
                                },
                                clearHint: function () {
                                        this.setHint("")
                                },
                                clearHintIfInvalid: function () {
                                        var a, b, c, d;
                                        a = this.getInputValue(), b = this.getHint(), c = a !== b && 0 === b.indexOf(a), d = "" !== a && c && !this.hasOverflow(), !d && this.clearHint()
                                },
                                hasFocus: function () {
                                        return this.$input.is(":focus")
                                },
                                hasOverflow: function () {
                                        var a = this.$input.width() - 2;
                                        return this.$overflowHelper.text(this.getInputValue()), this.$overflowHelper.width() >= a
                                },
                                isCursorAtEnd: function () {
                                        var a, c, d;
                                        return a = this.$input.val().length, c = this.$input.selectionStart, b.isNumber(c) ? c === a : document.selection ? (d = document.selection.createRange(), d.moveStart("character", -a), a === d.text.length) : !0
                                },
                                destroy: function () {
                                        this.$hint.off(".tt"), this.$input.off(".tt"), this.$overflowHelper.remove(), this.$hint = this.$input = this.$overflowHelper = a("<div>")
                                }
                        }), c
                }(),
                h = function () {
                        "use strict";

                        function c(c, e) {
                                c = c || {}, c.templates = c.templates || {}, c.templates.notFound = c.templates.notFound || c.templates.empty, c.source || a.error("missing source"), c.node || a.error("missing node"), c.name && !h(c.name) && a.error("invalid dataset name: " + c.name), e.mixin(this), this.highlight = !!c.highlight, this.name = c.name || j(), this.limit = c.limit || 5, this.displayFn = d(c.display || c.displayKey), this.templates = g(c.templates, this.displayFn), this.source = c.source.__ttAdapter ? c.source.__ttAdapter() : c.source, this.async = b.isUndefined(c.async) ? this.source.length > 2 : !!c.async, this._resetLastSuggestion(), this.$el = a(c.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name)
                        }

                        function d(a) {
                                function c(b) {
                                        return b
                                }
                                return a = a || b.stringify, b.isFunction(a) ? a : c
                        }

                        function g(c, d) {
                                function e(b) {
                                        return a("<div>").text(d(b))
                                }
                                return {
                                        notFound: c.notFound && b.templatify(c.notFound),
                                        pending: c.pending && b.templatify(c.pending),
                                        header: c.header && b.templatify(c.header),
                                        footer: c.footer && b.templatify(c.footer),
                                        suggestion: c.suggestion || e
                                }
                        }

                        function h(a) {
                                return /^+$/.test(a)
                        }
                        var i, j;
                        return i = {
                                val: "tt-selectable-display",
                                obj: "tt-selectable-object"
                        }, j = b.getIdGenerator(), c.extractData = function (b) {
                                var c = a(b);
                                return c.data(i.obj) ? {
                                        val: c.data(i.val) || "",
                                        obj: c.data(i.obj) || null
                                } : null
                        }, b.mixin(c.prototype, e, {
                                _overwrite: function (a, b) {
                                        b = b || [], b.length ? this._renderSuggestions(a, b) : this.async && this.templates.pending ? this._renderPending(a) : !this.async && this.templates.notFound ? this._renderNotFound(a) : this._empty(), this.trigger("rendered", this.name, b, !1)
                                },
                                _append: function (a, b) {
                                        b = b || [], b.length && this.$lastSuggestion.length ? this._appendSuggestions(a, b) : b.length ? this._renderSuggestions(a, b) : !this.$lastSuggestion.length && this.templates.notFound && this._renderNotFound(a), this.trigger("rendered", this.name, b, !0)
                                },
                                _renderSuggestions: function (a, b) {
                                        var c;
                                        c = this._getSuggestionsFragment(a, b), this.$lastSuggestion = c.children().last(), this.$el.html(c).prepend(this._getHeader(a, b)).append(this._getFooter(a, b))
                                },
                                _appendSuggestions: function (a, b) {
                                        var c, d;
                                        c = this._getSuggestionsFragment(a, b), d = c.children().last(), this.$lastSuggestion.after(c), this.$lastSuggestion = d
                                },
                                _renderPending: function (a) {
                                        var b = this.templates.pending;
                                        this._resetLastSuggestion(), b && this.$el.html(b({
                                                query: a,
                                                dataset: this.name
                                        }))
                                },
                                _renderNotFound: function (a) {
                                        var b = this.templates.notFound;
                                        this._resetLastSuggestion(), b && this.$el.html(b({
                                                query: a,
                                                dataset: this.name
                                        }))
                                },
                                _empty: function () {
                                        this.$el.empty(), this._resetLastSuggestion()
                                },
                                _getSuggestionsFragment: function (c, d) {
                                        var e, g = this;
                                        return e = document.createDocumentFragment(), b.each(d, function (b) {
                                                var d, f;
                                                f = g._injectQuery(c, b), d = a(g.templates.suggestion(f)).data(i.obj, b).data(i.val, g.displayFn(b)).addClass(g.classes.suggestion + " " + g.classes.selectable), e.appendChild(d)
                                        }), this.highlight && f({
                                                className: this.classes.highlight,
                                                node: e,
                                                pattern: c
                                        }), a(e)
                                },
                                _getFooter: function (a, b) {
                                        return this.templates.footer ? this.templates.footer({
                                                query: a,
                                                suggestions: b,
                                                dataset: this.name
                                        }) : null
                                },
                                _getHeader: function (a, b) {
                                        return this.templates.header ? this.templates.header({
                                                query: a,
                                                suggestions: b,
                                                dataset: this.name
                                        }) : null
                                },
                                _resetLastSuggestion: function () {
                                        this.$lastSuggestion = a()
                                },
                                _injectQuery: function (a, c) {
                                        return b.isObject(c) ? b.mixin({
                                                _query: a
                                        }, c) : c
                                },
                                update: function (b) {
                                        function c(a) {
                                                g || (g = !0, a = (a || []).slice(0, e.limit), h = a.length, e._overwrite(b, a), h < e.limit && e.async && e.trigger("asyncRequested", b))
                                        }

                                        function d(c) {
                                                c = c || [], !f && h < e.limit && (e.cancel = a.noop, h += c.length, e._append(b, c.slice(0, e.limit - h)), e.async && e.trigger("asyncReceived", b))
                                        }
                                        var e = this,
                                                f = !1,
                                                g = !1,
                                                h = 0;
                                        this.cancel(), this.cancel = function () {
                                                f = !0, e.cancel = a.noop, e.async && e.trigger("asyncCanceled", b)
                                        }, this.source(b, c, d), !g && c([])
                                },
                                cancel: a.noop,
                                clear: function () {
                                        this._empty(), this.cancel(), this.trigger("cleared")
                                },
                                isEmpty: function () {
                                        return this.$el.is(":empty")
                                },
                                destroy: function () {
                                        this.$el = a("<div>")
                                }
                        }), c
                }(),
                i = function () {
                        "use strict";

                        function c(c, d) {
                                function e(b) {
                                        var c = f.$node.find(b.node).first();
                                        return b.node = c.length ? c : a("<div>").appendTo(f.$node), new h(b, d)
                                }
                                var f = this;
                                c = c || {}, c.node || a.error("node is required"), d.mixin(this), this.$node = a(c.node), this.query = null, this.datasets = b.map(c.datasets, e)
                        }
                        return b.mixin(c.prototype, e, {
                                _onSelectableClick: function (b) {
                                        this.trigger("selectableClicked", a(b.currentTarget))
                                },
                                _onRendered: function (a, b, c, d) {
                                        this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()), this.trigger("datasetRendered", b, c, d)
                                },
                                _onCleared: function () {
                                        this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()), this.trigger("datasetCleared")
                                },
                                _propagate: function () {
                                        this.trigger.apply(this, arguments)
                                },
                                _allDatasetsEmpty: function () {
                                        function a(a) {
                                                return a.isEmpty()
                                        }
                                        return b.every(this.datasets, a)
                                },
                                _getSelectables: function () {
                                        return this.$node.find(this.selectors.selectable)
                                },
                                _removeCursor: function () {
                                        var a = this.getActiveSelectable();
                                        a && a.removeClass(this.classes.cursor)
                                },
                                _ensureVisible: function (a) {
                                        var b, c, d, e;
                                        b = a.position().top, c = b + a.outerHeight(!0), d = this.$node.scrollTop(), e = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10), 0 > b ? this.$node.scrollTop(d + b) : c > e && this.$node.scrollTop(d + (c - e))
                                },
                                bind: function () {
                                        var a, c = this;
                                        return a = b.bind(this._onSelectableClick, this), this.$node.on("click.tt", this.selectors.selectable, a), b.each(this.datasets, function (a) {
                                                a.onSync("asyncRequested", c._propagate, c).onSync("asyncCanceled", c._propagate, c).onSync("asyncReceived", c._propagate, c).onSync("rendered", c._onRendered, c).onSync("cleared", c._onCleared, c)
                                        }), this
                                },
                                isOpen: function () {
                                        return this.$node.hasClass(this.classes.open)
                                },
                                open: function () {
                                        this.$node.addClass(this.classes.open)
                                },
                                close: function () {
                                        this.$node.removeClass(this.classes.open), this._removeCursor()
                                },
                                setLanguageDirection: function (a) {
                                        this.$node.attr("dir", a)
                                },
                                selectableRelativeToCursor: function (a) {
                                        var b, c, d, e;
                                        return c = this.getActiveSelectable(), b = this._getSelectables(), d = c ? b.index(c) : -1, e = d + a, e = (e + 1) % (b.length + 1) - 1, e = -1 > e ? b.length - 1 : e, -1 === e ? null : b.eq(e)
                                },
                                setCursor: function (a) {
                                        this._removeCursor(), (a = a && a.first()) && (a.addClass(this.classes.cursor), this._ensureVisible(a))
                                },
                                getSelectableData: function (a) {
                                        return a && a.length ? h.extractData(a) : null
                                },
                                getActiveSelectable: function () {
                                        var a = this._getSelectables().filter(this.selectors.cursor).first();
                                        return a.length ? a : null
                                },
                                getTopSelectable: function () {
                                        var a = this._getSelectables().first();
                                        return a.length ? a : null
                                },
                                update: function (a) {
                                        function c(b) {
                                                b.update(a)
                                        }
                                        var d = a !== this.query;
                                        return d && (this.query = a, b.each(this.datasets, c)), d
                                },
                                empty: function () {
                                        function a(a) {
                                                a.clear()
                                        }
                                        b.each(this.datasets, a), this.query = null, this.$node.addClass(this.classes.empty)
                                },
                                destroy: function () {
                                        function c(a) {
                                                a.destroy()
                                        }
                                        this.$node.off(".tt"), this.$node = a("<div>"), b.each(this.datasets, c)
                                }
                        }), c
                }(),
                j = function () {
                        "use strict";

                        function a() {
                                i.apply(this, [].slice.call(arguments, 0))
                        }
                        var c = i.prototype;
                        return b.mixin(a.prototype, i.prototype, {
                                open: function () {
                                        return !this._allDatasetsEmpty() && this._show(), c.open.apply(this, [].slice.call(arguments, 0))
                                },
                                close: function () {
                                        return this._hide(), c.close.apply(this, [].slice.call(arguments, 0))
                                },
                                _onRendered: function () {
                                        return this._allDatasetsEmpty() ? this._hide() : this.isOpen() && this._show(), c._onRendered.apply(this, [].slice.call(arguments, 0))
                                },
                                _onCleared: function () {
                                        return this._allDatasetsEmpty() ? this._hide() : this.isOpen() && this._show(), c._onCleared.apply(this, [].slice.call(arguments, 0))
                                },
                                setLanguageDirection: function (a) {
                                        return this.$node.css("ltr" === a ? this.css.ltr : this.css.rtl), c.setLanguageDirection.apply(this, [].slice.call(arguments, 0))
                                },
                                _hide: function () {
                                        this.$node.hide()
                                },
                                _show: function () {
                                        this.$node.css("display", "block")
                                }
                        }), a
                }(),
                k = function () {
                        "use strict";

                        function c(c, e) {
                                var f, g, h, i, j, k, l, m, n, o, p;
                                c = c || {}, c.input || a.error("missing input"), c.menu || a.error("missing menu"), c.eventBus || a.error("missing event bus"), e.mixin(this), this.eventBus = c.eventBus, this.minLength = b.isNumber(c.minLength) ? c.minLength : 1, this.input = c.input, this.menu = c.menu, this.enabled = !0, this.active = !1, 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), f = d(this, "activate", "open", "_onFocused"), g = d(this, "deactivate", "_onBlurred"), h = d(this, "isActive", "isOpen", "_onEnterKeyed"), i = d(this, "isActive", "isOpen", "_onTabKeyed"), j = d(this, "isActive", "_onEscKeyed"), k = d(this, "isActive", "open", "_onUpKeyed"), l = d(this, "isActive", "open", "_onDownKeyed"), m = d(this, "isActive", "isOpen", "_onLeftKeyed"), n = d(this, "isActive", "isOpen", "_onRightKeyed"), o = d(this, "_openIfActive", "_onQueryChanged"), p = d(this, "_openIfActive", "_onWhitespaceChanged"), this.input.bind().onSync("focused", f, this).onSync("blurred", g, this).onSync("enterKeyed", h, this).onSync("tabKeyed", i, this).onSync("escKeyed", j, this).onSync("upKeyed", k, this).onSync("downKeyed", l, this).onSync("leftKeyed", m, this).onSync("rightKeyed", n, this).onSync("queryChanged", o, this).onSync("whitespaceChanged", p, this).onSync("langDirChanged", this._onLangDirChanged, this)
                        }

                        function d(a) {
                                var c = [].slice.call(arguments, 1);
                                return function () {
                                        var d = [].slice.call(arguments);
                                        b.each(c, function (b) {
                                                return a.apply(a, d)
                                        })
                                }
                        }
                        return b.mixin(c.prototype, {
                                _hacks: function () {
                                        var c, d;
                                        c = this.input.$input || a("<div>"), d = this.menu.$node || a("<div>"), c.on("blur.tt", function (a) {
                                                var e, f, g;
                                                e = document.activeElement, f = d.is(e), g = d.has(e).length > 0, b.isMsie() && (f || g) && (a.preventDefault(), a.stopImmediatePropagation(), b.defer(function () {
                                                        c.focus()
                                                }))
                                        }), d.on("mousedown.tt", function (a) {
                                                a.preventDefault()
                                        })
                                },
                                _onSelectableClicked: function (a, b) {
                                        this.select(b)
                                },
                                _onDatasetCleared: function () {
                                        this._updateHint()
                                },
                                _onDatasetRendered: function (a, b, c, d) {
                                        this._updateHint(), this.eventBus.trigger("render", c, d, b)
                                },
                                _onAsyncRequested: function (a, b, c) {
                                        this.eventBus.trigger("asyncrequest", c, b)
                                },
                                _onAsyncCanceled: function (a, b, c) {
                                        this.eventBus.trigger("asynccancel", c, b)
                                },
                                _onAsyncReceived: function (a, b, c) {
                                        this.eventBus.trigger("asyncreceive", c, b)
                                },
                                _onFocused: function () {
                                        this._minLengthMet() && this.menu.update(this.input.getQuery())
                                },
                                _onBlurred: function () {
                                        this.input.hasQueryChangedSinceLastFocus() && this.eventBus.trigger("change", this.input.getQuery())
                                },
                                _onEnterKeyed: function (a, b) {
                                        var c;
                                        (c = this.menu.getActiveSelectable()) && this.select(c) && b.preventDefault()
                                },
                                _onTabKeyed: function (a, b) {
                                        var c;
                                        (c = this.menu.getActiveSelectable()) ? this.select(c) && b.preventDefault(): (c = this.menu.getTopSelectable()) && this.autocomplete(c) && b.preventDefault()
                                },
                                _onEscKeyed: function () {
                                        this.close()
                                },
                                _onUpKeyed: function () {
                                        this.moveCursor(-1)
                                },
                                _onDownKeyed: function () {
                                        this.moveCursor(1)
                                },
                                _onLeftKeyed: function () {
                                        "rtl" === this.dir && this.input.isCursorAtEnd() && this.autocomplete(this.menu.getTopSelectable())
                                },
                                _onRightKeyed: function () {
                                        "ltr" === this.dir && this.input.isCursorAtEnd() && this.autocomplete(this.menu.getTopSelectable())
                                },
                                _onQueryChanged: function (a, b) {
                                        this._minLengthMet(b) ? this.menu.update(b) : this.menu.empty()
                                },
                                _onWhitespaceChanged: function () {
                                        this._updateHint()
                                },
                                _onLangDirChanged: function (a, b) {
                                        this.dir !== b && (this.dir = b, this.menu.setLanguageDirection(b))
                                },
                                _openIfActive: function () {
                                        this.isActive() && this.open()
                                },
                                _minLengthMet: function (a) {
                                        return a = b.isString(a) ? a : this.input.getQuery() || "", a.length >= this.minLength
                                },
                                _updateHint: function () {
                                        var a, c, d, e, f, h, i;
                                        a = this.menu.getTopSelectable(), c = this.menu.getSelectableData(a), d = this.input.getInputValue(), !c || b.isBlankString(d) || this.input.hasOverflow() ? this.input.clearHint() : (e = g.normalizeQuery(d), f = b.escapeRegExChars(e), h = new RegExp("^(?:" + f + ")(.+$)", "i"), i = h.exec(c.val), i && this.input.setHint(d + i))
                                },
                                isEnabled: function () {
                                        return this.enabled
                                },
                                enable: function () {
                                        this.enabled = !0
                                },
                                disable: function () {
                                        this.enabled = !1
                                },
                                isActive: function () {
                                        return this.active
                                },
                                activate: function () {
                                        return this.isActive() ? !0 : !this.isEnabled() || this.eventBus.before("active") ? !1 : (this.active = !0, this.eventBus.trigger("active"), !0)
                                },
                                deactivate: function () {
                                        return this.isActive() ? this.eventBus.before("idle") ? !1 : (this.active = !1, this.close(), this.eventBus.trigger("idle"), !0) : !0
                                },
                                isOpen: function () {
                                        return this.menu.isOpen()
                                },
                                open: function () {
                                        return this.isOpen() || this.eventBus.before("open") || (this.menu.open(), this._updateHint(), this.eventBus.trigger("open")), this.isOpen()
                                },
                                close: function () {
                                        return this.isOpen() && !this.eventBus.before("close") && (this.menu.close(), this.input.clearHint(), this.input.resetInputValue(), this.eventBus.trigger("close")), !this.isOpen()
                                },
                                setVal: function (a) {
                                        this.input.setQuery(b.toStr(a))
                                },
                                getVal: function () {
                                        return this.input.getQuery()
                                },
                                select: function (a) {
                                        var b = this.menu.getSelectableData(a);
                                        return b && !this.eventBus.before("select", b.obj) ? (this.input.setQuery(b.val, !0), this.eventBus.trigger("select", b.obj), this.close(), !0) : !1
                                },
                                autocomplete: function (a) {
                                        var b, c, d;
                                        return b = this.input.getQuery(), c = this.menu.getSelectableData(a), d = c && b !== c.val, d && !this.eventBus.before("autocomplete", c.obj) ? (this.input.setQuery(c.val), this.eventBus.trigger("autocomplete", c.obj), !0) : !1
                                },
                                moveCursor: function (a) {
                                        var b, c, d, e, f;
                                        return b = this.input.getQuery(), c = this.menu.selectableRelativeToCursor(a), d = this.menu.getSelectableData(c), e = d ? d.obj : null, f = this._minLengthMet() && this.menu.update(b), f || this.eventBus.before("cursorchange", e) ? !1 : (this.menu.setCursor(c), d ? this.input.setInputValue(d.val) : (this.input.resetInputValue(), this._updateHint()), this.eventBus.trigger("cursorchange", e), !0)
                                },
                                destroy: function () {
                                        this.input.destroy(), this.menu.destroy()
                                }
                        }), c
                }();
        ! function () {
                "use strict";

                function e(b, c) {
                        b.each(function () {
                                var b, d = a(this);
                                (b = d.data(p.typeahead)) && c(b, d)
                        })
                }

                function f(a, b) {
                        return a.clone().addClass(b.classes.hint).removeData().css(b.css.hint).css(l(a)).prop("readonly", !0).removeAttr("id name placeholder required").attr({
                                autocomplete: "off",
                                spellcheck: "false",
                                tabindex: -1
                        })
                }

                function h(a, b) {
                        a.data(p.attrs, {
                                dir: a.attr("dir"),
                                autocomplete: a.attr("autocomplete"),
                                spellcheck: a.attr("spellcheck"),
                                style: a.attr("style")
                        }), a.addClass(b.classes.input).attr({
                                autocomplete: "off",
                                spellcheck: !1
                        });
                        try {
                                !a.attr("dir") && a.attr("dir", "auto")
                        } catch (c) {}
                        return a
                }

                function l(a) {
                        return {
                                backgroundAttachment: a.css("background-attachment"),
                                backgroundClip: a.css("background-clip"),
                                backgroundColor: a.css("background-color"),
                                backgroundImage: a.css("background-image"),
                                backgroundOrigin: a.css("background-origin"),
                                backgroundPosition: a.css("background-position"),
                                backgroundRepeat: a.css("background-repeat"),
                                backgroundSize: a.css("background-size")
                        }
                }

                function m(a) {
                        var c, d;
                        c = a.data(p.www), d = a.parent().filter(c.selectors.wrapper), b.each(a.data(p.attrs), function (c, d) {
                                b.isUndefined(c) ? a.removeAttr(d) : a.attr(d, c)
                        }), a.removeData(p.typeahead).removeData(p.www).removeData(p.attr).removeClass(c.classes.input), d.length && (a.detach().insertAfter(d), d.remove())
                }

                function n(c) {
                        var d, e;
                        return d = b.isJQuery(c) || b.isElement(c), e = d ? a(c).first() : [], e.length ? e : null
                }
                var o, p, q;
                o = a.fn.typeahead, p = {
                        www: "tt-www",
                        attrs: "tt-attrs",
                        typeahead: "tt-typeahead"
                }, q = {
                        initialize: function (e, l) {
                                function m() {
                                        var c, m, q, r, s, t, u, v, w, x, y;
                                        b.each(l, function (a) {
                                                a.highlight = !!e.highlight
                                        }), c = a(this), m = a(o.html.wrapper), q = n(e.hint), r = n(e.menu), s = e.hint !== !1 && !q, t = e.menu !== !1 && !r, s && (q = f(c, o)), t && (r = a(o.html.menu).css(o.css.menu)), q && q.val(""), c = h(c, o), (s || t) && (m.css(o.css.wrapper), c.css(s ? o.css.input : o.css.inputWithNoHint), c.wrap(m).parent().prepend(s ? q : null).append(t ? r : null)), y = t ? j : i, u = new d({
                                                el: c
                                        }), v = new g({
                                                hint: q,
                                                input: c
                                        }, o), w = new y({
                                                node: r,
                                                datasets: l
                                        }, o), x = new k({
                                                input: v,
                                                menu: w,
                                                eventBus: u,
                                                minLength: e.minLength
                                        }, o), c.data(p.www, o), c.data(p.typeahead, x)
                                }
                                var o;
                                return l = b.isArray(l) ? l : [].slice.call(arguments, 1), e = e || {}, o = c(e.classNames), this.each(m)
                        },
                        isEnabled: function () {
                                var a;
                                return e(this.first(), function (b) {
                                        a = b.isEnabled()
                                }), a
                        },
                        enable: function () {
                                return e(this, function (a) {
                                        a.enable()
                                }), this
                        },
                        disable: function () {
                                return e(this, function (a) {
                                        a.disable()
                                }), this
                        },
                        isActive: function () {
                                var a;
                                return e(this.first(), function (b) {
                                        a = b.isActive()
                                }), a
                        },
                        activate: function () {
                                return e(this, function (a) {
                                        a.activate()
                                }), this
                        },
                        deactivate: function () {
                                return e(this, function (a) {
                                        a.deactivate()
                                }), this
                        },
                        isOpen: function () {
                                var a;
                                return e(this.first(), function (b) {
                                        a = b.isOpen()
                                }), a
                        },
                        open: function () {
                                return e(this, function (a) {
                                        a.open()
                                }), this
                        },
                        close: function () {
                                return e(this, function (a) {
                                        a.close()
                                }), this
                        },
                        select: function (b) {
                                var c = !1,
                                        d = a(b);
                                return e(this.first(), function (a) {
                                        c = a.select(d)
                                }), c
                        },
                        autocomplete: function (b) {
                                var c = !1,
                                        d = a(b);
                                return e(this.first(), function (a) {
                                        c = a.autocomplete(d)
                                }), c
                        },
                        moveCursor: function (a) {
                                var b = !1;
                                return e(this.first(), function (c) {
                                        b = c.moveCursor(a)
                                }), b
                        },
                        val: function (a) {
                                var b;
                                return arguments.length ? (e(this, function (b) {
                                        b.setVal(a)
                                }), this) : (e(this.first(), function (a) {
                                        b = a.getVal()
                                }), b)
                        },
                        destroy: function () {
                                return e(this, function (a, b) {
                                        m(b), a.destroy()
                                }), this
                        }
                }, a.fn.typeahead = function (a) {
                        return q ? q.apply(this, [].slice.call(arguments, 1)) : q.initialize.apply(this, arguments)
                }, a.fn.typeahead.noConflict = function () {
                        return a.fn.typeahead = o, this
                }
        }()
});

cqwcns 发表于 2019-10-13 16:33

补充,运行后代码HTML是这样的:

cqwcns 发表于 2019-10-13 16:40

补充CSS:


/* base styles */
/* ----------- */

a {
color: #03739c;
text-decoration: none;
}

a:hover {
text-decoration: underline;
}

.table-of-contents li {
display: inline-block;
*display: inline;
zoom: 1;
}

.table-of-contents li a {
font-size: 16px;
color: #999;
}

p + p {
margin: 30px 0 0 0;
}

/* site theme */
/* ---------- */

.title {
margin: 20px 0 0 0;

}

/*
.typeahead,
.tt-query,
.tt-hint {
width: 396px;
height: 30px;
padding: 8px 12px;
line-height: 30px;
border: 2px solid #ccc;
-webkit-border-radius: 8px;
   -moz-border-radius: 8px;
          border-radius: 8px;
outline: none;
}
*/

.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;
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;
}


/* divTypeahead 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;
}

cqwcns 发表于 2019-10-13 18:56

已解决:将typeahead JS的这个display: "inline-block"改为display: "block"即可{:301_1000:}
function e() {
                var a = {
                  wrapper: {
                        position: "relative",
                        display: "inline-block"
                  },


效果:
页: [1]
查看完整版本: twitter typeahead文本自动补全JS库