blue-wz

  前一篇文章说了左侧菜单的搭建,参照http://www.cnblogs.com/blue-wz/articles/7400667.html,今天决定写一下右侧页面显示的功能;

  从前面的文章我们了解了数据库中每个菜单都有一个url字段,对应的是左侧菜单点击显示的页面。还记得在MenuTree里面,当我们点击的$(target)=="LEFTTREENODE"即子菜单时候,我们的处理是this.freshTag($(target));而this.freshTag方法主要是调用了myBar.freshTag($e.attr("id"),$e.html(),url)方法。myBar就是右侧显示页面的封装,稍后我们实现myBar的时候,会在它的内部生成MyTag。

  MyTag是点击菜单生成的标签,用来对应左侧菜单和操作MyBar页面,参照下图:

  下面我们主要写一下MyTag和myBar的实现过程:

function MyTag(id,name,url,bar){
    this.id = id;
    this.name = name;
    this.url = url;
    this.bar = bar;
    this.$tagDiv = null;
    this.$conDiv = null;
    this.init = function(){
        //创建要显示标签的元素和关闭标签的按钮
        this.$tagDiv = $("<myTag tagid=\'"+id+"\' class=\'curMyTag\'>"+name+"<tagCloseBtn>✖</tagCloseBtn></myTag>").appendTo(bar.$barDiv);
        //创建容纳页面数据的容器元素,并添加到bar的容器元素
        this.$conDiv = $("<myTagCon id=\'tagCon_"+id+"\' class=\'curMyTagCon\'></myTagCon>").appendTo(bar.$conDiv);
        //请求url,填充数据并显示
        this.showAndFillData();
        //每new一次MyTag(即每点击一次菜单),都会把bar.tagsLength+1,计算打开的标签数量,超过规定数量会提示
        bar.tagsLength = bar.tagsLength+1;
        //把当前MyTag对象放到bar的barTags对象里面,key就是当前的菜单id
        bar.barTags[id] = this;
    };
    this.init();
}
MyTag.prototype.showAndFillData = function(){
    this.fillData();
    this.show();
}
//向当前菜单的url发起请求,并将请求到的数据填入$conDiv内
MyTag.prototype.fillData = function(){
    MyCircle.show();
    var self = this;
    $.ajax({
      type:\'POST\',
      url:prefix+this.url,
      data:{},
      success:function(data){
          self.$conDiv.html(parseContent(data));
        MyCircle.hide();
      },
      error:function(data){
        MyCircle.hide();
          alert("页面加载异常\n可能是菜单地址配置错误\n请联系管理员");
      }
    });
}
//当前标签和当前页面都移除
MyTag.prototype.close = function(){
    this.$conDiv.remove();
    this.$tagDiv.remove();
}
//当前bar对象的curTag就是当前的标签对象
MyTag.prototype.show = function(){
    this.bar.curTag = this;
    //当前标签高亮,兄弟标签元素调灰
    this.$tagDiv.addClass("curMyTag").siblings(".curMyTag").removeClass("curMyTag");
    //当前页面容器元素显示,兄弟页面容器元素隐藏
    this.$conDiv.removeClass("hide").siblings(":not(.hide)").addClass("hide");
}

function MyBar(){
    this.$barDiv = $("#myBar");
    this.$conDiv = $("#myFrame");
    this.barTags = {};
    this.tagsLength = 0;
    this.curTag = null;
    this.prevTag = null;
    this.init();
}

MyBar.prototype.init = function(){
    var self = this;
    this.$barDiv.click(function(e){
        var target = e.target;
        var $target = $(e.target);
        //如果点击的是标签元素
        if(target.nodeName == "MYTAG"){
            //若果当前标签是选中标签,就不操作.
            if($target.hasClass("curMyTag")) return;
            //这里的$target.attr("tagid")就是菜单的id,这步的目的是使左侧菜单对应当前选中的标签。
            self.showTag($target.attr("tagid"));
            return;
        }
        //如果选中的是标签的关闭按钮,就关闭当前标签和页面
        if(target.nodeName == "TAGCLOSEBTN"){
            self.closeTag($target.parent().attr("tagid"));
        }
    });
}
MyBar.prototype.showTag = function(tagId){
    //高亮当前标签
    this.barTags[tagId].show();
    //高亮当前标签对应的菜单
    leftTree.changeCurNodeOuter(tagId.substring(tagId.indexOf("_")+1,tagId.length));
}
MyBar.prototype.closeTag = function(tagId){
    //关闭当前标签
    this.barTags[tagId].close();
    //显示下一页面
    this.showPrev(tagId);
}
//处理显示下一页面的方法
MyBar.prototype.showPrev = function(tagId){
    this.tagsLength = this.tagsLength -1;
    if(this.curTag.id != tagId){
        delete this.barTags[tagId];
        return;
    }
    var prev = "";
    for(var key in this.barTags){
        if(key!=tagId){
            prev = key;
            continue;
        }
        if(!prev){
            continue;
        }
        break;
    }
    delete this.barTags[tagId];
    prev && this.barTags[prev].show();
}

