我的开源框架之面板控件

需求:

(1)可伸缩、扩大、缩小

(2)可自定义工具栏(依赖工具栏控件),工具栏可定义位置

(3)可加装远程数据

实现图例

客户代码

        function addMoreTools() {
            var toolbar = panel.panel("getToolbar");
            toolbar.toolbar(‘addButtons‘, [
               {
                   id: ‘btn_5‘,
                   text: ‘按钮5‘,
                   iconCls: ‘icon-edit‘,
                   handler: function () {
                       alert("我的处理5");
                   }
               }, {
                   id: ‘btn_6‘,
                   text: ‘按钮6‘,
                   iconCls: ‘icon-add‘,
                   handler: function () {
                       alert("我的处理6");
                   }
               }
            ]);
        }
        function delTools() {
            var toolbar = panel.panel("getToolbar");
            toolbar.toolbar(‘delButtons‘, [‘btn_1‘]);
        }
        function disableTools() {
            var toolbar = panel.panel("getToolbar");
            toolbar.toolbar(‘disableButtons‘, [‘btn_2‘]);
        }
        function enableTools() {
            var toolbar = panel.panel("getToolbar");
            toolbar.toolbar(‘enableButtons‘, [‘btn_2‘]);
        }
        var panel;
        $(function () {
            panel = $("#panelContainer").panel({
                //toolbarPostion:‘left‘,
                title: ‘我的标题‘,
                iconCls: ‘icon-save‘,
                collapseable: true, //可收缩
                remoteRequest: {
                    url: ‘content.html‘,
                    load: function () { },
                    loaded: function (result) { }
                }
            });
        });
        function addTools() {
            panel.panel("addTools", {
                btnList: [
                {
                    id: ‘btn_1‘,
                    text: ‘按钮1‘,
                    iconCls: ‘icon-edit‘,
                    handler: function () {
                        alert("我的处理1");
                    }
                }, {
                    id: ‘btn_2‘,
                    text: ‘按钮2‘,
                    iconCls: ‘icon-add‘,
                    handler: function () {
                        alert("我的处理2");
                    }
                }
                ]
            });
        }
        function reload(flag) {
            if (flag == 1) {
                panel.panel("remoteLoad", {
                    url: ‘testServer/jsonQuestTest.ashx‘,
                    dataType: ‘json‘,
                    load: function () { },
                    loaded: function (result) {
                        panel.panel("setContect", result);
                    }
                });
            } else {
                panel.panel("reload", {
                    dataType: ‘html‘,
                    url: ‘content.html‘,
                    load: function () { },
                    loaded: function (result) {
                    }
                });
            }
        }

组件代码

