HTML笔记——机柜、服务器的拖拽放置(iframe层,drappable,droppable,)

!!用的是VS2010要在服务器上运行!!

!!直接打开静态HTML会报错:jquery.min.js:2 Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "null" from accessing a cross-origin frame.!!

全部代码文件:

链接:https://pan.baidu.com/s/1qmXqYOMJ9LV7z26R-sB61Q
提取码:5566

实现功能

1、动态增加机柜(ID、名称、长宽高);

  • 点击添加按钮调用add()方法:增加div,弹出layer弹窗(iframe层,输入机柜信息),调用a()拖拽放置服务器、b()删除服务器方法;
  • 点击layer弹窗save按钮,信息传入父页面。

2、拖拽、放置服务器(ID、名称、高、简介、所在机柜ID);

  • a()方法:拖拽左侧元素置于放置区(机柜)处:触发ondrop回调函数,判断该机柜的服务器及拖入服务器高度是否>机柜
    • 服务器>机柜
      • 放置区(机柜)状态置为“不可放置”;
      • 提示当前放置区(机柜)剩余高度。
    • 服务器<机柜判断服务器弹窗是否打开
      • 弹窗关闭(判断拖放的元素(服务器)的源)
        • 从别的放置区(机柜)拖入
          • 当前放置区(机柜)接收;
          • 更改元素(服务器)的所在放置区(机柜)ID。
        • 从左侧拖入
          • 给元素(服务器)添加css样式、属性id、双击事件;
          • 弹出layer弹窗(iframe层),输入并保存数据
            • success回调函数给子页面(iframe层)传入默认数值;
            • 子页面(iframe层)点击save之后给父页面传值;
            • end回调函数在子页面关闭后提示“保存成功”,并给标记传值。
      • 弹窗打开
        • 放置区(机柜)状态置为“不可放置”;
        • 提示“请先保存”。

3、删除机柜、服务器();

  • 删除机柜
    • layer弹窗提示确定、取消
      • 确定:remove选择框为“checked”状态的div。
  • b()方法删除服务器
    • 设置左侧为放置区,只接受class=“.assigned”的元素;
    • ondrop执行删除。

4、机柜、服务器的双击事件(获取页面信息传入子页面的input);

  • 获取页面信息;
  • 传入子页面(layer的iframe层);
  • 子页面save后更新父页面信息。

5、生成json数据。

  •  通过Json方式定义一个函数对象,创建新数组;
  • 循环获取机柜信息
    • 循环获取当前机柜下的服务器信息,存入数组
  • 存入数组(数组名.push(对象名));
  • 存入json(json对象['名称']=数组名);
  • 将JSON对象转成字符串(JSON.stringify())
  • 打印字符串(console.log())。

父页面

<body>
<div>
    <div class="left">
        <p hidden="hidden" id="port_name"></p>
        <!--机柜、服务器判断是否保存-->
        <input id="handle" name="handle" value="" hidden="hidden"/>
        <input id="gui" name="gui" value="" hidden="hidden"/>
        <input id="handle_sever" name="handle_sever" value="" hidden="hidden"/>
        <input id="sever" name="sever" value="" hidden="hidden"/>
        <!--增加、删除-->
        <a href="javascript:save();" title="保存为json"><img alt="" src="image/save.png" /></a>
        <a href="javascript:add();" title="增加机柜"><img alt="" src="image/add.png" /></a>
        <a href="javascript:del_gui();"><img alt="" src="image/delete.png" title="点击删除选中机柜,服务器拖到这里删除" onclick="del_gui()"/></a>
        <!--拖拽元素-->
        <div class="add_sever">
            <p>服务器</p>
            <p class="tips">(高度可自定)</p>
        </div>
        <div class="s">
            <div class="sever kong">间隔<p class="hid">1u</p><p class="hid">1</p></div>
        </div>
        <div class="s">
            <div class="sever1 sever" title="" >1u<p class="hid">1u</p><p class="hid">1</p></div>
        </div>
        <div class="s">
            <div class="sever2 sever" title="">2u<p class="hid">2u</p><p class="hid">2</p></div>
        </div>
        <div class="s">
            <div class="sever3 sever" title="">3u<p class="hid">3u</p><p class="hid">3</p></div>
        </div>
        <div class="s">
            <div class="sever12 sever" title="">12u<p class="hid">12u</p><p class="hid">12</p></div>
        </div>
        <div class="s">
            <div class="sever12 sever" title="">20u<p class="hid">20u</p><p class="hid">20</p></div>
        </div>
        <div class="s">
            <div class="sever12 sever" title="">30u<p class="hid">20u</p><p class="hid">30</p></div>
        </div>
        
    </div>
    <div class="right" id="right">
    </div>
</div>
</body>
父页面

父页面js

var i=1;
    var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
    
    //添加div(机柜)
    function add() { 
        var gui=$("#gui").val();
        if (gui == "") {
            var Odiv = document.createElement("div");
            Odiv.className = "drop";
            Odiv.id = "drop" + i;
            Odiv.innerHTML = "<input type='checkbox' name='ji_gui' />";//选择框
            //放置区
            var divD = document.createElement("div"); 
            divD.className = "drop_area";
            divD.id = "drop_area";
            //机柜名称
            var pD = document.createElement("p");
            pD.className = "drop_name";
            pD.id = "drop_name" + i;
            pD.title = "drop_name" + i;
            pD.innerText = i;

            var event = document.createAttribute("ondblclick");//创建双击事件
            event.nodeValue = "dbl_gui(this)";
            pD.attributes.setNamedItem(event);//名称添加双击事件
            
            Odiv.appendChild(pD);//在drop里添加drop_name
            Odiv.appendChild(divD);//在drop里添加drop_area
            document.getElementById("right").appendChild(Odiv);//在右边right内创建一个div(drop)
            
            //layer弹窗
            layer.open({
                type: 2, //iframe
                title: '机柜信息-' + i,
                shadeClose: true,
                shade: false,
                cancel: function () {
                    layer.msg("请先保存!", {
                        icon: 7,
                        time: 700
                    });
                    return false;
                },
                maxmin: true, //开启最大化最小化按钮
                area: ['300px', '260px'],
                content: 'HTMLPage2.htm',
                success: function (layero, index) {
                    $("#gui").attr("value", 1);
                    var id = i-1;
                    var body = layer.getChildFrame('body', index);
                    var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
                    //console.log(body.html());
                    body.find('input:eq(0)').val("机柜-" + id);
                    body.find('input:eq(1)').val("40");
                    body.find('input:eq(2)').val("60");
                    body.find('input:eq(3)').val("100");
                    body.find('input:eq(4)').val(id);
                },
                end: function () {
                    var handle = $("#handle").val();
                    if (handle == 1) {
                        layer.msg('保存成功', {
                            icon: 1,
                            time: 700 //2秒关闭(如果不配置,默认是3秒)
                        },
                            function () {
                                $("#handle").attr("value", "");
                                $("#gui").attr("value", "");
                            }
                        )
                    } //if END
                } //end END
            });//layer END
            i++;
            a();
            b();
            //alert(data_gui);
        }//if END
        else{
            layer.msg("请先保存!", {
                icon: 7,
                time:700
            });
        } 
    };
添加机柜
var aa=1;
    var a = function () {
        //拖拽
        $('.left .sever').draggable({
            revert: true,
            proxy: 'clone',
            deltaX: -40,
            deltaY: -10,
            onDrag: function (e) {
                $('.right div.drop_area').droppable("enable"); //重置放置区为可放置状态
                //$(this).click = dbclick;
            }
        });
        //放置
        $('.right div.drop_area').droppable({
            accept: '.sever', //只接受class为sever的元素
            onDragEnter: function (e, source) {
                $(this).addClass('over');
                $('.right div.drop_area').droppable("enable"); //重置放置区为可放置状态
            },
            onDragLeave: function (e, source) {
                $(this).removeClass('over');
                $('.right div.drop_area').droppable("enable"); //重置放置区为可放置状态
            },
            onDrop: function (e, source) {
                var parent_id = $(this).parent().attr("id"); //
                var r_parent_id = /drop(d+)/; //正则表达式

                var size = $(this).siblings("p").attr("title");
                var p_id = r_parent_id.exec(parent_id)[1];
                var r = /.*?(d+).*?(d+).*?(d+).*?/; //正则表达式
                var parent_height = r.exec(size)[1]; //正则匹配机柜高
                var attr = new Array(); //数组存放该机柜this的服务器div
                var r = /(?(d+)u?)?/; //正则表达式
                var source_html = $(source).find("p:eq(1)").html(); //拖动的服务器
                var source_height = r.exec(source_html)[1];
                var source_h = parseFloat(source_height); //转换为数值格式
                var i2 = $(this).unbind("each").find('div .h').each(function (i) {
                    var ii = $(this).html();
                    var height = r.exec(ii)[1];
                    attr[i] = height; //存入数组
                });
                var sum = eval(attr.join("+")) + source_h; //机柜服务器+拖动的服务器 的和
                if (sum > parent_height) {//判断和是否大于40u
                    layer.msg("当前机柜剩余高度:" + (parent_height - eval(attr.join("+"))) + "u", { time: 1000 });
                    $(this).droppable("disable"); //放置区不可放置
                } else {
                    var sever = $("#sever").val();
                    if (sever == "") {//判断layer弹窗是否打开
                        $(this).removeClass('over');
                        if ($(source).hasClass('assigned')) {
                            $(this).append(source);
                            $(source).find("p:eq(2)").html(p_id);
                            layer.close();
                        }
                        else {
                            var c = $(source).clone().addClass('assigned'); //克隆拖动元素的信息,并加class
                            if (c.hasClass('kong')) {
                                c.addClass('kong_drop');
                                c.html("<p hidden='hidden'>空格</p><p hidden='hidden' class='h'>1</p>");
                                $(this).append(c);
                                c.draggable({
                                    revert: true
                                });
                            } else {
                                c.attr('id', aa); //给元素加ID
                                c.attr('ondblclick', "dbl(this)"); //添加双击事件
                                $(this).append(c);
                                c.draggable({
                                    revert: true
                                });
                                //layer弹窗-新建服务器sever
                                layer.open({
                                    type: 2, //iframe
                                    title: '服务器信息-' + aa,
                                    shadeClose: true,
                                    shade: false,
                                    cancel: function (index) {
                                        layer.msg("确定不保存?", {
                                            icon: 7,
                                            time: 4000,
                                            btn: ['确定', '取消'],
                                            yes: function () {
                                                $("#sever").attr("value", "");
                                                c.remove();
                                                layer.close(layer.index); //关闭最新的弹窗(msg)
                                                layer.close(index);
                                            }
                                        });
                                        return false;

                                    },
                                    maxmin: true, //开启最大化最小化按钮
                                    area: ['400px', '380px'],
                                    content: 'sever.htm',
                                    success: function (layero, index) {

                                        var id = c.attr("id"); //该服务器ID
                                        $("#sever").attr("value", 1);
                                        var body = layer.getChildFrame('body', index);
                                        var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
                                        //console.log(body.html());
                                        var height = $("#" + id).find('p:eq(1)').text();
                                        body.find('input:eq(1)').val("服务器-" + id);
                                        body.find('input:eq(3)').val(height);
                                        body.find('input:eq(4)').val(p_id);
                                        body.find('input:eq(5)').val(id);
                                        body.find('input:eq(6)').val("0");
                                        body.find('p:eq(0)').text(parent_height);
                                        body.find('p:eq(1)').text(eval(attr.join("+")));

                                    },
                                    end: function () {
                                        var handle_sever = $("#handle_sever").val();
                                        if (handle_sever == 1) {
                                            layer.msg('保存成功', {
                                                icon: 1,
                                                time: 700 //1秒关闭(如果不配置,默认是3秒)
                                            },
                                            function () {
                                                $("#handle_sever").attr("value", "");
                                                $("#sever").attr("value", "");
                                            }
                                        )
                                        }; //if、else结束(判断拖拽元素的源)

                                    } //end 结束
                                }); //layer结束
                                aa++;
                                $("#" + aa).text();
                            };
                        }; //if、else结束(判断拖拽元素的源)
                    } else {
                        $('.right div.drop_area').droppable("disable"); //放置区不可放置
                        layer.msg("请先保存!", { icon: 7, time: 700 });
                    } //if、else结束(判断是否弹窗打开)
                } //if、else结束(判断机柜服务器的高的和)
            } //onDrop-结束
        }); //droppable-结束
    };                           //a拖拽放置服务器-结束
拖拽放置服务器
//删除服务器
    var b = function () {
        /**右  -->  左(移除)*/
        $('.right div').draggable({
            revert: true
        });
        $('.left').droppable({
            accept: '.assigned',
            onDragEnter: function (e, source) {
                $(source).addClass('trash');
            },
            onDragLeave: function (e, source) {
                $(source).removeClass('trash');
            },
            onDrop: function (e, source) {
                $(source).remove();
            }
        });
    };

    //删除机柜
    function del_gui() {
        var checked = $("input[name='ji_gui']:checked");
        if (checked.length == 0) {
            layer.msg('未选中机柜!', {
                time: 0,
                btn: ['确定'],
                yes: function (index) {
                    layer.close(index);
                    return false;
                }
            })
        } else {
            var name_list = new Array();
            checked.siblings('p').each(function () {
                var name = $(this).text();
                name_list.push(name);
            });
            layer.msg('确定删除以下机柜?</br> ' + name_list, {
                time: 0, //不自动关闭弹窗
                btn: ['确定', '取消'],
                yes: function (index) {
                    checked.parent().remove();
                    layer.close(index); //关闭弹窗
                },
                btn2: function () {
                    layer.close(index);
                }
            })
        }
    };
删除机柜、服务器
//机柜双击事件
    function dbl_gui(obj_gui) {
        var att = $(obj_gui).attr('id'); //获取当前ID
        var id = att.split("name")[1];
        var size = $(obj_gui).attr("title");
        var name = $(obj_gui).html();
        var r = /.*?(d+).*?(d+).*?(d+).*?/; //正则表达式
        var height = r.exec(size)[1]; //正则匹配高
        var weight = r.exec(size)[2]; //
        var depth = r.exec(size)[3]; //
        //alert(weight+depth);
        //layer2弹窗
        layer.open({
            type: 2, //iframe
            title: '机柜信息-' + id,
            shadeClose: true,
            shade: false,
            cancel: function () {
                $("#gui").attr("value", "");
                layer.close();
            },
            maxmin: true, //开启最大化最小化按钮
            area: ['300px', '260px'],
            content: 'ji_gui.htm',
            success: function (layero, index) {
                
                $("#gui").attr("value", 1);
                var body = layer.getChildFrame('body', index);
                var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
                //console.log(body.html());
                body.find('input:eq(0)').val(name); //名称
                body.find('input:eq(1)').val(height); //
                body.find('input:eq(2)').val(weight);//
                body.find('input:eq(3)').val(depth);//
                body.find('input:eq(4)').val(id);//ID
            },
            end: function () {
                var handle = $("#handle").val();
                if (handle == 1) {
                    layer.msg('保存成功', {
                        icon: 1,
                        time: 700 //1秒关闭(如果不配置,默认是3秒)
                        },
                        function () {
                            $("#handle").attr("value", "");
                            $("#gui").attr("value", "");
                        }
                     )
                } //end的if结束
            } //layer的end 结束
        }); //layer2结束            
    } //机柜双击事件结束

    //服务器双击事件
    function dbl(obj) {
        var id = $(obj).attr('id'); //获取当前ID
        var name = $(obj).find('p:eq(0)').html(); //名称
        var oheight = $(obj).find('p:eq(1)').html(); //获取高的字符串
        var r = /(?(d+)u?)?/; //正则表达式
        var height = r.exec(oheight)[1]; //正则匹配取出数字
        var intro = $(obj).attr('title'); //简介*/
        //机柜ID
        var parent_id = $(obj).parent().parent().attr("id") ;
        var r_parent_id = /drop(d+)/; //正则表达式
        var p_id = r_parent_id.exec(parent_id)[1];
        //机柜高
        var parent_height = $(obj).parent().siblings('p').attr("title");
        var r_parent_height= /.*?(d+).*?(d+).*?(d+).*?/; //正则表达式
        var p_height = r_parent_height.exec(parent_height)[1]; //正则匹配高
        //机柜服务器的高的和
        var attr = new Array();
        var i2 = $(obj).parent().unbind("each").find('div .h').each(function (i) {
            var ii = $(this).html();
            var height = r.exec(ii)[1];
            attr[i] = height; //存入数组
        });
        var h = parseFloat(height); //转换为数值格式
        var sever_sum = eval(attr.join("+")) - h;
        //类型
        var otype = $(obj).find('p:eq(3)').html(); 
        var r_type = /type:(.+)/;
        var type = r_type.exec(otype)[1];
        //端口
        var port = $(obj).find('p:eq(4)').html();
        var r_port = /port_num:(d+);port_name:(.+?)./;
        var port_num = r_port.exec(port)[1];
        var port_name = r_port.exec(port)[2];
        var n = port_name.split(",");
        //layer2弹窗
        layer.open({
            type: 2, //iframe
            title: '服务器信息-' + id,
            shadeClose: true,
            shade: false,
            cancel: function () {
                $("#sever").attr("value", "");
                layer.close();
            },
            maxmin: true, //开启最大化最小化按钮
            area: ['400px', '380px'],
            content: 'sever.htm',
            success: function (layero, index) {
                $("#sever").attr("value", 1);
                var body = layer.getChildFrame('body', index);
                var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();

                body.find('input:eq(1)').val(name); //名称
                body.find('input:eq(3)').val(height); //
                body.find('textarea:eq(0)').val(intro); //简介
                body.find('input:eq(6)').val(port_num);
                body.find('input:eq(4)').val(p_id); //放置区(机柜)ID
                body.find('input:eq(5)').val(id); //服务器severID
                body.find('p:eq(0)').text(p_height); //机柜高
                body.find('p:eq(1)').text(sever_sum);
                if (type == "机架式" || type == "存储" || type == "防火墙" || type == "路由器" || type == "交换机" || type == "刀片式" || type == "塔式") {
                    body.find('select').val(type);
                } else {
                    body.find('select').val("其他");
                    body.find('input:eq(2)').show();
                    body.find('input:eq(2)').val(type);
                } //服务器类型

                if (port_num > 0) {
                    iframeWin.port_submit();//调用子页面方法
                    for (var x = 0; x < n.length; x++) {
                        body.find('input:eq(' + (x + 7) + ')').val(n[x]);
                    }
                }
            },
            end: function () {
                var handle_sever = $("#handle_sever").val();
                if (handle_sever == 1) {
                    layer.msg('保存成功', {
                        icon: 1,
                        time: 1000 //1秒关闭(如果不配置,默认是3秒)
                    },
                        function () {
                            $("#handle_sever").attr("value", "");
                            $("#sever").attr("value", "");
                        }
                    )
                } //end的if结束
            } //layer的end 结束
        });                   //layer2结束            
        } //sever服务器双击事件结束
双击事件
function save() {
        var json = {};
        var list_gui = [];//存放机柜信息
        var sever_number = [];//存放服务器数量
        $(".drop_name").each(function () {
            var obj = {};
            var idd = $(this).attr("id");
            var r_id = /drop_name(d+)/;
            var id = r_id.exec(idd)[1];
            var name = $(this).html();
            var size = $(this).attr("title");
            var r_size = /.*?(d+).*?(d+).*?(d+).*?/; //正则表达式
            var height = r_size.exec(size)[1]; //正则匹配高
            var weight = r_size.exec(size)[2]; //
            var depth = r_size.exec(size)[3]; //
            var list_sever = []; //存放该机柜下的服务器信息

            $(this).siblings().children().each(function () {
                if ($(this).hasClass('kong_drop')) { 
                    return true;//跳过本次循环,不读取间隔
                }else{
                var obj_sever = {};
                var id = $(this).attr("id");
                var name = $(this).find('p:eq(0)').html(); //名称
                var oheight = $(this).find('p:eq(1)').html(); //获取高的字符串
                var r = /(?(.+?)u?)?/; //正则表达式
                var height = r.exec(oheight)[1]; //正则匹配取出数字
                var intro = $(this).attr('title'); //简介*/
                var parent_id = $(this).find('p:eq(2)').html(); //机柜ID

                var otype = $(this).find('p:eq(3)').html();
                var r_type = /type:(.+)/;
                var type = r_type.exec(otype)[1];//类型

                var port = $(this).find('p:eq(4)').html();
                var r_port = /port_num:(d+);port_name:(.+?)./;
                var port_num = r_port.exec(port)[1];//端口数量
                var port_name = r_port.exec(port)[2];//端口名称
                var n = port_name.split(",");

                obj_sever.id = id;
                obj_sever.name = name;
                obj_sever.height = height;
                obj_sever.introduce = intro;
                obj_sever.type = type;
                obj_sever.port_num = port_num;
                obj_sever.port_name = n;
                obj_sever.jigui_id = parent_id;
                list_sever.push(obj_sever);
                }
            })
            sever_number.push(list_sever.length);
            obj.id = id;
            obj.name = name;
            obj.height = height;
            obj.weight = weight;
            obj.depth = depth;
            obj.sever = list_sever;
            list_gui.push(obj);
        });

        json['jigui_number'] = list_gui.length;
        json['sever_number'] = eval(sever_number.join("+"));
        json['ji_gui'] = list_gui;
        var js = JSON.stringify(json, null, 2); //将JSON对象转成字符串
        console.log(js);
        
        //下载为json文件
        /*var Link = document.createElement('a');
        Link.download = "机柜信息.json";
        Link.style.display = 'none';
        // 字符内容转变成blob地址
        var blob = new Blob([js]);
        Link.href = URL.createObjectURL(blob);
        // 触发点击
        document.body.appendChild(Link);
        Link.click();
        // 然后移除
        document.body.removeChild(Link);*/
    }
保存为json

子页面(iframe层)

1、机柜

<head>
    <title></title>
    <link href="css/StyleSheet.css" type="text/css" rel="Stylesheet" />
    <script src="js/jquery.min.js"></script>
</head>
<body>
    <div class="layer_gui">
        <form method="post" id="form_gui" action="" runat="server">
            <div class="name_gui">
                <label>名称:</label><input name="name_gui" id="name_gui" type="text" required="true"/>
            </div>
            <div class="height_gui">
                <label>高度:</label>
                <input placeholder="单位:u" min="0" name="height_gui" id="height_gui" type="number" required="true"/>
            </div>
            <div class="weight_gui">
                <label>宽度:</label>
                <input placeholder="单位:cm" min="0" name="width_gui" id="width_gui" type="number" required="true"/>
            </div>
            <div class="depth_gui">
                <label>深度:</label>
                <input placeholder="单位:cm" min="0" name="depth_gui" id="depth_gui" type="number" required="true"/>
            </div>
            <div class="submit">
                <button id="btnsubmit" type="submit" value="提交">save</button>
            </div>
        </form>
        <input name="id" id="id" type="number" hidden="hidden" />
        <input name="index" id="index" type="number" hidden="hidden" />
    </div>

<script type="text/javascript">

    $(function () {
        $("button[type='submit']").click(function () {
            var h = 10;
            var w = 2.5;
            var index = parent.layer.getFrameIndex(window.name);
            var id = document.getElementById("id").value;
            var name = document.getElementById("name_gui").value;
            var height = document.getElementById("height_gui").value;
            var width = document.getElementById("width_gui").value;
            var depth = document.getElementById("depth_gui").value;
            if (name == "") {
                parent.layer.msg("请填写机柜!名称!", { time: 700 });
                return false;
            };

            //给父页面传值
            parent.$("#handle").attr("value", 1); //用以判断弹窗数据是否保存
            parent.$("#drop_name" + id).text(name);
            parent.$("#drop_name" + id).attr("title", '高:' + height + 'u;  宽:' + width + 'cm;  深:' + depth + 'cm');
            parent.document.getElementById("drop_area" + id).style.height = height * h + "px";
            parent.document.getElementById("drop_area" + id).style.width = width * w + "px";
            parent.document.getElementById("drop_name" + id).style.width = width * w-16 + "px";
            parent.layer.close(index);

            //  parent.location.reload(); // 父页面刷新  
        })
    })

    /*function cancelBack() {
        var index = parent.layer.getFrameIndex(window.name);
        parent.$("#handle").attr("value", 2);
        parent.layer.close(index);
    }*/
</script>
</body>
layer-iframe层

2、服务器

<head>
    <title></title>
    <link href="css/StyleSheet.css" type="text/css" rel="Stylesheet" />
    <link rel="stylesheet" type="text/css" href="css/icon.css"/>
    <link rel="Stylesheet" type="text/css" href="css/default/layer.css" />
    <script src="js/jquery.min.js"></script>
    <script src="js/jscolor.js"></script>
    <script src="js/layer.js"></script>

</head>
<body>
    <div class="layer_sever">
        <form method="post" id="form_sever" action="" runat="server">
            <div class="name_sever">
                <label>名称:</label>
                <input class="jscolor {onFineChange:'update(this)'}" value="9e9e9e" />
                <input name="name_sever" id="name_sever" type="text" required="true"/>
            </div>
            <div class="type_sever">
                <label>类型:</label>
                <input type="text" name="type_sever" id="type_else" />
                <select id="type_sever" onchange="select()">
                    <option value="机架式">机架式</option>
                    <option value="塔式">塔式</option>
                    <option value="刀片式">刀片式</option>
                    <option value="交换机">交换机</option>
                    <option value="路由器">路由器</option>
                    <option value="防火墙">防火墙</option>
                    <option value="存储">存储</option>
                    <option value="其他">其他</option>
                </select>
                
            </div>
            <div class="height_sever">
                <label>高度:</label>
                <input placeholder="单位:u" min="0" name="height_sever" id="height_sever" type="number" required="true"/>
            </div>
            <div class="weight_sever">
                <label>简介:</label>
                <textarea placeholder="请输入服务器简介" cols="30" rows="5" name="introduce_sever" id="introduce_sever" required="true"></textarea>
            </div>
            <!--放置区(机柜)ID(4)隐藏-->
            <input name="parent_id" id="parent_id" required="true" hidden="hidden" />
            <!--服务器severID(5)隐藏-->
            <input name="id" id="id" type="number" hidden="hidden" />
            <div class="port_sever" id="port_sever">
                <label>端口数量:</label>
                <a name="port_num" href="javascript:port_submit();" type="button" id="port_submit">输入端口信息</a>
                <input name="port_num" id="port_num" type="number" min="0" required="true" />
            </div>
            

            <div class="submit">
                <button id="sever_submit" type="submit" value="提交">save</button>
            </div>
        </form>
        <p hidden="hidden" id="jigui_height"></p><!--存储机柜高度-->
        <p hidden="hidden" id="jigui_sever_height"></p><!--存储机柜服务器总高度-->
    </div>
    
<script type="text/javascript">
    $("#name_sever").focus();
    var index = parent.layer.getFrameIndex(window.name);
    $(function () {
        $("button[type='submit']").click(function () {
            var h = 10;
            var id = document.getElementById("id").value;
            var name = document.getElementById("name_sever").value;
            var height = document.getElementById("height_sever").value;
            var introduce = document.getElementById("introduce_sever").value;
            var parent_id = document.getElementById("parent_id").value;
            var port_num = document.getElementById("port_num").value;

            var jigui_height = $("#jigui_height").text();
            var jigui_sever_height = $("#jigui_sever_height").text();
            var remain = jigui_height - jigui_sever_height;
            if (name == "") {
                parent.layer.msg("请填写服务器!名称!", { time: 700 });
                return false;
            }; //名称为空提示“填写名称”
            if (height > remain) {
                parent.layer.msg("机柜当前剩余高度 " + remain + " u!", { time: 2000 });
                return false;
            }; //填入的高度>机柜剩余高度
            parent.$("#handle_sever").attr("value", 1);
            parent.$("#" + id).html("<p>" + name + "</p><br/><p class='h'>" + "(" + height + "u)</p><p hidden='hidden'>" + parent_id + "</p>");
            parent.$("#" + id).attr("title", introduce);
            //下拉选择框
            var select = document.getElementById("type_sever");
            var selected = select.selectedIndex;
            var selected_val = select.options[selected].value;
            var p1 = document.createElement("p");
            p1.hidden = "hidden";
            if (selected_val == "其他") {
                var type = document.getElementById("type_else").value;
                p1.innerHTML = "type:" + type;
            } else {
                p1.innerHTML = "type:" + selected_val;
            }
            parent.document.getElementById(id).appendChild(p1);
            //循环获取端口名称
            var port_list = [];
            $(".add_port").each(function () {
                var port_name = $(this).find("input").val();
                port_list.push(port_name);
            });
            //端口名称放入父页面
            var p2 = document.createElement("p");
            p2.hidden = "hidden";
            if (port_list == "") {
                p2.innerHTML = "port_num:" + port_num + ";port_name:暂无端口.";
            } else {
                p2.innerHTML = "port_num:" + port_num + ";port_name:" + port_list + ".";
            }
            parent.document.getElementById(id).appendChild(p2);
            parent.document.getElementById(id).style.height = height * h-2 + "px"; //动态改变高度

            parent.layer.close(index);
        })
    })
    //颜色插件
    function update(jscolor) {
        var id = document.getElementById("id").value;
        parent.document.getElementById(id).style.backgroundColor = '#' + jscolor;
    }
    //下拉选择
    $("#type_else").hide();
    function select() {
        var select = document.getElementById("type_sever");
        var selected = select.selectedIndex;
        var selected_val = select.options[selected].value;
        if (selected_val == "其他") {
            $("#type_else").show();
        } else { $("#type_else").hide(); }
    }
    
    //输入端口信息
    function port_submit() {
        var num = document.getElementById("port_num").value;
        if (num <1) {
            parent.layer.msg("端口数量为0!", { time: 700 });
            return false;
        } //端口数量为0提示
        else {
            var port_num = $(".add_port").length;
            for (var n = 1; n <= num; n++) {
                var div = document.createElement("div");
                div.className = "add_port";
                var label = document.createElement("label");
                label.innerHTML = "端口" + (n+port_num) + "";
                var input = document.createElement("input");
                input.placeholder = "端口名称";
                input.id = "add_port" + n;
                var peizhi = document.createElement("div");
                peizhi.className = "peizhi_port";
                peizhi.innerText = "配置此端口信息";
                peizhi.id = n;
                var event = document.createAttribute("onclick");
                event.nodeValue = "peizhi_port(this)";
                peizhi.attributes.setNamedItem(event); 

                var del_port = document.createElement("div");
                del_port.className = "del_port";
                del_port.innerText = "删除";
                del_port.id = "del_port"+n;
                var event_del = document.createAttribute("onclick"); //创建双击事件
                event_del.nodeValue = "del_port(this)";
                del_port.attributes.setNamedItem(event_del); //名称添加双击事件

                div.appendChild(label);
                div.appendChild(input);
                div.appendChild(del_port);
                div.appendChild(peizhi);
                document.getElementById("port_sever").appendChild(div);
            }
            $("#port_submit").text("添加端口");
            $("#port_submit").on({
                mouseenter: function () {
                    layer.tips('添加(n)个端口,端口数量填写(n)', '#port_submit', {
                        tips: [1, '#504c4c'],
                        time: 0
                    })
                },
                mouseleave: function () {
                    layer.close(layer.index);
                }
            })
            var port_num = $(".add_port").length;
            $("#port_num").val(port_num);
            //点击除name=port_num之外的区域触发
            $('body').click(function (e) {
                if ($(e.target).attr('name') != 'port_num') {
                    $("#port_num").val(port_num);
                }
            });
        }
    }
    
    //配置端口信息
    function peizhi_port(port) {
        var name = $(port).siblings("input").val();
        var id = $(port).siblings("label").text();
        parent.layer.open({
            type: 2, //iframe
            title: '端口信息-' + id,
            shadeClose: true,
            shade: false,
            maxmin: true, //开启最大化最小化按钮
            area: ['380px', '310px'],
            content: 'port.htm',
            success: function (layero, index) {
                var body = parent.layer.getChildFrame('body', index);
                var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
                body.find('input:eq(0)').val(name); //名称
            },
            end: function () {
                var name_update = parent.$("#port_name").text();
                $(port).siblings("input").val(name_update);
            }
        });
    }
    //删除服务器端口
    function del_port(port) {
        var name = $(port).siblings("input").val();
        var id = $(port).siblings("label").text();
        parent.layer.msg('确定删除端口-' + name + '-?', {
            time: 0, //不自动关闭弹窗
            btn: ['确定', '取消'],
            yes: function (index) {
                $(port).parent().remove();
                var port_num = $(".add_port").length;
                $("#port_num").val(port_num);
                var n = 1;
                $(".add_port label").each(function () {
                    $(this).text("端口" + n + "");
                    n++;
                });
                parent.layer.close(index); //关闭弹窗
            },
            btn2: function () {
                layer.close(index);
            }
        })
    }
