第十七篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示下)

前些时候用换了工作,本来是用的前端框架是easyui,后面用的是bootstrap。对于我来说虽然不是新东西,因为原来毕业时候用过一段时间,也不懂什么插件的开发,现在用过easyui后觉得easyui的用法比较好,容易上手,所有一直有个想法,去开发几个插件自己用用。不多说,上篇文章发面一个多选插件的使用方法,虽然有点不是很完善,但还是可以来用用的。这次就详细说说原理和开发的结节,以及要注意的地方。关于jQuery的插件开发根本也不是什么难的事情,下面就说的我的想法。

开发的原理

jQuery的插件开发大体来说共分两种,一种是静态方法的开发,一种是扩展的jQuery对象上面:

1、 静态方法的开发

说来就是在$上面添加方法,如easyui上面的弹出框,$.messger(….);

开发的基本格式为:

(function($, undefine) {

Var opt={};//默认属性值

$.Msger = function() {}

})(jQuery);

使用方法就是:$.Msger(…)

2、扩展对象开发

这个也没有什么难的,不过就是对象不一样的,一个是全局的jQuery对象,一个是选择后dom对象,注意这里上选择后的对象(并不是dom)如easyui上面,如果一个下拉框$(“#ddlmb”).combobox();

开发的基本格式

(function($, undefine) {

$.fn.mSelect = function(option) {

var _default = {};

var opt = $.extend(true, _default, option);

this.each(function(index, value) {});//这个是对选择的d对象进行遍历

})(jQuery);

开发的过程

下面就是看代码的事情的了,下面是我开发的多选插件的源码和API

对就的插件脚本“:

(function(window, undefine) {

    $.fn.mSelect = function(option) {
        var _default = {};

        var opt = $.extend(true, _default, option);

        this.each(function(index, value) {
            var dom = this;
            if (dom) {
                $.each(opt.data, function(idx, vlu) {
                    var strg = $("<strong></strong>").addClass("text-muted").html(vlu.Name + ":");
                    var fcDiv = $("<div></div>").append(strg).appendTo(dom);
                    //                    if (opt.isAll) {
                    //                        var aSelect = $("<span></span>").addClass("w-badge w-badge-info filter w-badge-custom").html("全选").attr({
                    //                            id:"All_"+idx
                    //                        });
                    //                        fcDiv.append(aSelect);
                    //                    }
                    //value代表一个行的数据
                    $.each(vlu.Item, function(ix, vl) {
                        CommonCreatItem(vlu, fcDiv, vl, true, dom); //传入当前的字段和当前的父容器,还有当前的数值
                    });
                    if (vlu.hasMore) {
                        var hSpan = $("<small></small>").addClass("w-badge filter").html("更多>>"); //.append($("<span></span>").addClass("caret"));
                        fcDiv.append(hSpan);
                        fcDiv.append("<br/>"); //强制换行
                        hSpan.click(function() {
                            if (hSpan.next().next().is(":hidden")) {
                                $(hSpan).nextAll().show(100);
                                $(hSpan).html("收起").append($("<span></span>").addClass("caret"));
                            } else {
                                $(hSpan).nextAll().removeClass("w-badge-info");
                                $(hSpan).nextAll().hide(100);
                                $(hSpan).html("更多>>");
                            }

                        });
                        $.each(vlu.hasMore, function(ix, vl) {
                            CommonCreatItem(vlu, fcDiv, vl, false, dom); //传入当前的字段和当前的父容器,还有当前的数值
                        });
                    }
                });
            }
        });

        function CommonCreatItem(vlu, fcDiv, vl, isShow, dom) {
            var dom = dom;
            //vl代表单个的数据
            //var fSpan = $("<span></span>").addClass("text-muted filter");
            var fSpan = $("<span></span>").addClass("w-badge filter w-badge-custom").attr({
                "pField": vlu.Field
            }); //添加默认的样式
            if (!isShow) {
                fSpan.attr({
                    type: "hasMore"
                }).hide();
            }
            if (opt.optionFunc) {
                //text的作为显示,value作为字段
                var ob=opt.optionFunc(vl, vlu);
                fSpan.html(ob.text);
                fSpan.attr({
                    "field":ob.value
                });
            } else {
                //text的作为显示,value作为字段
                fSpan.attr({
                    "field":vl.value
                });
                fSpan.html(vl.text);
            }
            /**
             * 绑定span事件
             */
            fSpan.click(function() {
                //对样式的修改 w-badge-info代表选中的唯一条件
                if (vlu.isMulti) { //是否允许多选?
                    if (fSpan.hasClass("w-badge-info")) {
                        fSpan.removeClass("w-badge-info");
                    } else {
                        fSpan.addClass("w-badge-info");
                    }
                } else {
                    if (fSpan.hasClass("w-badge-info")) {
                        fSpan.removeClass("w-badge-info");
                    } else {
                        fSpan.addClass("w-badge-info").siblings().removeClass("w-badge-info")
                    }

                }
                if (opt.onClick) {
                    var datajson = GetJson($(dom).find(".w-badge-info"));
                    var domList = $(dom).find(".w-badge-info")
                    opt.onClick(fSpan, datajson, domList);
                }
            });
            fSpan.hover(function() {
                if (opt.onHover) {
                    opt.onHover(fSpan)
                };
            });

            fcDiv.append(fSpan);
        }
    }

    function GetJson(cSpans) {
        var djson = {};
        $.each(cSpans, function(ix, vl) {
            var key = $(vl).attr("pfield");
            if (hasKey.call(djson, key) != -1) {
                djson[key].push($(vl).attr("field"));
            } else {
                djson[key] = [];
                djson[key].push($(vl).attr("field"));
            }

        });

        return djson;
    }
})(window);

function hasKey(k) {
    for (var key in this) {
        if (key === k) return 0;
    }
    return -1;
}

对应的样式:

对应的样式代码:

  .w-badge-info {
        background-color: #3a87ad !important;
        color: #fff !important;
    }

    .w-badge {
        display: inline-block;
        min-width: 10px;
        padding: 3px 7px;
        font-size: 12px;
        font-weight: 700;
        color: #fff;
        line-height: 1;
        vertical-align: baseline;
        white-space: nowrap;
        text-align: center;
        background-color: #777;
        border-radius: 10px;
    }

    .filter {
        margin: 5px;
    }
        .filter:hover {
            background-color: #999 !important;
            color: #fff;
            cursor: pointer;
        }

    .w-badge-custom {
        /*font-size: 17px;*/
        background-color: #fff ;
        color: #0f0f0f;
    }

自己又做了修改,添加的选项的code和value,具体的使用方法和效果如下:

$(function() {
        $("#msdiv").mSelect({
            data: [{
                Field: "Brand",
                Name: "商标",
                Item: [{value:"len",text:"lenovo"}, {value:"Ace",text:"Acer"},{value:"Sum",text:"Sumsan"}], //列表数据
                hasMore: [{value:"H",text:"HP"}, {value:"shenzhou",text:"神舟"},{value:"DE",text:"DELL"}], //更多的列表数据
                isMulti: true //当前的字段的值是否支持多选
            }, {
                Field: "Price",
                Name: "价格",
                Item: [{value:1,text:"<3000"},{value:2,text:"4000-5000"}, {value:3,text:"5000-7000"}],
                hasMore: [{value:4,value:"7000-8000"},{value:5,text:"8000-12000"}],
                isMulti: false
            }, {
                Field: "Type1",
                Name: "类型1",
                Item: ["filter1", "filer1_1", "filter1_2", "filer1_3"],
                isMulti: true
            }, {
                Field: "Type2",
                Name: "类型2",
                Item: ["filter2", "filer2_1", "filter2_2", "filer2_3"],
                isMulti: false
            }], //数据格式
            //isAll:true,//是否包括全选,废弃不用
            optionFunc: function(value, index) { //修改数据的值,可以自定义HTML.如添加图片
//                if(value=="lenovo")
//                {
//                    return "<img src=‘https://ss2.bdstatic.com/9rUZbzqaKgQFm2e88IuM_a/resource/fFhO6R-C0CBiZmAS9VsRZIk30WXQhaSC0mTQ9VsRhV0W0VsS0CXQZdRenFvkrUZwBmhMBmsenGv3XURbBWZSBmZaBUkL.jpg‘/>";
//                }
                return value;
            },
            onHover: function(target) { //在上面滑动时事件,缺省无效果,参数为当前的节点
                //                console.log(target.text());
            },
            onClick: function(target, filter, domList) {
                //每点击一次的事件,参数为当前节点,当前所有选择的条件,所有选择的DOM,便于后期扩展
                   alert(target.text()+"  "+JSON.stringify(filter));
            }
        });
    });

静态方法开发事例:

这个是基于bootstrap做的提示框,估计项目中也常常用到用法如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />
        <script type="text/javascript" src="js/jquery-2.1.4.min.js"></script>
        <script type="text/javascript" src="js/bootstrap.min.js"></script>
        <script type="text/javascript" src="js/Message.js"></script>
    </head>

    <body>
        <button class="btn btn-primary" id="btnAlert">弹出Alert</button>
        <button class="btn btn-primary" id="btnConfirm">弹出Confirm</button>
        <button class="btn btn-primary" id="btnPromp">弹出Promp</button>

</html>
<script>
    $(function() {
        $("#btnAlert").click(function() {
            $.Msger("alert", "提示", "你错了");
        });
        $("#btnConfirm").click(function() {
            $.Msger("confirm", "提示", "你错了", function(e) {
                if (!e) {
                    alert(false);
                }
            });
        });
        $("#btnPromp").click(function() {
            $.Msger("promt", "提示", function(e,s) {

                    alert(e+s);

            });
        });
    });
</script>

源码如下:

(function($, undefine) {
    $.Msger = function() {
        var info = {};
        info.type = arguments[0] || "";
        info.title = arguments[1] || "";
        info.content = arguments[2] || "";
        info.content = arguments[2] || "";
        info.callBack = arguments[3] || "";
        var _msgD = {};
        var a = $("<div></div>").addClass("modal fade"); //model
        var b = $("<div></div>").addClass("modal-dialog modal-sm").appendTo(a); //dialog
        var c = $("<div></div>").addClass("modal-content").appendTo(b); //content
        var dh = $("<div></div>").addClass("modal-header").appendTo(c); //title
        var dc = $("<div></div>").addClass("modal-body").appendTo(c); //content
        var df = $("<div></div>").addClass("modal-footer").appendTo(c); //footter
        $("body").append(a); //添加到body
        _a[info.type].call(info, dh, dc, df, a);
        a.on("hidden.bs.modal", function() {
            a.remove();
        });
    };
    var _a = {
        alert: function() {
            var dh = arguments[0];
            var dc = arguments[1];
            var df = arguments[2];
            var a = arguments[3];
            var info = this;
            if (!info.callBack) {
                dh.html(info.title);
                dc.html(info.content);
                $("<button></button>").addClass("btn btn-primary").attr({
                    "data-dismiss": "modal"
                }).html("确定").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                });
            } else {
                ///先这样写 后面还要修改 要添加对类型的显示
                dh.html(info.title);
                dc.html(info.content);
                $("<button></button>").addClass("btn btn-primary").attr({
                    "data-dismiss": "modal"
                }).html("确定").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                });
            }
            a.modal({
                width: 500,
                backdrop: ‘static‘
            });
        },
        confirm: function() {
            var dh = arguments[0];
            var dc = arguments[1];
            var df = arguments[2];
            var a = arguments[3];
            var info = this;
            dh.html(info.title);
            dc.html(info.content);
            if (info.callBack) {

                $("<button></button>").addClass("btn btn-primary").attr({
                    "data-dismiss": "modal"
                }).html("确定").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                    info.callBack(true);

                });
                $("<button></button>").addClass("btn btn-default").attr({
                    "data-dismiss": "modal"
                }).html("取消").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                    info.callBack(false);
                });
            } else {
                ///先这样写 后面还要修改 要添加对类型的显示
                $("<button></button>").addClass("btn btn-primary").attr({
                    "data-dismiss": "modal"
                }).html("确定").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                });
                $("<button></button>").addClass("btn btn-default").attr({
                    "data-dismiss": "modal"
                }).html("取消").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                });
            }
            a.modal({
                width: 500,
                backdrop: ‘static‘
            });

        },
        promt: function() {
            var dh = arguments[0];
            var dc = arguments[1];
            var df = arguments[2];
            var a = arguments[3];
            var info = this;
            dh.append($("<h6></h6>").html(info.title));
            //              if(info.content){
            //                  dc.html(info.content);
            //              }
            var i = $("<input type=‘text‘/>").addClass("form-control");
            dc.append(i)
            info.callBack = info.content;
            if (info.callBack) {
                $("<button></button>").addClass("btn btn-sm btn-primary").attr({
                    "data-dismiss": "modal"
                }).html("确定").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                    info.callBack(i.val(), true);

                });
                $("<button></button>").addClass("btn btn-sm btn-default").attr({
                    "data-dismiss": "modal"
                }).html("取消").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                    info.callBack(i.val(), false);
                });
            } else {
                ///先这样写 后面还要修改 要添加对类型的显示
                $("<button></button>").addClass("btn btn-sm btn-primary").attr({
                    "data-dismiss": "modal"
                }).html("确定").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                });
                $("<button></button>").addClass("btn btn-sm btn-default").attr({
                    "data-dismiss": "modal"
                }).html("取消").appendTo(df).click(function() {
                    a.modal(‘hide‘);
                });
            }
            a.modal({
                width: 500,
                backdrop: ‘static‘
            });

        }
    }

})(jQuery);