/******************************************
*作者:hjwen
*电邮:[email protected]
*版本:1.0
*版权许可:中国通用开源许可协议V1.0
*说明:面板定义
******************************************/
(function ($) {
    /******渲染目标*******/
    function renderHtml(target) {
        var opts = target.data(‘settings‘);
        target.addClass("panel-body");
       var csswidth =  target.css("width");
        var width = target.width();
        var height = target.height();
        target.attr(‘originalwidth‘, width);//先保留原来的宽度
        target.attr(‘originalheight‘, height);//先保留原来的宽度
        if (width == 0) {
            if (opts.width != ‘auto‘) {
                width = opts.width;
            } else {
                width = target.parent().width();
            }
        }
        if (height == 0) {
            if (opts.height != ‘auto‘) {
                height = opts.height;
            } else {
                height = target.parent().height();
            }
        }
        var headerBorderStyle = "";
        if (opts.displayBorder) {
            headerBorderStyle = "border-left:none;border-top:none;border-right:none;";
            target.css("border","none");
        }
        if (opts.fillAuto) {
            width = ‘auto‘;
        } else {
            width = width+‘px‘;
        }
        var wrap = target.wrap("<div style=\"width:" + width + ";height:" + height + "px;\" class=\"panel-wrap\"></div>").css({ width: ‘auto‘ });
        var toolsClass,titleClass;
        if (opts.toolbarPostion === ‘left‘) {
            titleClass = "panel-tilte panel-tilte-pos-right";
            toolsClass = "panel-tools panel-tools-pos-left ";
        } else {
            titleClass = "panel-tilte panel-tilte-pos-left";
            toolsClass = "panel-tools panel-tools-pos-right ";
        }
        var titleWrap = $("<div style=\"" + headerBorderStyle + "\" class=\"panel-header\"><div  class=\"" + titleClass + "\"><h2 style=\"padding-right:6px\"></h2></div><div  class=\"" + toolsClass + "\"></div></div>");
        target.before(titleWrap);
        //设置title
        titleWrap = target.prev();
        if (opts.title != null) {
            titleWrap.children(".panel-tilte").children("h2").html(opts.title);
        }
        if (opts.iconCls != null) {
            titleWrap.children(".panel-tilte").children("h2").addClass(opts.iconCls).css("padding-left", "18px");
        }
        //设置自带工具
        var toolWrap = titleWrap.children(".panel-tools");
        if (opts.expandable) {//可上下展开
            $("<div class=\"panel-tool-btn panel-tool-expand\"></div>").prependTo(toolWrap).bind({
                click: _expandToggle,
                mouseover: function () {
                    $(this).addClass("panel-tool-btn-hover");
                },
                mouseout: function () {
                    $(this).removeClass("panel-tool-btn-hover");
                }
            });
        }
        if (opts.maximizable) {//可大小控制
            var tmpObj = $("<div class=\"panel-tool-btn\"></div>").prependTo(toolWrap).bind({
                click: _maxminToggle,
                mouseover: function () {
                    $(this).addClass("panel-tool-btn-hover");
                },
                mouseout: function () {
                    $(this).removeClass("panel-tool-btn-hover");
                }
            });
            if (opts.maximized) {
                tmpObj.addClass("panel-tool-min");
            } else {
                tmpObj.addClass("panel-tool-max");
            }
        }
        if (opts.closeable) {//可关闭
            $("<div class=\"panel-tool-btn panel-tool-closeable\"></div>").prependTo(toolWrap).bind({
                click: _close ,
                mouseover: function () {
                    $(this).addClass("panel-tool-btn-hover");
                },
                mouseout: function () {
                    $(this).removeClass("panel-tool-btn-hover");
                }
            });
        }
        if (opts.collapseable) {//可左右收缩
            var iocClass;
            if (opts.collapsePostion === ‘left‘)
                iocClass = "panel-tool-btn-left";
            else
                iocClass = "panel-tool-btn-right";
            $("<div class=\"panel-tool-btn " + iocClass + "\"></div>").prependTo(toolWrap).bind({
                click: _collapsedToggle,
                mouseover: function () {
                    $(this).addClass("panel-tool-btn-hover");
                },
                mouseout: function () {
                    $(this).removeClass("panel-tool-btn-hover");
                }
            });
        }
        target.css("height", (height - titleWrap.innerHeight()-3) + "px");
        /*************UI交互定义**************/
        function _close() {
            close(target);
        };
        function _maxminToggle() {
            if ($(this).hasClass(‘panel-tool-min‘)) {
                min(target);
            } else {
                max(target);
            }
        };
        function _expandToggle() {
            if ($(this).hasClass(‘panel-tool-expand‘)) {
                disexpand(target);
            } else {
                expand(target);
            }
        };
        function _collapsedToggle() {
            var iocClass;
            if (opts.collapsePostion === ‘left‘)
                iocClass = "panel-tool-btn-right";
            else
                iocClass = "panel-tool-btn-left";

            if ($(this).hasClass(iocClass)) {
                discollapsed(target);
            } else {
                collapsed(target);
            }
        };
        remoteRequest(target);
    };
    /************私有方法********************/
    /****
    *远程加载数据
    ****/
    function remoteRequest(target) {
        var opts = target.data(‘settings‘);
        if (opts.remoteRequest == null)
            return;
        if (typeof opts.remoteRequest === ‘object‘ && typeof opts.remoteRequest.url != ‘undefined‘) {
            var dataType = typeof opts.remoteRequest.dataType === ‘undefined‘ ? ‘html‘ : opts.remoteRequest.dataType;
            if (dataType != ‘json‘) {
                var settings = { url: opts.remoteRequest.url };
                if (typeof opts.remoteRequest.load == ‘function‘)
                    settings.load = opts.remoteRequest.load;
                if (typeof opts.remoteRequest.loaded == ‘function‘)
                    settings.loaded = opts.remoteRequest.loaded;
                $.myui.objectLoadContect({
                    target: target,
                    settings: settings
                });
            } else {
                var ajaxopt = {
                    url: opts.remoteRequest.url,
                    loadingContainer: target
                };
                if (typeof opts.remoteRequest.loaded === ‘function‘) {
                    ajaxopt.okdeal = opts.remoteRequest.loaded;
                }
                if (typeof opts.remoteRequest.load == ‘function‘)
                    opts.remoteRequest.load();
                $.myui.ajaxRequest(ajaxopt);
            }
        }
    };
    /***
    *重新设置面板内容高度
    ****/
    function resizeBobyHeight(target) {
        var titleWrap = target.prev();
        var height = target.parent().innerHeight();
        target.css("height", (height - titleWrap.innerHeight() - 3) + "px");
    };
    //展开
    function discollapsed(target) {
        var opts = target.data(‘settings‘);
        if (typeof opts.onCollapse === ‘function‘) {
            opts.onCollapse(target,1);
        }
        var wrap = target.parent();
        var header = target.prev();
        header.addClass("panel-header");
        if (opts.collapsePostion === ‘left‘){
            header.find(".panel-tool-btn-right").removeClass("panel-tool-btn-right").addClass("panel-tool-btn-left");
        } else{
            header.find(".panel-tool-btn-left").removeClass("panel-tool-btn-left").addClass("panel-tool-btn-right");
        }

        if (opts.fillAuto) {
            header.css("border-bottom", "1px solid #99BBE8");
            wrap.width(‘auto‘);
        } else {
            header.css("border", "1px solid #99BBE8");
            wrap.width(target.attr(‘originalwidth‘));
        }
        header.children(".panel-tilte").show();
        header.children(".panel-tools").children("div").show();
        wrap.css("background", "none");
        wrap.css("border", "none");
        wrap.height(target.attr(‘originalheight‘));
        target.show();
        if (typeof opts.onCollapsed === ‘function‘) {
            opts.onCollapsed(target, 1);
        }
    };
    //收缩
    function collapsed(target) {
        var opts = target.data(‘settings‘);
        if (typeof opts.onCollapse === ‘function‘) {
            opts.onCollapse(target, 0);
        }
        var wrap = target.parent();
        wrap.width(20);
        wrap.css("background-color", "#C1D1E5");
        var header = target.prev();
        header.removeClass("panel-header");
        header.css({"border":"none","position":"relative","height":"28px"});
        header.children(".panel-tilte").hide();

        if (opts.collapsePostion === ‘left‘) {
            header.children(".panel-tools").children("div:not(.panel-tool-btn-left)").hide();
            header.find(".panel-tool-btn-left").removeClass("panel-tool-btn-left").addClass("panel-tool-btn-right");
        } else {
            header.children(".panel-tools").children("div:not(.panel-tool-btn-right)").hide();
            header.find(".panel-tool-btn-right").removeClass("panel-tool-btn-right").addClass("panel-tool-btn-left");
        }

        if (!opts.displayBorder) {
            wrap.height(wrap.height()-2);
            wrap.css("border", "1px solid #99BBE8");
        }
        target.hide();
        if (typeof opts.onCollapsed === ‘function‘) {
            opts.onCollapsed(target, 0);
        }
    };
    /***
    *关闭
    ****/
    function close(target) {
        var opts = target.data(‘settings‘);
        if (typeof opts.onClose === ‘function‘) {
            opts.onClose(target);
        }
        var wrap = target.parent();
        target.removeData(‘settings‘);
        wrap.remove();
        if (typeof opts.onClosed === ‘function‘) {
            opts.onClosed();
        }
    };
    /***
     *最大化
     ****/
    function max(target) {
        var wrap = target.parent();
        var parent = wrap.parent();
        var newWidth = parent.width()-2;//border宽度占用了两个像数
        var newHeight = parent.height();
        var opts = target.data(‘settings‘);
        wrap.css({ width: newWidth + "px", height: newHeight + "px" });
        target.prev().find(".panel-tool-max").removeClass("panel-tool-max").addClass("panel-tool-min");
        resizeBobyHeight(target);
    };
    /***
    *还原
    ****/
    function min(target) {
        var wrap = target.parent();
        var opts = target.data(‘settings‘);
        wrap.css({ width: target.attr(‘originalwidth‘) + "px", height: target.attr(‘originalheight‘) + "px" });
        target.prev().find(".panel-tool-min").removeClass("panel-tool-min").addClass("panel-tool-max");
        resizeBobyHeight(target);
    };
    /***
    *向下展开
    ****/
    function expand(target) {
        var opts = target.data(‘settings‘);
        var wrap = target.parent();
        wrap.height(opts.srcWrapHeight + "px");
        if (typeof opts.onExpand === ‘function‘) {
            opts.onExpand(target);
        }
        target.show().prev().find(".panel-tool-disexpand").removeClass("panel-tool-disexpand").addClass("panel-tool-expand");
        if (typeof opts.onExpanded === ‘function‘) {
            opts.onExpanded(target);
        }
    };
    /***
    *向上收起
    ****/
    function disexpand(target) {
        var wrap = target.parent();
        var srcWrapHeight = wrap.height();
        var opts = target.data(‘settings‘);
        opts.srcWrapHeight = srcWrapHeight;
        wrap.height(target.prev().height() + "px");
        if (typeof opts.onExpand === ‘function‘) {
            opts.onExpand(target);
        }
        target.hide().prev().find(".panel-tool-expand").removeClass("panel-tool-expand").addClass("panel-tool-disexpand");
        if (typeof opts.onExpanded === ‘function‘) {
            opts.onExpanded(target);
        }
    };
    /**********私有方法结束*******************/
    var methods = {
        init: function (options) {
            return this.each(function () {
                var $this = $(this);
                var settings = $this.data(‘settings‘);
                if (typeof (settings) == ‘undefined‘) {
                    settings = $.extend({}, $.fn.panel.defaults, options);
                    $this.data(‘settings‘, settings);
                } else {
                    settings = $.extend({}, settings, options);
                }
                //创建ui布局
                renderHtml($this);
            });
        },
        destroy: function () {
            return $(this).each(function () {
                var $this = $(this);
                close($this);
            });
        },
        /****
        * 添加工具参数说明:
        * options={
                    btnStyle:‘plain‘,
                    btnList:[{  text:‘按钮名称‘,
                   iconCls:‘图标类名称‘
                    handler:function(){.........}处理事件
                },..........]}
        *****/
        addTools: function (options) {
            return $(this).each(function () {
                var $this = $(this);
                if ($this.data(‘settings‘).toolbar == null) {
                    var toolWrap = $this.prev().children(".panel-tilte");
                    var tool_cotainer = $("<div class=\"tool-container\"></div>").appendTo(toolWrap);
                    if (typeof options.btnStyle == ‘undefined‘)
                        options.btnStyle = ‘plain‘;
                    $this.data(‘settings‘).toolbar = tool_cotainer.toolbar(options);
                } else {
                    $this.data(‘settings‘).toolbar.toolbar(‘addButtons‘, options.btnList);
                }
            });
        },
        /****
        * 获取工具栏对象
        ****/
        getToolbar: function () {
            var $this = $(this);
            var toolbar = null;
            if ($this.data(‘settings‘).toolbar == null) {
                var toolWrap = $this.prev().children(".panel-tilte");
                var tool_cotainer = $("<div class=\"tool-container\"></div>").appendTo(toolWrap);
                toolbar = tool_cotainer.toolbar({ btnList: [] });
            } else {
                toolbar = $this.data(‘settings‘).toolbar;
            }
            return toolbar;
        },
        /****
          *加载远程内容
          * options={  url:‘远程地址‘,
                      dataType:‘html/json‘ //数据类型,是html还是json
                      load:function(){.........} , //加载前处理事件
                      loaded:function(result){.........}  //加载后处理事件
                  }
          *****/
        remoteLoad: function (options) {
            return $(this).each(function () {
                var $this = $(this);
                if (typeof options == ‘undefined‘ || typeof options.url == ‘undefined‘ || options.url == ‘‘) {
                    alert("url参数是必须的!");
                } else {
                    var newOpt = $.extend({}, $this.data(‘settings‘).remoteRequest, options);
                    $this.data(‘settings‘).remoteRequest = newOpt;
                    remoteRequest($this);
                }
            });
        },
        /****
        *重新加载远程内容
        * options={   url:‘远程地址‘,
                    dataType:‘html/json‘ //数据类型,是html还是json
                    load:function(){.........} , //加载前处理事件
                    loaded:function(result){.........}  //加载后处理事件
                }
        *****/
        reload: function (options) {
            return $(this).each(function () {
                var $this = $(this);
                if (typeof options == ‘undefined‘ && $this.data(‘settings‘).remoteRequest == null) {
                    alert("找不到远程请求参数!");
                } else {
                    var newOpt = $.extend({}, $this.data(‘settings‘).remoteRequest, options);
                    $this.data(‘settings‘).remoteRequest = newOpt;
                    remoteRequest($this);
                }
            });
        },
        /****
        *设置内容
        *****/
        setContect: function (content) {
            return $(this).each(function () {
                var $this = $(this);
                $this.html(content);
            });
        }
    }
    $.fn.panel = function () {
        var method = arguments[0];
        if (methods[method]) {
            method = methods[method];
            arguments = Array.prototype.slice.call(arguments, 1);
        } else if (typeof (method) == ‘object‘ || !method) {
            if ($.myui.isDebug) {
                $.myui.log("jQuery.panel init.....");
            }
            method = methods.init;
        } else {
            $.error(‘Method ‘ + method + ‘ does not exist on jQuery.panel‘);
            return this;
        }
        return method.apply(this, arguments);
    };
    /***默认值*********************************************
        remoteRequest={  url:‘远程地址‘,
        *               dataType:‘html/json‘ //数据类型,是html还是json
        *               load:function(){.........} , //加载前处理事件
        *               loaded:function(result){.........}  //加载后处理事件
        *        }
    *******************************************************/
    $.fn.panel.defaults = {
        title: null,//标题
        iconCls: null,//图标cls,对应icon.css里的class
        toolbar: null,//工具栏对象
        toolbarPostion: ‘right‘,
        collapsePostion: ‘left‘,//收缩的方向,用于布局指定收缩图标,默认是往左边收缩
        width: ‘auto‘,
        height: ‘auto‘,
        expandable:true,//可展开
        maximizable: true,//可最大化
        closeable: true,//可关闭
        expanded:true,//是否展开
        collapseable: false,//是否收缩
        maximized: false,//是否最大化
        closed: false,//是否关闭
        remoteRequest: null,//远程加载页面的参数对象
        loadingMessage: ‘正在加载...‘,
        onLoad: function (self) {},//加载前
        onLoaded: function (self) { },//加载后
        onCollapse: function (self, flag) { },//收缩前 flag=0 收缩,1展开
        onCollapsed: function (self, flag) { },//收缩后 flag=0 收缩,1展开
        onClose: function (self) { },//关闭前
        onClosed: function () { },//关闭后
        onExpand: function (self, flag) { },//展开前 flag=0 收缩,1展开
        onExpanded: function (self, flag) { },//展开后 flag=0 收缩,1展开
        displayBorder: false, //是否显示外边框 用于面板被嵌套到layout时,去掉面板的外边框
        fillAuto:false  //自适应外部容器
    };
})(jQuery);

