easyui源码翻译1.32--Window(窗口)

前言

扩展自$.fn.panel.defaults。使用$.fn.window.defaults重写默认值对象。下载该插件翻译源码

窗口控件是一个浮动和可拖拽的面板可以用作应用程序窗口。默认情况下,窗口可以移动,调整大小和关闭。它的内容也可以被定义为静态html或要么通过ajax动态加载。

源码

/**
 * jQuery EasyUI 1.3.2
 * 
 *翻译:qq 1364386878
 */
(function ($) {
    //设置面板大小和布局
    function _resize(jq, _position) {
        var opts = $.data(jq, "window").options;
        if (_position) {
            if (_position.width) {
                opts.width = _position.width;
            }
            if (_position.height) {
                opts.height = _position.height;
            }
            if (_position.left != null) {
                opts.left = _position.left;
            }
            if (_position.top != null) {
                opts.top = _position.top;
            }
        }
        $(jq).panel("resize", opts);
    };
    //移动窗口到新位置
    function _move(jq, options) {
        var window = $.data(jq, "window");
        if (options) {
            if (options.left != null) {
                window.options.left = options.left;
            }
            if (options.top != null) {
                window.options.top = options.top;
            }
        }
        $(jq).panel("move", window.options);
        if (window.shadow) {
            window.shadow.css({
                left: window.options.left,
                top: window.options.top
            });
        }
    };
    //仅水平居中窗口
    function _hcenter(jq, IsMove) {
        var win = $.data(jq, "window");
        var opts = win.options;
        var width = opts.width;
        if (isNaN(width)) {
            width = win.window._outerWidth();
        }
        if (opts.inline) {
            var _f = win.window.parent();
            opts.left = (_f.width() - width) / 2 + _f.scrollLeft();
        } else {
            opts.left = ($(window)._outerWidth() - width) / 2 + $(document).scrollLeft();
        }
        if (IsMove) {
            _move(jq);
        }
    };
    //仅垂直居中窗口
    function _vcenter(jq, IsMove) {
        var win = $.data(jq, "window");
        var opts = win.options;
        var height = opts.height;
        if (isNaN(height)) {
            height = win.window._outerHeight();
        }
        if (opts.inline) {
            var parentwin = win.window.parent();
            opts.top = (parentwin.height() - height) / 2 + parentwin.scrollTop();
        } else {
            opts.top = ($(window)._outerHeight() - height) / 2 + $(document).scrollTop();
        }
        if (IsMove) {
            _move(jq);
        }
    };
    //初始化
    function init(jq) {
        var winD = $.data(jq, "window");
        //渲染panel
        var win = $(jq).panel($.extend({}, winD.options, {
            border: false,//定义是否显示面板边框
            doSize: true,//如果设置为true,在面板被创建的时候将重置大小和重新布局
            closed: true,//定义是否可以关闭窗口
            cls: "window",//定义是否可以关闭窗口
            headerCls: "window-header",//添加一个CSS类ID到面板头部
            bodyCls: "window-body " + (winD.options.noheader ? "window-body-noheader" : ""),
            //在面板销毁之前触发,返回false可以取消销毁操作
            onBeforeDestroy: function () {
                if (winD.options.onBeforeDestroy.call(jq) == false) {
                    return false;
                }
                if (winD.shadow) {
                    winD.shadow.remove();
                }
                if (winD.mask) {
                    winD.mask.remove();
                }
            },
            //在面板关闭之后触发
            onClose: function () {
                if (winD.shadow) {
                    winD.shadow.hide();
                }
                if (winD.mask) {
                    winD.mask.hide();
                }
                winD.options.onClose.call(jq);
            },
            //在打开面板之后触发
            onOpen: function () {
                if (winD.mask) {
                    winD.mask.css({ display: "block", zIndex: $.fn.window.defaults.zIndex++ });
                }
                if (winD.shadow) {
                    winD.shadow.css({
                        display: "block",
                        zIndex: $.fn.window.defaults.zIndex++,
                        left: winD.options.left,
                        top: winD.options.top,
                        width: winD.window._outerWidth(),
                        height: winD.window._outerHeight()
                    });
                }
                winD.window.css("z-index", $.fn.window.defaults.zIndex++);
                winD.options.onOpen.call(jq);
            },
            //在面板改变大小之后触发
            onResize: function (width, height) {
                var opts = $(this).panel("options");
                $.extend(winD.options, {
                    width: opts.width,
                    height: opts.height,
                    left: opts.left,
                    top: opts.top
                });
                if (winD.shadow) {
                    winD.shadow.css({
                        left: winD.options.left,
                        top: winD.options.top,
                        width: winD.window._outerWidth(),
                        height: winD.window._outerHeight()
                    });
                }
                winD.options.onResize.call(jq, width, height);
            },
            //在窗口最小化之后触发
            onMinimize: function () {
                if (winD.shadow) {
                    winD.shadow.hide();
                }
                if (winD.mask) {
                    winD.mask.hide();
                }
                winD.options.onMinimize.call(jq);
            },
            //在面板折叠之前触发,返回false可以终止折叠操作
            onBeforeCollapse: function () {
                if (winD.options.onBeforeCollapse.call(jq) == false) {
                    return false;
                }
                if (winD.shadow) {
                    winD.shadow.hide();
                }
            },
            //在面板展开之后触发
            onExpand: function () {
                if (winD.shadow) {
                    winD.shadow.show();
                }
                winD.options.onExpand.call(jq);
            }
        }));
        winD.window = win.panel("panel");
        if (winD.mask) {
            winD.mask.remove();
        }
        if (winD.options.modal == true) {
            winD.mask = $("<div class=\"window-mask\"></div>").insertAfter(winD.window);
            winD.mask.css({
                width: (winD.options.inline ? winD.mask.parent().width() : compatMode().width),
                height: (winD.options.inline ? winD.mask.parent().height() : compatMode().height),
                display: "none"
            });
        }
        if (winD.shadow) {
            winD.shadow.remove();
        }
        if (winD.options.shadow == true) {
            winD.shadow = $("<div class=\"window-shadow\"></div>").insertAfter(winD.window);
            winD.shadow.css({ display: "none" });
        }
        if (winD.options.left == null) {
            _hcenter(jq);
        }
        if (winD.options.top == null) {
            _vcenter(jq);
        }
        _move(jq);
        if (winD.options.closed == false) {
            win.window("open");
        }
    };
    //设置属性
    function setProperties(jq) {
        var win = $.data(jq, "window");
        //设置组件拖动
        win.window.draggable({
            handle: ">div.panel-header>div.panel-title",
            disabled: win.options.draggable == false,
            onStartDrag: function (e) {
                if (win.mask) {
                    win.mask.css("z-index", $.fn.window.defaults.zIndex++);
                }
                if (win.shadow) {
                    win.shadow.css("z-index", $.fn.window.defaults.zIndex++);
                }
                win.window.css("z-index", $.fn.window.defaults.zIndex++);
                if (!win.proxy) {
                    win.proxy = $("<div class=\"window-proxy\"></div>").insertAfter(win.window);
                }
                win.proxy.css({
                    display: "none",
                    zIndex: $.fn.window.defaults.zIndex++,
                    left: e.data.left,
                    top: e.data.top
                });
                win.proxy._outerWidth(win.window._outerWidth());
                win.proxy._outerHeight(win.window._outerHeight());
                setTimeout(function () {
                    if (win.proxy) {
                        win.proxy.show();
                    }
                }, 500);
            },
            onDrag: function (e) {
                win.proxy.css({
                    display: "block",
                    left: e.data.left,
                    top: e.data.top
                });
                return false;
            },
            onStopDrag: function (e) {
                win.options.left = e.data.left;
                win.options.top = e.data.top;
                $(jq).window("move");
                win.proxy.remove();
                win.proxy = null;
            }
        });
        //设置组件拉伸
        win.window.resizable({
            disabled: win.options.resizable == false, onStartResize: function (e) {
                win.pmask = $("<div class=\"window-proxy-mask\"></div>").insertAfter(win.window);
                win.pmask.css({
                    zIndex: $.fn.window.defaults.zIndex++,
                    left: e.data.left,
                    top: e.data.top,
                    width: win.window._outerWidth(),
                    height: win.window._outerHeight()
                });
                if (!win.proxy) {
                    win.proxy = $("<div class=\"window-proxy\"></div>").insertAfter(win.window);
                }
                win.proxy.css({
                    zIndex: $.fn.window.defaults.zIndex++,
                    left: e.data.left,
                    top: e.data.top
                });
                win.proxy._outerWidth(e.data.width);
                win.proxy._outerHeight(e.data.height);
            }, onResize: function (e) {
                win.proxy.css({ left: e.data.left, top: e.data.top });
                win.proxy._outerWidth(e.data.width);
                win.proxy._outerHeight(e.data.height);
                return false;
            }, onStopResize: function (e) {
                $.extend(win.options, {
                    left: e.data.left,
                    top: e.data.top,
                    width: e.data.width,
                    height: e.data.height
                });
                _resize(jq);
                win.pmask.remove();
                win.pmask = null;
                win.proxy.remove();
                win.proxy = null;
            }
        });
    };

    // 判断当前浏览器采用的渲染方式(兼容目前流行的全部浏览器)
    function compatMode() {
        //BackCompat:标准兼容模式关闭。
        //CSS1Compat:标准兼容模式开启。
        //当document.compatMode等于BackCompat时,浏览器客户区宽度是document.body.clientWidth;
        //当document.compatMode等于CSS1Compat时,浏览器客户区宽度是document.documentElement.clientWidth。
        //浏览器客户区高度、滚动条高度、滚动条的Left、滚动条的Top等等都是上面的情况。
        if (document.compatMode == "BackCompat") {
            return { width: Math.max(document.body.scrollWidth, document.body.clientWidth), height: Math.max(document.body.scrollHeight, document.body.clientHeight) };
        } else {
            return { width: Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth), height: Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight) };
        }
    };

    $(window).resize(function () {
        $("body>div.window-mask").css({
            width: $(window)._outerWidth(),
            height: $(window)._outerHeight()
        });
        setTimeout(function () {
            $("body>div.window-mask").css({
                // 判断当前浏览器采用的渲染方式
                width: compatMode().width,
                height: compatMode().height
            });
        }, 50);
    });

    //实例化组件
    $.fn.window = function (target, parm) {
        if (typeof target == "string") {
            var method = $.fn.window.methods[target];
            if (method) {
                return method(this, parm);
            } else {
                return this.panel(target, parm);
            }
        }
        target = target || {};
        return this.each(function () {
            var pwindow = $.data(this, "window");
            if (pwindow) {
                $.extend(pwindow.options, target);
            } else {
                pwindow = $.data(this, "window", {
                    options: $.extend({},
                        $.fn.window.defaults,
                        $.fn.window.parseOptions(this),
                        target)
                });
                if (!pwindow.options.inline) {
                    document.body.appendChild(this);
                }
            }
            init(this);
            setProperties(this);
        });
    };
    //默认方法
    $.fn.window.methods = {
        //返回属性对象
        options: function (jq) {
            var opts = jq.panel("options");
            var options = $.data(jq[0], "window").options;
            return $.extend(options, {
                closed: opts.closed,
                collapsed: opts.collapsed,
                minimized: opts.minimized,
                maximized: opts.maximized
            });
        },
        //返回外部窗口对象
        window: function (jq) {
            return $.data(jq[0], "window").window;
        },
        //返回属性对象
        resize: function (jq, parm) {
            return jq.each(function () {
                _resize(this, parm);
            });
        },
        //移动面板到一个新位置
        move: function (jq, _position) {
            return jq.each(function () {
                _move(this, _position);
            });
        },
        //仅水平居中窗口
        hcenter: function (jq) {
            return jq.each(function () {
                _hcenter(this, true);
            });
        },
        //仅垂直居中窗口
        vcenter: function (jq) {
            return jq.each(function () {
                _vcenter(this, true);
            });
        },
        //将窗口绝对居中
        center: function (jq) {
            return jq.each(function () {
                _hcenter(this);
                _vcenter(this);
                _move(this);
            });
        }
    };
    //解析器配置
    $.fn.window.parseOptions = function (target) {
        return $.extend({}, $.fn.panel.parseOptions(target),
            $.parser.parseOptions(target,
            [{
                draggable: "boolean",
                resizable: "boolean",
                shadow: "boolean",
                modal: "boolean",
                inline: "boolean"
            }]));
    };
    //默认属性和事件
    $.fn.window.defaults = $.extend({},
        $.fn.panel.defaults,
        {
            zIndex: 9000,//窗口Z轴坐标
            draggable: true,//定义是否能够拖拽窗口
            resizable: true,//定义是否能够改变窗口大小
            shadow: true,//如果设置为true,在窗体显示的时候显示阴影
            modal: false,//定义是否将窗体显示为模式化窗口
            inline: false,//定义如何布局窗口,如果设置为true,窗口将显示在它的父容器中,否则将显示在所有元素的上面
            title: "New Window",//窗口的标题文本
            collapsible: true,//定义是否显示可折叠按钮
            minimizable: true,//定义是否显示最小化按钮
            maximizable: true,//定义是否显示最大化按钮
            closable: true,//定义是否显示关闭按钮
            closed: false//定义是否可以关闭窗口
        });
})(jQuery);
View Code

 