有问题请联系我 邮件[email protected]

时间: 2024-10-22 21:19:54

第十七篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示下)的相关文章

第十六篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示上)

这几天学习Bootstrap,本来是两年前的用的东西,现在又重新拾起来,又有很多重新的认识,看了Bootstrap的样式偏多,插件现在还没有学习到几个,也有写几个插件自己用的想法.正好工作上也会用到,现在就写一个京东上筛选商品的插件,不多说上图. 首先看下API 这次只是用来说明下功能 下篇开始说具体的思路,其实也不难自己可以学习下,Demo奉上,但是js代码加密,有想学习都请邮件联系我:[email protected] Demo:http://pan.baidu.com/s/1i3q6oYT

Jquery特效之=》仿京东多条件筛选特效

仿京东多条件筛选特效 品牌: 全部 惠普(hp) 联想(Lenovo) 联想(ThinkPad) 宏基(acer) 华硕 戴尔 三星 索尼 东芝 Gateway 微星 海尔 清华同方 富士通 苹果(Apple) 神舟 方正 优雅 价格: 全部 1000-2999 3000-3499 3500-3999 4000-4499 4500-4999 5000-5999 6000-6999 7000-9999 10000以上 尺寸: 全部 8.9英寸及以下 11英寸 12英寸 13英寸 14英寸 15英寸

浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

第十七篇:博采众长--初探WDDM驱动学习笔记(七)

基于WDDM驱动的DirectX视频加速重定向框架设计与实现 现在的研究生的论文, 真正质量高的, 少之又少, 开题开得特别大, 动不动就要搞个大课题, 从绪论开始到真正自己所做的内容之间, 是东拼西凑地抄概念, 抄公式, 达到字数篇幅的要求, 而自己正真做了什么, 有哪些实际感受, 做出的内容, 相比前面的东拼西凑就几点内容, 之后就草草结束, 步入感谢的段落. 原因不光只有学生自己, 所谓的读研, 如果没有一个环境, 学生有再大的愿望, 再强的毅力, 到头来也只是空无奈. 有些导师要写书,

第十七篇:曲径通幽处,禅房花木深--初探WDDM驱动学习笔记(一)

正好需要对WINDOWS的WDDM有所了解, 于是就翻了下MSDN. 微软对设备驱动的框架设计非常周全. 无论WDDM, AVSTREAM, 还是USB STACK, STORAGE, 以及其它技术类型的设备驱动, 都是以port/miniport, class/miniclass的形式展开, 微软将经过严密设计,开发,测试的port/class驱动提供给IHV,而IHV只需要把工作重心放到mini驱动的开发上去, 大大降低了项目风险, 人力成本,以及时间成本. AVSTREAM是PCTV的框架