我的开源框架之面板控件,布布扣,bubuko.com

时间: 2024-11-20 19:02:22

我的开源框架之面板控件的相关文章

我的开源框架之Accordion控件

需求: (1)实现手风琴面板控件,支持静态HTML与JSON方式创建控件 (2)支持远程加载数据 (3)支持面板激活.远程加载事件注册 (4)支持动态添加.删除项目 实现图例 客户代码 <div> <div style="padding-left:100px; padding-bottom:12px; float:left"> <div id="accordionContainer" style="width:300px;he

我的开源框架之TAB控件

需求 (1)支持iframe.html.json格式的tab内容远程请求 (2)支持动态添加tab (3)支持远程加载完成监听,支持tab激活事件监听 (4)支持reload tab内容[如果是远程加载] (5)支持邮件菜单[未实现] 实现图例 客户代码 1 <body> 2 <div id="text"> 3 <h3>无题</h3> 4 <p>月落湖面两清影,</p> 5 <p>岸柳丝丝弄轻盈.<

我的开源框架之树控件

需求: 1.根据无限级的树形结构的json生成树菜单 2.树样式可以是图标类型和简单类型 3.可以自定义节点的图标 4.支持复选框 5.支持懒加载方式请求数据 6.支持节点点击事件 7.只有右键菜单[未实现] 8.支持拖拽调整节点[未实现] 实现图例 客户代码 1 <body> 2 <div id="Container" style="padding:10px; margin:0 auto;width:800px;height:300px;padding-t