示例代码

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Basic Window - jQuery EasyUI Demo</title>
    <link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="../../themes/icon.css">
    <link rel="stylesheet" type="text/css" href="../demo.css">
    <script type="text/javascript" src="../../jquery-1.8.0.min.js"></script>
    <script src="../../plugins2/jquery.parser.js"></script>
    <script src="../../plugins2/jquery.draggable.js"></script>
    <script src="../../plugins2/jquery.resizable.js"></script>
    <script src="../../plugins2/jquery.panel.js"></script>
    <script src="../../plugins2/jquery.window.js"></script>
  <!--  <script src="../../plugins/jquery.window.js"></script>-->
</head>
<body>
    <h2>Basic Window</h2>
    <div class="demo-info">
        <div class="demo-tip icon-tip"></div>
        <div>Window can be dragged freely on screen.</div>
    </div>
    <div style="margin:10px 0;">
        <a href="javascript:void(0)" class="easyui-linkbutton" onclick="$('#w').window('open')">Open</a>
        <a href="javascript:void(0)" class="easyui-linkbutton" onclick="$('#w').window('close')">Close</a>
    </div>
    <div id="w" class="easyui-window" title="Basic Window" data-options="iconCls:'icon-save'" style="width:500px;height:200px;padding:10px;">
        The window content.
    </div>
</body>
</html>
View Code

 

插件效果

posted @ 2014-01-04 14:53  Jimmy-Lee  阅读(2041)  评论(7编辑  收藏  举报