1. 程式人生 > >jquery 郵箱自動補全

jquery 郵箱自動補全

HTML 頁面程式碼

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title> jQuery自動完成外掛</title>
<meta name="keywords" content="jquery" />
<link rel="stylesheet" type="text/css" href="index.css">
<link rel="stylesheet" href="bootstrap.css">
<style type="text/css">
.demo{width:360px;margin:50px auto 10px auto;padding:10px;}
.demo p{line-height:30px}
</style>
<script src="jquery.min.js"></script>
<script src="index.js"></script>
<script type="text/javascript">
$(function(){
	$("#auto-complete-email").completer({
		separator: "@",
		source: ["163.com", "qq.com", "126.com", "139.com", "gmail.com", "hotmail.com", "icloud.com"]
	});
	 
	
	var $autoCompleteDomain = $("#auto-complete-domain"),
	$autoCompleteGo = $("#auto-complete-go");

	$autoCompleteDomain.completer({
		complete: function() {
			var url = "http://www." + $autoCompleteDomain.val();

			$autoCompleteGo.attr("href", url);
		},
		separator: ".",
		source: ["com", "net", "org", "co", "io", "me", "cn", "com.cn"]
	});

});
</script>
</head>
<body>
<div id="main">
	<div class="demo">
		<p>1、輸入郵箱號:</p>
    	<input type="text" id="auto-complete-email" class="form-control" placeholder="E-mail">
		<p>&nbsp;</p>
		 
		<p>2、輸入域名:</p>
		<div class="input-group">
			<span class="input-group-addon">www.</span> 
			<input id="auto-complete-domain" class="form-control" type="text" placeholder="請輸入域名" autocomplete="off" style="z-index:0"> <span class="input-group-btn"><a id="auto-complete-go" class="btn btn-default" href="javascript:void(0);">Go!</a></span>
		</div>
	</div>
</div>
</body>
</html>