我的开源框架之工具栏控件

http://www.cnblogs.com/zhaoguihua/p/redis-004.html Redis 的主从复制配置非常容易,但我们先来了解一下它的一些特性. redis 使用异步复制.从 redis 2.8 开始,slave 也会周期性的告诉 master 现在的数据量.可能只是个机制,用途应该不大. 一个 master 可以拥有多个 slave,废话,这也是业界的标配吧. slave 可以接收来自其他 slave 的连接.意思是不是就是说 slave 在接收其他的slave的连接

ExtJs4 笔记(9) Ext.Panel 面板控件、 Ext.window.Window 窗口控件、 Ext.container.Viewport 布局控件 (转 )出处:[Lipan] (http://www.cnblogs.com/lipan/)

本篇讲解三个容器类控件. 一.面板控件 Ext.Panel 一个面板控件包括几个部分,有标题栏.工具栏.正文.按钮区.标题栏位于最上面,工具栏可以在四个位置放置,围绕中间部分正文,按钮区位于最小方.下面介绍几个基本配置项: 1.title:设置面板标题文本. 2.tbar,lbar,rbar,bbar:分别设置上.左.右.下四个部位的工具栏. 3.html,items:前者用来设置正文部分的html,后者设置正文部分的ext控件. 4.buttons:设置按钮区的按钮. 下面看看面板生成代码:

几个不错的开源的.net界面控件 (转)

转自 http://www.donews.net/bluepenguin/articles/283714.aspx 几个不错的开源的.net界面控件 - zt 介绍几个自己觉得不错的几个开源的.net界面控件,不知道是否有人介绍过. DockPanel Suite:开发类似VS.net的界面,#Develop就是使用的这个控件. 网址:http://sourceforge.net/projects/dockpanelsuite/ ZedGraph:二维图表绘制控件,可以绘制大部分的Excel图表

spry可折叠式面板控件

关于可折叠面板构件 可折叠面板构件是一个面板,可将内容存储到紧凑的空间中.用户单击构件的选项卡即可隐藏或显示存储在可折叠面板中的内容.下例显示一个处于展开和折叠状态的可折叠面板构件: 可折叠面板构件的 HTML 中包含一个外部 div 标签,其中包含内容 div 标签和选项卡容器 div 标签.在可折叠面板构件的 HTML 中,在文档头中和可折叠面板的 HTML 标记之后还包括脚本标签. 有关可折叠面板构件工作方式的更全面的说明(包括可折叠面板构件代码的全面分析),请访问 www.adobe.c

zui框架配置日期控件只显示年月

zui框架配置日期控件datetimepicker只显示年月 <!DOCTYPE html> <head> <script src="~/Scripts/jquery-1.11.3.min.js"></script> <script src="~/res/zui-1.9.1-dist/dist/js/zui.min.js"></script> <script src="~/res

Android实战技巧之二十:两个开源的图表/报表控件

项目中要用饼图和折线图表示数据,重造轮子不是咱风格,先了解一下时下比较流行的开源图表控件吧.调查发现有三个口碑不错的开源项目,它们是MPAndroidChart.AChartEngine.HoloGraphLibrary.由于AChartEngine源码放在code.google上,遂先放弃它,主要研究其他两个在github上的项目. HoloGraphLibrary 项目地址:https://github.com/Androguide/HoloGraphLibrary 简介:这是一个十分简单的