//点击左侧菜单,即执行此方法
MyBar.prototype.freshTag = function(id,name,url){
    //从barTags对象里面取出当前的MyTag对象
    var tag = this.barTags[id];
    //这里的意思是如果已经点击过当前菜单,右侧标签是存在的,再点击的话就执行showAndFillData,重新加载一次;不存在的话即new一个;
    if(tag){
//        tag.show();
        tag.showAndFillData();
        return;
    }
    //打开的标签超过10个会提示,并return,不在打开新的标签
    if(this.tagsLength>10){
        alert("标签页过多,请先关闭一部分标签页");
        return;
    }
    //每次点击左侧菜单,都会生成对应的myTag标签,最后一个参数是把当前的MyBar传给myTag标签
    new MyTag(id,name,url,this);    
}

  写到这里,我觉得有必要把jsp页面的所有代码展示一下。这个项目暂时分为三个jsp页面,header、index和footer。下面分别是三个jsp的代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE>
<html>
  <head>
    <title>个人平台</title>
    <link rel="stylesheet" type="text/css" href="<c:url value=\'/res/css/style.css\'/>" />
    <link rel="stylesheet" type="text/css" href="<c:url value=\'/res/css/jquery-ui.min.css\'/>" />
    <script type="text/javascript">
        var fromURI="${fromURI}";
        var prefix = "<c:url value=\'/\'/>";
        if(prefix.charAt(prefix.length-1)=="/") prefix = prefix.substring(0,prefix.length-1);
        var myBar = null;
        var leftTree = null;
    </script>
    <script type="text/javascript" src="<c:url value=\'/res/js/jquery.js\'/>"></script>
    <script type="text/javascript" src="<c:url value=\'/res/js/jquery-ui.min.js\'/>"></script>
    <script type="text/javascript" src="<c:url value=\'/res/js/defaut.js\'/>"></script>
    <script type="text/javascript" src="<c:url value=\'/res/js/Check.js\'/>"></script>
    <script type="text/javascript" src="<c:url value=\'/res/js/index.js\'/>"></script>
    <script type="text/javascript" src="<c:url value=\'/res/js/MyBar.js\'/>"></script>
    <script type="text/javascript" src="<c:url value=\'/res/js/MyTable.js\'/>"></script>
    <script type="text/javascript" src="<c:url value=\'/res/js/MyPager.js\'/>"></script>
    <script type="text/javascript" src="<c:url value=\'/res/js/MyUpload.js\'/>"></script>
    <script type="text/javascript">
        $(function(){
            myBar = new MyBar();
            leftTree = new MenuTree("leftTree","<c:url value=\'/menu/getMenuTree\'/>");
            var cur = new Date().getHours();
            $("#amOrPm").html(cur<8?"早上":(cur<12?"上午":(cur<18?"下午":"晚上")));
            //console.log(${sysUser.auths});
            $(".addUser").click(function(){
                var self = $(this);
                $.post("<c:url value=\'/sysUser/addUser\'/>",null,function(data){
                    if(data.msg) self.next().text(data.msg);
                },"json")
            })
        });
    </script>  
  </head>
  <body>
   <header>
        <platName>wz管理平台</platName>
        <!-- 从当前session中拿到登陆的用户 -->
        <div id="header_top">   
            <span id=\'amOrPm\'></span>好,
            ${sysUser.name} 
            <a class="logOutALink" href="<c:url value=\'/sys/logout\'/>">退出</a>
        </div>
        <!-- 右侧myBar和MyTag的容器 -->
        <myBar id="myBar"></myBar>
    </header>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:include page="header.jsp"></jsp:include>
<style>
    .wellcome{font-size:22px;color:#48a;text-align:center;border:5px solid #eee;margin-top:10px;height:150px;border-radius:10px;}
</style>
<div id="leftTree"></div>
<div id="myFrame">
    <div class="wellcome">
        <span>个人平台</span>
        <div>
            <button class="addUser">添加用户页面</button>
            <div></div>
        </div>
    </div>
</div>
<jsp:include page="footer.jsp"></jsp:include>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<footer id="footer">
    © 上海御付信息科技有限公司 版权所有
</footer>
<script type="text/javascript">
    var MyCircle = {
        $hidder:null,
        $shower:null,
        init:function(){
            MyCircle.$hidder = createElement("div","hidder sk-circle_hidder").css("display","none").appendTo($("body"));
            MyCircle.$shower = $("<div class=\'sk-circle_shower\'></div>").css("display","none").appendTo($("body"));
            var $circleDiv = createElement("div","sk-circle").appendTo(MyCircle.$shower);
            for(var i=1;i<13;i++){
                createElement("div","sk-child").addClass("sk-circle"+i).appendTo($circleDiv);
            }
            createElement("span","","亲,稍等......").appendTo(MyCircle.$shower);
        },
        showDiv:function(flag){
            MyCircle.$hidder.css("display",flag?"":"none");
            MyCircle.$shower.css("display",flag?"":"none");
        },
        show:function(){
            MyCircle.$shower.css("left",((document.body.offsetWidth/2)-60)+"px");
            MyCircle.$shower.css("top",((document.body.offsetHeight/2)-50)+"px");
            MyCircle.showDiv(true);
        },
        hide:function(){
            MyCircle.showDiv(false);
        }
    }
    MyCircle.init();
    var $body = $("body");
    var $myFrame = $("#myFrame");
    var $leftTree= $("#leftTree");
    var $window = $(window).resize(resize);
    var resizeCh = null;
    function resize(){
    }
    $(function(){
        //resize();
    });
</script>

  上面虽然是3个jsp,但是都是在一个body体里面,这里用到了jsp页面的jsp:include指令。heder.jsp里面一些defalut.js、MyTable.js、MyPager.js等对本项目没有影响,以后的文章会有提到。

  最后,看一下实现效果:

分类:

技术点:

相关文章: