使用jquery dialog

网页开发中,弹窗还是很有必要的。本人比较喜欢jquery ui的dialog。

但是jquery dialog中也有一些略显不方便的,如:没有z-index的参数设置,脚部的按钮样式没办法自定义……

我自己简单地写了个使用jquery dialog封装函数,有兴趣的朋友看看。

JavaScript(看起来有点多,但放到vs里,ctrl+m+o,还是比较清楚明了的):

$.ivanjs = $.ivanjs || {};
$.ivanjs.com = $.ivanjs.com || {};

$.ivanjs.com = {
    //other function

    //弹窗
    showWin: function (content, options) {
        var contentDiv = content;
        //检查传递过来的参数类型是否为Jquery对象
        if (!(content instanceof $)) {
            //如果是字符串,则构造一个Jquery对象
            if (typeof (content) == "string") {
                contentDiv = $("<div>" + content + "</div>");
            } else {
                alert("弹窗内容参数无效,必须为jquery元素对象或者字符串");
                return null;
            }
        }

        //默认设置
        var _options = {
            autoOpen: true,
            modal: true,
            zIndex: null,
            full: false,//是否全屏
            destroyEnable: true,
            afterOpen: function () {
                //打开之后的回调
            }
        };

        //避免为空对象
        options = options || {};
        //把按钮对象转换为jquery ui能识别的格式参数
        var customBtns = options.buttons || [];
        options.buttons = {};
        for (var i = 0; i < customBtns.length; i++) {
            var btnObj = customBtns[i];
            options.buttons[btnObj.text] = btnObj.handler || function () {};
        }

        //调用者的设置优先
        _options = $.extend({}, _options, options);

        //关闭后的回调
        var closeCallback = _options.close;
        var isCodeElement = $("body").find(contentDiv).length == 0;
        _options.close = function () {
            if (closeCallback) {
                closeCallback();
            }
            //如果是用代码构造的jquery元素,则销毁。避免下次构造时页面中反复存在
            if (_options.autoOpen && _options.destroyEnable && isCodeElement) {
                setTimeout(function () {
                    contentDiv.remove();
                }, 250);
            }
        };

        //初始化之后立即打开的
        if (_options.autoOpen && !contentDiv.length) {
            alert("弹窗内容要显示的jquery元素不存在,selector:" + contentDiv.selector);
            return null;
        }

        var dialogObj = contentDiv.dialog(_options);

        updateDialogStyle();

        if (_options.autoOpen && _options.afterOpen) {
            _options.afterOpen();
        }

        //如果是初始化之后,再手动打开的,则添加一个打开的“开关”,供外部使用
        dialogObj.open = function () {
            if (!dialogObj.length) {
                alert("弹窗内容要显示的jquery元素不存在,selector:" + dialogObj.selector);
            }

            dialogObj.dialog("open");

            updateDialogStyle();

            if (_options.afterOpen) {
                _options.afterOpen();
            }
        };

        return dialogObj;

        //应用自定义的样式,更新弹窗样式
        function updateDialogStyle() {
            var uiDialog = contentDiv.parent(".ui-dialog");

            //z-index
            if (_options.zIndex) {
                uiDialog.css({ "z-index": _options.zIndex });
            }

            //按钮样式
            if (customBtns.length) {
                for (var j = 0; j < customBtns.length; j++) {
                    var cbtn = customBtns[j];
                    var btnArr = uiDialog.find("button:contains(‘" + cbtn.text + "‘)");
                    var btn = btnArr;
                    if (btnArr.length > 1) {
                        for (var k = 0; k < btnArr.length; k++) {
                            btn = $(btnArr[k]);
                            var res = $(btn.children()).filter(function (index) {
                                return $(this).text() == cbtn.text;
                            });
                            if (res.length>0) {
                                break;
                            }
                        }
                    } 

                    //覆盖全部class样式
                    if (cbtn.className) {
                        btn.attr("class", cbtn.className);
                    }
                    //增加
                    if (cbtn.addClass) {
                        btn.addClass(cbtn.addClass);
                    }
                    //移除
                    if (cbtn.removeClass) {
                        btn.removeClass(cbtn.removeClass);
                    }
                    //内嵌样式
                    if (cbtn.style) {
                        for (var styleName in cbtn.style) {
                            btn.css(styleName, cbtn.style[styleName]);
                        }
                    }
                    //图标
                    if (cbtn.icon) {
                        btn.prepend($("<span>" + cbtn.icon + "</span>"));
                    }
                    //ko绑定
                    if (cbtn["data-bind"]) {
                        btn.attr("data-bind", cbtn["data-bind"]);
                    }

                }
                //只需更新一次,然后重置按钮参数变量,避免打开之后反复更新按钮样式
                customBtns = [];
            }

            //宽和高
            if (_options.full) {
                setFullScreen();

                $(window).resize(function () {
                    setFullScreen();
                }).resize();

                //全屏样式
                function setFullScreen() {
                    var uiAllWidth = $(window).width() - 20,
                        uiAllHeight = $(window).height() - 30;

                    uiDialog.css("width", uiAllWidth);
                    uiDialog.css("height", uiAllHeight);
                    uiDialog.css("left", "5px");
                    uiDialog.css("top", "5px");

                    var uiFooter = uiDialog.find(".ui-dialog-buttonpane"),
                        uiHeader = uiDialog.find(".ui-dialog-titlebar"),
                        uiFooterH = uiFooter.height(),
                        uiHeaderH = uiHeader.height();

                    console.log("高:全部" + uiAllHeight + ";头" + uiHeaderH + ";脚" + uiFooterH);

                    contentDiv.css("height", uiAllHeight - uiHeaderH - uiFooterH - 50);
                }
            }
            else {
                var uiWidth = parseInt(uiDialog.css("width")),
                    winWidth = $(window).width();

                if (winWidth <= uiWidth) {
                    uiDialog.css("width", winWidth - 10);
                } else if (_options.width) {
                    uiDialog.css("width", _options.width);
                }
            }
        }
    }
};

栗子-html:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>

</head>
    <body>

        <div>
            <input type="button" id="openFormDialog_body" value="打开子表单" />
        </div>

        <div id="dialogform" title="Create new user">
            <input type="text"  value=" " />
        </div>

    </body>
</html>

栗子-js:

//测试1:自动弹出
    $.ivanjs.com.showWin("yes");

    $.ivanjs.com.attachConsole();

    //测试2:手动弹窗
    var bodyDialog = $.ivanjs.com.showWin($("#dialogform"), {
        autoOpen: false,
        height: 300,
        width: 550,
        full: false,
        zIndex:999,
        modal: true,
        buttons: [
            { text: "确认", className: "yourClass", style: { color: "green" },icon:"<fa>123</fa>", "data-bind":"click:myClick", handler: function () { } },
            {text:"确认取消"}
        ],
        close: function () {

        }
    });

呃,如果要运行的话,当然要在示例的html里引入示例js……怎么引用JS,这个就不好说了吧……

另外,console.log,ie9及以下的浏览器不支持哦,以上代码里的console.log只是为了方便调试,可以注释掉的。

时间: 2024-12-29 13:04:44

使用jquery dialog的相关文章

jquery dialog 参数说明

var dialog = art.dialog({ title: '欢迎', content: '欢迎使用artDialog对话框组件!', icon: 'succeed', follow: document.getElementById('btn2'), ok: function(){ this.title('警告').content('请注意artDialog两秒后将关闭!').lock().time(2); return false; }, button: [ { name: '同意',

jquery dialog open后,服务器端控件失效的快速解决方法

jquery dialog为我们提供了非常漂亮实用的对话框,比单调的alert.confirm.prompt好用很多. 在使用jquery与.net共同开发时,直接调用jquery dialog的open后,服务器端控件全部失效了,不能执行相应的后台代码.只是源于jquery默认把dialog添加到body中,而不是原来所在的服务器端的form中了 解决方法: 1.可以调用dialog的open前,$("#dialog").parent().appendTo("form:fi

jquery dialog

jquery dialog 详解 博客分类: JQuery JavaScript 还是先看例子吧.另外如果要拖动.改变dialog的大小的话要加上ui.draggble.js和ui.resizable.js<!DOCTYPE html><html><head><link type="text/css" href="http://jqueryui.com/latest/themes/base/ui.all.css" rel=&

jQuery Dialog弹出层对话框插件

Dialog.js的相关注释已经添加,可以按照注释,进行相关样式的修改,适用于自定义的各个系统! dialog.js 1 /** 2 * jQuery的Dialog插件. 3 * 4 * @param object content 5 * @param object options 选项. 6 * @return 7 */ 8 function Dialog(content, options) 9 { 10 var defaults = { // 默认值. 11 title:'标题', // 标

jquery dialog的一些坑

jquery dialog工具可以方便的生成一个弹出框,但是在一些需要多个弹出框的应用场景上会有一些bug 具体场景: 当使用过一次模态框之后,使用另外的一个模态框时,已经消失不见的模态框会重新出来 错误排查之后发现:这是由于当第一次使用模态框关闭之后,jquery会在body最后新增一个div,display:none,不可见,下一次调用的时候直接取用,(主要作用是保存该模态框所在的位置参数) 但是当唤醒一个另外的模态框时,除新增一个模态框div外,会把已有的不可见div唤醒 通过定义模态框的

修改 Jquery Dialog 的位置

今天在做一个功能的时候使用到了Jquery UI中的dialog组件,应为是一个很简单的组件,有很多功能都没有提供,比如说直接获取到dialog的位置,直接修改dialog的位置都是不行的,并且但可拖动的位置看不见的时候,这个时候就是坑了,关闭不了,也拖动不了,这个时候只能刷新页面来重新初始化界面了. 我今天解决的就是这个问题:解决这种问题有两种方式(个人认为) 1.修改属性让可拖动局域可见,进行拖动 2.不让出现可拖动区域不可见的情况. 针对第一种情况,我没有想到合适的办法.下面给出第二种情况

jquery dialog属性的简单配置

记录是为了更好的成长! <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>jQuery UI Dialog - Default f

jquery dialog 打开的时候自动聚焦解决方法

方法一: p1_dialog_seniorSearch.dialog({ title:"高级查询", autoOpen:false,//默认关闭 modal: true,//开启遮罩层 width:570, height:330, buttons: { "查询":function(){ seniorSearch(1,20) } , "关闭": function() { p1_dialog_seniorSearch.dialog( "cl

JQUERY DIALOG窗格内不能使用FORM

今天在做AJAX DIALOG数据提交实验,实验目的是,在DIALOG内显示另一页面,并将FORM组件信息提交保存至数据库.代码如下: DIALOG实现: function OpenDialog(url,title,width,height,top,left) { var div = $("<div id='div_Info' title='"+title+"'></div>").appendTo($("BODY"));