实现163收件人显示效果支持编辑删除,自动提示及邮件地址验证

来源:互联网 发布:高清网络摄像机软件 编辑:程序博客网 时间:2024/05/19 04:27

结合autocomplete自写的一个小插件,实现163收件人显示效果支持编辑删除,自动提示及邮件地址验证。

有个关键就是修改了autocomplete.js中在鼠标点击时添加了阻止默认事件e.preventDefault()

插件名:jquery.inputemail.js ,源码如下:

/* * 实现163收件人效果 * 作者:甜甜老爸 */(function ($) {    $.fn.inputemail = function (options) {//options 参数        var defaultVal = {            mails: "",            tipdata: [{full_name: 'ceshi1', email: 'ceshi1@21gmail.com'}, {                full_name: 'ceshi2',                email: 'ceshi2@21gmail.com'            }]        };        //默认值        var obj = $.extend(defaultVal, options);        return this.each(function () {            var $this = $(this);//获取当前对象            initmail();            //初始化事件            function initmail() {                if (obj.mails != "") {                    $this.find(".lg-editableAddr").remove();                    $.each(obj.mails.split(","), function (b, q) {                        q = q.replace(/</, '<').replace(/>/, '>');                        var err = "";                        var firstsub = q.substring(0, 4);                        var lastsub = q.substring(q.length - 4);                        if (firstsub == "<" && lastsub == ">") {                            q = q.replace(/</, '').replace(/>/, '');                        }                        if (!checkemail(q)) {                            err = "lg-error";                        }                        $this.append($('<div class="lg-editableAddr ' + err + '"><span class="edminfo">' + q + '</span><b class="edmclose">x</b></div>'));                    });                    var $eminfo = $('<div class="edm-addr">'                        + '<input type="text" class="edm-input" aria-label="收件人地址输入框,请输入邮件地址,多人时地址请以分号隔开">'                        + '<span class="edm-addr-txt"></span></div>');                    $this.find(".edm-addr").remove();                    $this.append($eminfo);                    $this.find(".edm-input").focus();                    getresult();                } else {                    $this.find(".lg-editableAddr").remove();                    $this.find(".lastresult").val("");                }                initclick();                inputkeyup();                inputprompt();            }            function initclick() {                $this.unbind('click').click(function (e) {                    e.stopPropagation();                    if (!$this.find(".edm-input").is(':focus')) {                        var $eminfo = $('<div class="edm-addr">'                            + '<input type="text" class="edm-input" aria-label="收件人地址输入框,请输入邮件地址,多人时地址请以分号隔开">'                            + '<span class="edm-addr-txt"></span></div>');                        var xs = e.offsetX + $(this).offset().left;                        var ys = e.offsetY + $(this).offset().top;                        //console.log(xs + "," + ys + "点击的位置")                        var isz = 0;                        $this.find(".lg-editableAddr").each(function () {                            // console.log($(this).offset().left + "," + ($(this).offset().top + 23))                            var lgx = $(this).offset().left;                            var lgy = $(this).offset().top + 23;                            if (lgx > xs && lgy > ys) {                                isz = 1;                                $this.find(".edm-addr").remove();                                $eminfo.insertBefore(this);                                $this.find(".edm-input").focus();                                return false;                            }                        });                        if (isz == 0) {                            $this.find(".edm-addr").remove();                            $this.append($eminfo);                            $this.find(".edm-input").focus();                        }                    }                    inputkeyup();                    inputprompt();                });                $this.find(".edminfo").unbind('click').click(function (e) {                    e.stopPropagation();                    $this.find(".edminfo").removeClass("edmactive");                    $(this).addClass("edmactive");                });                $this.find(".edminfo").unbind('dblclick').dblclick(function (e) {                    var v = $(this).html();                    var $eminfo = $('<div class="edm-addr">'                        + '<input type="text" class="edm-input" value="' + v + '" aria-label="收件人地址输入框,请输入邮件地址,多人时地址请以分号隔开">'                        + '<span class="edm-addr-txt">' + v + '</span></div>');                    $this.find(".edm-addr").remove();                    $eminfo.insertAfter($(this).parent());                    $(this).parent().remove();                    $this.find(".edm-input").width($this.find(".edm-addr-txt").width() + 20);                    var t = $this.find(".edm-input").val();                    $this.find(".edm-input").val("").focus().val(t);                    getresult();                    inputkeyup();                    inputprompt();                });                $this.find(".edmclose").unbind('click').click(function (e) {                    e.stopPropagation();                    $(this).parent().remove();                    $this.find(".edm-addr").remove();                    getresult();                    inputkeyup();                    inputprompt();                });            }            //input事件            function inputkeyup() {                $this.find(".edm-input").unbind('keydown').bind('keydown', function (e) {                    var thisone=$(this);                    var $edtxt = $this.find('.edm-addr-txt');                    if (e.type == 'keydown' && e.keyCode == 8) {                        var preval = $edtxt.html();                        if (preval == "") {                            var classname=thisone.parent().prev()[0].className;                            if(classname!="lastresult"){                                thisone.parent().prev().remove();                            }                        }                        getresult();                    }                });                $this.find(".edm-input").unbind('keyup blur').bind('keyup blur', function (e) {                    var a=0;                    var thisone=$(this);                    var v = thisone.val();                    if (v.indexOf('<')>0) {                        v = v.replace(/</g, '<').replace(/>/g, '>');                    }                    v = v.replace(/;/g, ',');                    v = v.replace(/</g, '<').replace(/>/g, '>');                    var $edtxt = $this.find('.edm-addr-txt');                    $edtxt.html(v);                    console.log($(".ac_results").is(":hidden"))                    if (v != "") {                        if (e.keyCode == 13 || e.type == 'blur') {                            var firstsub = v.substring(0, 4);                            var lastsub = v.substring(v.length - 4);                            if (firstsub == "<" && lastsub == ">") {                                v = v.replace(/</g, '').replace(/>/g, '');                            }                            // if ($(".ac_results").is(":hidden") || $(".ac_results").length<1) {                            if (a==0){                                var z=v.substring(v.length-1);                                if (z==","){                                    v=v.substring(0,v.length-1);                                }                                $.each(v.split(","),function(b,q){                                    //console.log(q)                                    var err = "";                                    if (!checkemail(q)) {                                        err = "lg-error";                                    }                                    var $onemail = $('<div class="lg-editableAddr ' + err + '"><span class="edminfo">' + q + '</span><b class="edmclose">x</b></div>');                                    $onemail.insertBefore(thisone.parent());                                });                                $this.find(".edm-addr").width(20);                                //$this.find(".edm-addr").remove();                                // }                                a++;                            }                            thisone.val('');                            $edtxt.html("");                            getresult();                        }                        initclick();                    }                    //                    //if (e.type == 'keyup' && e.keyCode == 8) {                    //    var preval = $edtxt.html();                    //    if (preval == "") {                    //        thisone.parent().prev().remove();                    //    }                    //    getresult();                    //}                    if (e.keyCode !=undefined) {                        thisone.width($edtxt.width() + 20);                    }                });            }            //赋值结果            function getresult() {                var lastval = "";                $this.find('.edminfo').each(function () {                    var hsclass = $(this).parent().hasClass('lg-error');                    if (!hsclass) {                        lastval += $.trim($(this).html()) + ",";                    }                });                lastval = lastval.substring(0, lastval.length - 1);                lastval = lastval.replace(/</g, '<').replace(/>/g, '>');                $this.find(".lastresult").attr("value", lastval);            }            //检查邮件地址            function checkemail(val) {                var realmail = $.trim(val);                if (realmail.indexOf(",") > 0) {                    return false;                }                if(realmail.split("<").length>2){                    return false;                }                if(realmail.indexOf(">")>0){                    if(realmail.substring(realmail.length - 4,realmail.length)!=">"){                        return false;                    }                }                var regstart = /<(.*?)>/;                var email = regstart.exec(realmail);                if (email != null) {                    realmail = email[1];                }                var regx = /^\w+([\.\'-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;                return regx.test(realmail);            }            //输入提示            function inputprompt() {                $(".ac_results").remove();                var data = obj.tipdata;                $this.find(".edm-input").autocomplete(data, {                    minChars: 1,                    width: 300,                    scroll: true,                    multipleSeparator: "",                    scrollHeight: 200,                    selectFirst:true,                    matchContains: true,                    autoFill: false,                    formatItem: function (item) {                        if (item.full_name != "" && item.full_name != null && item.full_name != undefined) {                            return item.full_name + "<" + item.email + ">";                        }                        return item.email;                    },                    formatMatch: function (row, i, max) {                        return row.full_name + "<" + row.email + ">";                    },                    formatResult: function (item) {                        if (item.full_name != "" && item.full_name != null && item.full_name != undefined) {                            return item.full_name + "<" + item.email + ">";                        }                        return item.email;                    }                })                    .result(function (event, item) {                        $(this).blur();                    });            }        });    }})(jQuery);





样式文件 app.css,如下:

body{    margin: 0;padding: 0; font-family: "Microsoft Yahei"; font-size: 12px;}.lg-emailcontainer{ width: 100%;line-height: 30px;min-height: 30px; overflow: hidden; border:1px solid #ddd; cursor: text}.lg-editableAddr{ float: left;margin-left: 8px;}.edminfo{    background-color:#e8f0f7;padding: 2px 5px;    border:1px solid #ddd;     cursor: pointer;}.edmclose{background-color:#e8f0f7;padding: 2px 5px;    color: #999;    border:1px solid #ddd; margin-left: -1px; cursor: pointer;}.edminfo:hover, .edmclose:hover{    background-color:#9ACCFB;}.lg-editableAddr .edmactive{background-color:#2d59b3; color: #fff}.edm-addr{float:left; margin-left: 2px;}.edm-input{border:none; padding: 2px 5px; width: 10px; outline: none;}.edm-addr-txt{ display: none;}.lg-error .edminfo{     background-color:#cf3300;     color: #fff; }.lg-error .edmclose{    background-color:#ffeaea;    color: #cc3300;}


html文件 index.html 如下:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>实现收件人效果</title>    <link rel="stylesheet" href="css/app.css" />    <link rel="stylesheet" href="css/jquery.autocomplete.css" /></head><body><br><div id="email1" class="lg-emailcontainer">    <input type="hidden" class="lastresult"></div><script src="js/jquery.min.js"></script><script src="js/jquery.autocomplete.min.js"></script><script src="js/jquery.inputemail.js"></script><script>    //初始值参数    var mails="初始1<woaini520@21gmail.com>,初始2<4523434@qq.com>,hello.ye@gmail.com";    //联想邮件地址参数    var data = [{full_name:'测试1', email:'ceshi1@21gmail.com'}, {full_name:'测试12', email: 'ceshi2@163.com'},{full_name:'测试13', email:'ceshi3@21gmail.com'}, {full_name:'测试14', email: 'ceshi4@21gmail.com'},{full_name:'测试15', email:'ceshi5@21gmail.com'}, {full_name:'测试16', email: 'ceshi6@21gmail.com'}];    $("#email1").inputemail({        mails:mails,        tipdata:data    });</script></body></html>



实现效果如下图:




1 0