zoukankan      html  css  js  c++  java
  • 联动下拉框 jquery插件(三)

    <select id="CategoryFirst" class="ld-select-1" name="CategoryFirst"><option value="">请选择大类</option></select>
    
    <select id="CategorySecond" class="ld-select-1" name="CategorySecond"><option value="">请选择小类</option></select>
    <script src="../Scripts/jquery-1.6.1.min.js" type="text/javascript"></script>
    
    <script src="../Scripts/jQuery.LiveSelect.js" type="text/javascript"></script>
    
    $(".ld-select-1").ld({ ajaxOptions: { "url": "../Ajax/CategoryHandler.ashx" }, defaultParentId: 1,
    
        style: { "width": 120 }
    
    });
    
     if (context.Request.Params["CategoryParentID"] != null)
    
     {
    
         sql = String.Format("SELECT CategoryId ,CategoryName  FROM B_Category 
    
         WHERE CategoryParentID='{0}'", context.Request.Params["CategoryParentID"]);
    
     }
    
    
    
    数据库 单表 id name parentid
    json格式 同 前第一篇


    插件:
    (function ($) {
        $.fn.ld = function (options) {
            var opts;
            var DATA_NAME = "ld";
            //返回API
            if (typeof options == 'string') {
                if (options == 'api') {
                    return $(this).data(DATA_NAME);
                }
            }
            else {
                var options = options || {};
                //覆盖参数
                opts = $.extend(true, {}, $.fn.ld.defaults, options);
            }
            if ($(this).size() > 0) {
                var ld = new yijs.Ld(opts);
                ld.$applyTo = $(this);
                ld.render();
                $(this).data(DATA_NAME, ld);
            }
            return $(this);
        }
        var yijs = yijs || {};
        yijs.Ld = function (options) {
            //参数
            this.options = options;
            //起作用的对象
            this.$applyTo = this.options.applyTo && $(this.options.applyTo) || null;
            //缓存前缀
            this.cachePrefix = "data_";
            //写入到选择框的option的样式名	
            this.OPTIONS_CLASS = "ld-option";
            //缓存,为一个对象字面量。
            this.cache = {};
        }
        yijs.Ld.prototype = {
            /**
            * 运行
            * @return {Object} this
            */
            render: function () {
                var _that = this;
                var _opts = this.options;
                if (this.$applyTo != null && this.size() > 0) {
                    _opts.style != null && this.css(_opts.style);
                    //加载默认数据,向第一个选择框填充数据
                    this.load(_opts.defaultLoadSelectIndex, _opts.defaultParentId);
                    _opts.texts.length > 0 && this.selected(_opts.texts);
                    //给每个选择框绑定change事件
                    this.$applyTo.each(function (i) {
                        i < _that.size() - 1 && $(this).bind("change.ld", { target: _that, index: i }, _that.onchange);
                    })
                }
                return this;
            },
            texts: function (ts) {
                var that = this;
                var $select = this.$applyTo;
                var _arr = [];
                var txt = null;
                var $options;
                $select.each(function () {
                    txt = $(this).children('.' + that.OPTIONS_CLASS + ':selected').text();
                    _arr.push(txt);
                })
                return _arr;
            },
            /**
            * 获取联动选择框的数量
            * @return {Number} 选择框的数量
            */
            size: function () {
                return this.$applyTo.size();
            },
            /**
            * 设置选择框的样式
            * @param {Object} style 样式
            * @return {Object} this
            */
            css: function (style) {
                style && this.$applyTo.css(style);
                return this;
            },
            /**
            * 读取数据,并写入到选择框
            * @param {Number} selectIndex 选择框数组的索引值
            * @param {String} parent_id  父级id
            */
            load: function (selectIndex, parent_id, callback) {
                var _that = this;
                //清理index以下的选择框的选项
                for (var i = selectIndex; i < _that.size(); i++) {
                    _that.removeOptions(i);
                }
                //存在缓存数据,直接使用缓存数据生成选择框的子项;不存在,则请求数据
                if (_that.cache[parent_id]) {
                    _that._create(_that.cache[parent_id], selectIndex);
                    _that.$applyTo.eq(selectIndex).trigger("afterLoad");
                    if (callback) callback.call(this);
                } else {
                    var _ajaxOptions = this.options.ajaxOptions;
                    var _d = _ajaxOptions.data;
                    var _parentIdField = this.options.field['parent_id'];
                    _d[_parentIdField] = parent_id;
                    //传递给后台的参数
                    _ajaxOptions.data = _d;
                    //ajax获取数据成功后的回调函数
                    _ajaxOptions.success = function (data) {
                        //遍历数据,获取html字符串
                        if (data.success) {    //2011-6-1 修改
                            var _h = _that._getOptionsHtml(data.data);  //2011-5-31 修改
                            _that._create(_h, selectIndex);
                            _that.cache[parent_id] = _h;
                            _that.$applyTo.eq(selectIndex).trigger("afterLoad.ld");
                            if (callback) callback.call(this);
                        }    
                    }
                    $.ajax(_ajaxOptions);
                }
            },
            /**
            * 删除指定index索引值的选择框下的选择项
            * @param {Number} index 选择框的索引值
            * @return {Object} this
            */
            removeOptions: function (index) {
                this.$applyTo.eq(index).children("." + this.OPTIONS_CLASS).remove();
                return this;
            },
            selected: function (t, completeCallBack) {
                var _that = this;
                if (t && typeof t == "object" && t.length > 0) {
                    var $select = this.$applyTo;
                    _load(_that.options.defaultLoadSelectIndex, _that.options.defaultParentId);
                }
                /**
                * 递归获取选择框数据
                * @param {Number} selectIndex 选择框的索引值
                * @param {Number} parent_id   id
                */
                function _load(selectIndex, parent_id) {
                    _that.load(selectIndex, parent_id, function () {
                        var id = _selected(selectIndex, t[selectIndex]);
                        selectIndex++;
                        if (selectIndex > _that.size() - 1) {
                            if (completeCallBack) completeCallBack.call(this);
                            return;
                        }
                        _load(selectIndex, id);
                    });
                }
                /**
                * 选中包含指定文本的选择项
                * @param {Number} index 选择框的索引值
                * @param {String} text  文本
                * @return {Number} 该选择框的value值
                */
                function _selected(index, text) {
                    var id = 0;
                    _that.$applyTo.eq(index).children().each(function () {
                        var reg = new RegExp(text);
                        if (reg.test($(this).text())) {
                            $(this).attr("selected", true);
                            id = $(this).val();
                            return;
                        }
                    })
                    return id;
                }
                return this;
            },
            /**
            * 选择框的值改变后触发的事件
            * @param {Object} e 事件
            */
            onchange: function (e) {
                //实例化后的对象引用
                var _that = e.data.target;
                //选择框的索引值
                var index = e.data.index;
                //目标选择框
                var $target = $(e.target);
                var _parentId = $target.val();
                var _i = index + 1;
                _that.load(_i, _parentId);
            },
            /**
            * 将数据源(json或xml)转成html
            * @param {Object} data
            * @return {String} html代码字符串
            */
            _getOptionsHtml: function (data) {
                var _that = this;
                var ajaxOptions = this.options.ajaxOptions;
                var dataType = ajaxOptions.dataType;
                var field = this.options.field;
                var _h = "";
                _h = _getOptions(data, dataType, field).join(""); ;
                /**
                * 获取选择框项html代码数组
                * @param {Object | Array} data 数据
                * @param {String} dataType 数据类型
                * @param {Object} field 字段
                * @return {Array} aStr 
                */
                function _getOptions(data, dataType, field) {
                    var optionClass = _that.OPTIONS_CLASS;
                    var aStr = [];
                    var id, name;
                    if (dataType == "json") {
                        $.each(data, function (i) {
                            id = data[i][field.region_id];
                            name = data[i][field.region_name];
                            var _option = "<option value='" + id + "' class='" + optionClass + "'>" + name + "</option>";
                            aStr.push(_option);
    
                        })
                    } else if (dataType == "xml") {
                        $(data).children().children().each(function () {
                            id = $(this).find(field.region_id).text();
                            name = $(this).find(field.region_name).text();
                            var _option = "<option value='" + id + "' class='" + optionClass + "'>" + name + "</option>";
                            aStr.push(_option);
                        })
                    }
                    return aStr;
                }
                return _h;
            },
            /**
            * 向选择框添加html
            * @param {String} _h html代码
            * @param {Number} index 选择框的索引值
            */
            _create: function (_h, index) {
                var _that = this;
                this.removeOptions(index);
                this.$applyTo.eq(index).append(_h);
            }
        }
        $.fn.ld.defaults = {
            /**选择框对象数组*/
            selects: null,
            /**ajax配置*/
            ajaxOptions: {
                url: null,
                type: 'get',
                data: {},
                dataType: 'json',
                success: function () { },
                beforeSend: function () { }
            },
            /**默认父级id*/
            defaultParentId: 0,
            /**默认读取数据的选择框*/
            defaultLoadSelectIndex: 0,
            /**默认选择框中的选中项*/
            texts: [],
            /**选择框的样式*/
            style: null,
            /**选择框值改变时的回调函数*/
            change: function () { },
            field: {
                region_id: "CategoryId",
                region_name: "CategoryName",
                parent_id: "CategoryParentID"
            }
    
        }
    })(jQuery);
  • 相关阅读:
    FZU-2087 统计树边(最小生成树)
    HDU-1599 find the mincost route(floyd求最小环)
    BZOJ-1191 [HNOI2006]超级英雄Hero(二分图匹配)
    FZU-2020 组合(Lucas定理)
    FZU-2232 炉石传说(二分图匹配)
    NOIP2016模拟 拼接mf(模拟)
    2016年11月10日00:26:08
    BZOJ2986 Non-Squarefree Numbers
    BZOJ3624 [Apio2008]免费道路
    BZOJ3224 Tyvj 1728 普通平衡树
  • 原文地址:https://www.cnblogs.com/zengxiangzhan/p/2072733.html
Copyright © 2011-2022 走看看