</script>

</body>
layer-iframe层

3、端口

<head>
    <title></title>
    <link href="css/StyleSheet.css" type="text/css" rel="Stylesheet" />
    <script src="js/jquery.min.js"></script>
</head>
<body>
<div class="layer_port">
    <form method="post" id="form_port" action="" runat="server">
        <div class="name_port">
            <label>名称:</label>
            <input placeholder="请输入端口名称" name="name_port" id="name_port" type="text" required="true"/>
        </div>
        <div class="ip_port">
            <label>IP:</label>
            <input class="ip" name="ip_port" id="ip1_port" type="text" required="true"/>.
            <input class="ip" name="ip_port" id="ip2_port" type="text" required="true"/>.
            <input class="ip" name="ip_port" id="ip3_port" type="text" required="true"/>.
            <input class="ip" name="ip_port" id="ip4_port" type="text" required="true"/>
        </div>
        <div class="device_port">
            <label>对端设备:</label>
            <input placeholder="请输入对端设备" name="device_port" id="device_port" type="text" required="true"/>
        </div>
        <div class="introduce_port">
            <label>简介:</label>
            <textarea placeholder="请输入端口简介" cols="30" rows="5" name="introduce_port" id="introduce_port" required="true"></textarea>
        </div>
        <div class="submit">
            <button id="btnsubmit" type="submit" value="提交">save</button>
        </div>
    </form>
</div>
<script>
    var goal = ".ip";
    var ip_max = 255;

    // 监听键盘输入事件
    $(goal).bind("keydown", function (event) {
        //console.log($(this).attr("id"))
        var code = event.keyCode;
        // 只能输入数字键、删除键、小数点,tab键,其他的都不能输入
        if ((code < 48 && 8 != code && 37 != code && 39 != code && 9 != code && 13 != code) || (code > 57 && code < 96) || (code > 105 && 110 != code && 190 != code)) {
            return false;
        }
        // 如果输入了点 (.),则直接跳转到下一个输入框
        if (code == 110 || code == 190 || code == 13) {
            $(this).next().focus();
            return false;
        }
    })
    // 监听键盘离开事件
    $(goal).bind("keyup", function(event){
    // 判断当前输入框的值
        var value = $(this).val();
    // 如果输入的值大于ip最大值,则去掉最后一位数字
        if(value != null && value != '' && parseInt(value) > ip_max) {
            value = value.substring(0, value.length-1);
            $(this).val(value);
            return false;
        }
    // 如果输入框的值大于100,并且符合规则,则跳转到下一个输入框
        if(value != null && value != '' && parseInt(value) > 100 && parseInt(value) <= ip_max) {
            $(this).next().focus();
            return false;
        }
    // 判断是否是0开头的不规范数字
        if(value != null && value != '' && parseInt(value) != 0) {
        // 如果当前输入的是0开头,则把0去掉,方法是直接转数字即可
            value = parseInt(value);
            if(isNaN(value)){
                $(this).val("");
            }else {
                $(this).val(""+value);
            }
        }
    })
    // IP失去焦点事件
    $(goal).bind("blur", function(){
        var value = $(this).val();
    // 如果失去焦点,当前的值为空,则加上红色边框,否则去掉红色边框
        if(value == null || value == '' || value == undefined) {
            $(this).css("border-color", "#F08080");
        }else {
            $(this).css("border-color", "");
        }
    })
    // 名称/对端设备—失去焦点事件
    $('input[name!=ip_port]').blur(function () {
        var val = $(this).val();
        if (val == "") {
            $(this).css("border-color", "#F08080");
        }
    })
    $("#name_port").focus();
    $("button[type='submit']").click(function () {
        var index = parent.layer.getFrameIndex(window.name);
        var name = document.getElementById("name_port").value;
        /*var device = document.getElementById("device_port").value;
        var ip1 = document.getElementById("ip1_port").value;
        var ip2 = document.getElementById("ip2_port").value;
        var ip3 = document.getElementById("ip3_port").value;
        var ip4 = document.getElementById("ip4_port").value;
        var ip = ip1 + "." + ip2 + "." + ip3 + "." + ip4;
        var introduce = document.getElementById("introduce_port").value;*/
        if (name == "") {
            parent.layer.msg("请填写端口!名称!", { time: 700 });
            return false;
        }; //名称为空提示“填写名称”
        parent.$("#port_name").text(name);
        parent.layer.close(index);
    })
</script>
</body>
layer-iframe层

CSS

body 
{
    margin:20px;
}
.left
{
    width:20%;
    height:auto;
    float:left;
    text-align:center;
    position:fixed;}
.right
{
    width:80%;
    height:auto;
    float:right;
    z-index:-1;}
.s
{
    margin:5px 0;}


/**移动选择(onDragEnter)背景色**/
.over
{
    background-color:#aac5e7;
    z-index:-1;}
/**放置后(onDrop)的样式**/
.assigned{
    border:1px solid #efefef !important;
}
/*间隔块*/
.kong
{
    height:17px;
    border:1px solid #1d1c1c;
    background-color:#1d1c1c !important;}
.kong_drop
{
    width:100% !important;
    margin:0;
    border:none !important;
    height:10px !important;}
/**放置区(机柜)**/
.drop_area{
    /*150px;*/
    border: 5px solid #bbb;
    border-style: inset;
    position:absolute !important;
    bottom:0px;
    z-index:1;
}
.drop_name
{
    text-align:center;
    float: right;
    width: 130px;
    margin-top: 0;
    }
.drop
{
    width:auto;
    margin-left:20px;
    margin-bottom:15px;
    float:left;
    height:520px;
    position:relative !important;
    left: 0 !important;
    top: 0px !important;
    z-index:0;}
/**拖动元素(服务器)**/

.add_sever
{
    margin:10px 0;}
.add_sever p
{
    margin:3px 0;}
.tips
{
    font-size:small;
    text-align:center;
    color: #9c2828;}
.sever
{
    text-align:center;
    width:140px;
    margin:auto;
    color: white;
    background-color: #9e9e9e;
    display: flex;
    justify-content:center;
    align-items:Center;
    z-index:999999;}
.sever1
{
    height:8px;
    border:1px solid black;
    }
.sever2
{
    height:18px;
    border:1px solid black;
    }
.sever3
{
    height:28px;
    border:1px solid black;
    }
.sever12
{
    height:118px;
    border:1px solid black;
    }

.sever .hid
{
    display:none;}
/********************弹出表单layer**************/
/*****机柜*****/
.layer_gui
{
    width:90%;
    margin:auto;
    margin-top: 20px;}
.layer_gui div
{
    margin:10px 0;
    height:25px;}
.layer_gui label
{
    
    width:30%}
.layer_gui input
{
    border-radius: 5px;
    height: 20px;
    border: 1px solid #827b7b;
    float:right;
    width:69.9%;}
.submit
{
    text-align:center;}
.submit button
{
    width: 30%;
    height: 29px;
    margin-top: 7px;
    background-color: #b5b3b3;
    float: none;
    border-radius: 10px;}
.submit button:hover
{
    background-color:Gray;
    color:White;}

/*******服务器*******/
#form_sever div
{
    float:left;
    width:100%;}
.layer_sever
{
    width:90%;
    margin:auto;
    margin-top: 20px;
    }
.name_sever,.height_sever
{
    margin:10px 0;
    height:25px;}
.layer_sever label
{
    width:30%}
.layer_sever input
{
    border-radius: 5px;
    height: 20px;
    border: 1px solid #827b7b;
    float:right;
    width:69.9%;}
.layer_sever input.jscolor
{
    width:17%;
    text-align: center;}
.layer_sever #name_sever
{
    width:51.9%;}
.layer_sever textarea
{
    border-radius: 5px;
    width:69%;
    border: 1px solid #827b7b;
    float:right;
    margin-bottom:10px;}
/**下拉选择框**/
.layer_sever select
{
    border-radius:5px;
    height: 23px;
    border: 1px solid #827b7b;
    width:22%;
    margin-left: 40px;}
.layer_sever .type_sever input
{
    width:46.9%;}
/**端口**/
.layer_sever .port_sever #port_num
{
    width:23%;}
.layer_sever .port_sever a
{
    text-decoration:none;
    border:1px solid #827b7b;
    border-radius:5px;
    width: 45%;
    float: right;
    margin-left: 1.9%;
    background-color: #afacac;
    color: #151414;
    text-align: center;}
.add_port
{
    margin:5px 0;
    }
.add_port label
{
    font-size:small;
    margin-left: 10%;
    margin-right: 4.5%;}
.add_port input
{
    width:23%;
    float:none}
.add_port .peizhi_port
{
    width: 30% !important;
    float: right !important;
    font-size: small;
    text-align: center;
    line-height: 22px;
    margin-right: 3%;}
.add_port .del_port
{
    font-size: small;
    float: right !important;
    width: 9% !important;
    text-align: center;
    line-height: 20px;
    background-color: #79786f;
    border-radius: 5px;
    color: white;}
/******port端口******/
#form_port div
{
    float:left;
    width:100%;
    margin:5px 0;}
.layer_port
{
    width:90%;
    margin:auto;
    margin-top: 20px;
    }
.name_port,.height_port
{
    
    height:25px;}
.layer_port label
{
    width:30%}
.layer_port input
{
    border-radius: 5px;
    height: 20px;
    border: 1px solid #827b7b;
    float:right;
    width:69.9%;}
.layer_port .ip_port label
{
    margin-right:19%;}
.layer_port .ip_port input
{
    display:inline;
    float:none;
    width:15.6%;
    text-align:center;
    margin-left: -4px;}
.layer_port textarea
{
    border-radius: 5px;
    width:69%;
    border: 1px solid #827b7b;
    float:right;
    margin-bottom:10px;}
.layer_port .submit button
{
    margin-top: -5px;}
View Code

 效果图

 双击服务器

 

修改端口数量、信息

双击机柜

删除机柜

 

新增机柜

 

拖拽服务器

 

 

 输入端口信息

原文地址:https://www.cnblogs.com/888abc/p/9956386.html