base.js 原始碼

    function(a) {
        "function" == typeof define && define.amd ? define(["jquery"], a) : a("object" == typeof exports ? require("jquery") : jQuery)
    } (function(a) {
        "use strict";
        var b = a(window),
            c = a(document),
            d = function(b, c) {
                this.$element = a(b),
                    this.defaults = a.extend({},
                        d.defaults, this.$element.data(), a.isPlainObject(c) ? c: {}),
                    this.init()
            },
            e = function(a) {
                return "string" == typeof a && "" !== a ? (a = f(a), new RegExp(a + "+[^" + a + "]*$", "i")) : null
            },
            f = function(a) {
                return a.replace(/([\.\$\^\{\[\(\|\)\*\+\?\\])/g, "\\$1")
            },
            g = function(b) {
                return "string" == typeof b && (b = b.replace(/[\{\}\[\]"']+/g, "").split(/\s*,+\s*/)),
                    b = a.map(b,
                        function(a) {
                            return "string" != typeof a ? a.toString() : a
                        })
            };
        d.prototype = {
            constructor: d,
            init: function() {
                var b = this.defaults,
                    c = g(b.source);
                c.length > 0 && (this.data = c, this.regexp = e(b.separator), this.$completer = a(b.template), this.$completer.hide().appendTo("body"), this.place(), this.$element.attr("autocomplete", "off").on({
                    focus: a.proxy(this.enable, this),
                    blur: a.proxy(this.disable, this)
                }), this.$element.is(":focus") && this.enable())
            },
            enable: function() {
                this.active || (this.active = !0, this.$element.on({
                    keydown: a.proxy(this.keydown, this),
                    keyup: a.proxy(this.keyup, this)
                }), this.$completer.on({
                    mousedown: a.proxy(this.mousedown, this),
                    mouseover: a.proxy(this.mouseover, this)
                }))
            },
            disable: function() {
                this.active && (this.active = !1, this.$element.off({
                    keydown: this.keydown,
                    keyup: this.keyup
                }), this.$completer.off({
                    mousedown: this.mousedown,
                    mouseover: this.mouseover
                }))
            },
            attach: function(b) {
                var c, d, e = this.defaults.separator,
                    g = this.regexp,
                    h = g ? b.match(g) : null,
                    i = [],
                    j = [],
                    k = this;
                h && (h = h[0], b = b.replace(g, ""), c = new RegExp("^" + f(h), "i")),
                    a.each(this.data,
                        function(a, f) {
                            f = e + f,
                                d = k.template(b + f),
                                c && c.test(f) ? i.push(d) : j.push(d)
                        }),
                    i = i.length ? i.sort() : j,
                "top" === this.defaults.position && (i = i.reverse()),
                    this.fill(i.join(""))
            },
            suggest: function(b) {
                var c = new RegExp(f(b), "i"),
                    d = this,
                    e = [];
                a.each(this.data,
                    function(a, b) {
                        c.test(b) && e.push(b)
                    }),
                    e.sort(function(a, c) {
                        return a.indexOf(b) - c.indexOf(b)
                    }),
                    a.each(e,
                        function(a, b) {
                            e[a] = d.template(b)
                        }),
                    this.fill(e.join(""))
            },
            template: function(a) {
                var b = this.defaults.itemTag;
                return "<" + b + ">" + a + "</" + b + ">"
            },
            fill: function(a) {
                var b;
                this.$completer.empty(),
                    a ? (b = "top" === this.defaults.position ? ":last": ":first", this.$completer.html(a), this.$completer.children(b).addClass(this.defaults.selectedClass), this.show()) : this.hide()
            },
            complete: function() {
                var a = this.defaults,
                    b = a.filter(this.$element.val()).toString();
                return "" === b ? void this.hide() : void(a.suggest ? this.suggest(b) : this.attach(b))
            },
            keydown: function(a) {
                13 === a.keyCode && (a.stopPropagation(), a.preventDefault())
            },
            keyup: function(a) {
                var b = a.keyCode;
                13 === b || 38 === b || 40 === b ? this.toggle(b) : this.complete()
            },
            mouseover: function(b) {
                var c = this.defaults,
                    d = c.selectedClass,
                    e = a(b.target);
                e.is(c.itemTag) && e.addClass(d).siblings().removeClass(d)
            },
            mousedown: function(b) {
                b.stopPropagation(),
                    b.preventDefault(),
                    this.setValue(a(b.target).text())
            },
            setValue: function(a) {
                this.$element.val(a),
                    this.defaults.complete(),
                    this.hide()
            },
            toggle: function(a) {
                var b = this.defaults.selectedClass,
                    c = this.$completer.find("." + b);
                switch (a) {
                    case 40:
                        c.removeClass(b),
                            c = c.next();
                        break;
                    case 38:
                        c.removeClass(b),
                            c = c.prev();
                        break;
                    case 13:
                        this.setValue(c.text())
                }
                0 === c.length && (c = this.$completer.children(40 === a ? ":first": ":last")),
                    c.addClass(b)
            },
            place: function() {
                var a = this.$element,
                    c = a.offset(),
                    d = c.left,
                    e = c.top,
                    f = a.outerHeight(),
                    g = a.outerWidth(),
                    h = {
                        minWidth: g,
                        zIndex: this.defaults.zIndex
                    };
                switch (this.defaults.position) {
                    case "right":
                        h.left = d + g,
                            h.top = e;
                        break;
                    case "left":
                        h.right = b.innerWidth() - d,
                            h.top = e;
                        break;
                    case "top":
                        h.left = d,
                            h.bottom = b.innerHeight() - e;
                        break;
                    default:
                        h.left = d,
                            h.top = e + f
                }
                this.$completer.css(h)
            },
            show: function() {
                this.$completer.show(),
                    b.on("resize", a.proxy(this.place, this)),
                    c.on("mousedown", a.proxy(this.hide, this))
            },
            hide: function() {
                this.$completer.hide(),
                    b.off("resize", this.place),
                    c.off("mousedown", this.hide)
            },
            destroy: function() {
                this.hide(),
                    this.disable(),
                    this.$element.off({
                        focus: this.enable,
                        blur: this.disable
                    })
            }
        },
            d.defaults = {
                itemTag: "li",
                position: "bottom",
                source: [],
                selectedClass: "completer-selected",
                separator: "",
                suggest: !1,
                template: '<ul class="completer-container"></ul>',
                zIndex: 1,
                complete: a.noop,
                filter: function(a) {
                    return a
                }
            },
            d.setDefaults = function(b) {
                a.extend(d.defaults, b)
            },
            a.fn.completer = function(b) {
                var c, e = [].slice.call(arguments, 1);
                return this.each(function() {
                    var f, g = a(this),
                        h = g.data("completer");
                    h || g.data("completer", h = new d(this, b)),
                    "string" == typeof b && a.isFunction(f = h[b]) && (c = f.apply(h, e))
                }),
                    "undefined" != typeof c ? c: this
            },
            a.fn.completer.Constructor = d,
            a.fn.completer.setDefaults = d.setDefaults,
            a(function() {
                a('[data-toggle="completer"],[completer]').completer()
            })
    });

index.css 原始碼

.completer-container {
  position: absolute;
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
  padding: 0;
  margin: 0;
  font-family: inherit;
  font-size: 14px;
  line-height: normal;
  list-style: none;
  background-color: #fff;
  border: 1px solid #ccc;
  border-bottom-color: #39f;
}

.completer-container li {
  padding: .5em .8em;
  margin: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  cursor: pointer;
  background-color: #fff;
  border-bottom: 1px solid #eee;
}

.completer-container .completer-selected,
.completer-container li:hover {
  margin-left: -1px;
  background-color: #eee;
  border-left: 1px solid #39f;
}