浅谈android中只使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是只使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.近期公司一直加班也没来得及时间去整理,今天难得歇息想把这个分享给大家.只求共同学习,以及自己兴许的复习. 为什么会想到使用一个TextView来实现呢?由于近期公司在做一些优化的工作,当中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的.实现的代码冗余比較大.故此项目经理就说:小宏这个就交给你来优化了.而且还要保证有一定的扩展性,当时就懵逼了.不知道从何处開始

iOS仿京东分类菜单之UICollectionView内容

 iOS仿京东分类菜单之UICollectionView内容 在 上<iOS仿京东分类菜单实例实现>已经实现了大部分主体的功能,本文是针对右边集合列表进行修改扩展,使它达到分组的效果,本文涉及到的主要是UICollectionView的知识内容,左边列表的实现见上一篇文章,先看实现的效果图: 一:实体的创建 1.1分组实体的创建(tagID跟左边表格进行关联,roomArray是存放房间的数组,也就是单元格的集合) #import <Foundation/Foundation.h>

第十七篇 想

第十七篇  想 "想",是人类物种所具有的一项高级能力,在这种能力的帮助下,人类可以创造出属于自己的文明.就着这个主题,我会把"想"这项能力向亲人们讲述清楚. 我们这个生命体是宇宙中高频能量的结晶,其结构无比精妙与复杂.可以说任何一个高智慧物种的出现,都是基于大宇宙有这样的需求,从而汇集宇宙中的可利用条件创造而成.人类这个物种之所以出现在这个宇宙中,也是由于宇宙的需要,同时人类也被创造者赋予了"想"这项高级能力.正是因为拥有这项能力,才使人类能够

商城项目实战 | 2.2 Android 仿京东商城——自定义 Toolbar (二)

本文为菜鸟窝作者刘婷的连载."商城项目实战"系列来聊聊仿"京东淘宝的购物商城"如何实现. 上一篇文章<商城项目实战 | 2.1 Android 仿京东商城--自定义 Toolbar (一)>中已经对 Toolbar 的一些基本属性以及简单使用做了介绍了,这篇文章就开始介绍如何定义属于自己的 Style 的 Toolbar 了. 自定义 Theme 修改 application 的 style -- AppTheme,自己设置 Toolbar 的背景色以及