`
lzl836
  • 浏览: 13844 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

当年写的一个联动菜单

阅读更多

当年写的一个联动菜单。

var Class = {   
  create: function() {
    return function() {
      this.init.apply(this, arguments);   
    }   
  }   
}
var Menu=Class.create();
Menu.prototype={
    init:function(op){
        var me=this;
        this.interval=null;        
        this.code=[];
        this.text=[];
        this.colorRow=[];
        this.scrTop=[];
        this.msg=['','请选择部门','请选择系','请选择线'];
        for(var name in op){
            this[name]=op[name];
        }        
        for(i=0;i<=op.max;i++){
            this.scrTop[i]=0;
        }
        document.body.onclick=function(){me.onclr()};       
    },
    show:function(obj,op){    	
        var div=new createDIV(op.kbn);
        div.show();
        var self=this;        
        var me=this.me;
        var max=this.max;
        div.M.onmouseover=function(){
            var n=op.kbn+2;
	        while($("divMenu" + n).get()){
	            $("divMenu" + n).html("");
		        $("divMenu" + n).hide();
		        $("dvPr" + n).hide();
		        self.scrTop[n]=0;
		        n++;
	        }
        };
        div.M.oncontextmenu=function(){self.clr() };
        if(obj.nodeName=="INPUT"){
            $(div.M).html(this.loading());
            div.setSize();
        }
        
        this.pos(obj,div,op.kbn);
        
        var setData=function(rs){
            if(rs){
                rs=eval("(" + rs + ")");
            }else{
                return;
            }
            if(rs.length==0){
                $(div.M).html("<span style='color:silver'>(空白)</span>");                
                div.setSize();               
                return;
            }
            var strHtm=[];
            var intHight=function(){
                if(rs.length > 15){
                    return (15 + 1) * 20 + 1;
                }else{
                    return (rs.length + 1) * 20 + 1;
                }
            }
            strHtm.push("<div id='divList" + op.kbn + "' onmousewheel='" + me + ".wheel(event,this," + op.kbn + ")' style='float:left;overflow:hidden;height:" + intHight() + "px;width:this.offsetWidth px;'>");
            strHtm.push("<table id='tabList' style='font-size:15px' border='0' cellpadding='0' cellspacing='0'>");
            strHtm.push("<tr style='height:20px'>");
            strHtm.push("<td jsData='{cd:\"\",name:\"\",clr:true}' onmouseover='" + me +".over(this," + op.kbn + ")' onclick='" + me + ".write(this," + op.kbn + ")'>--------请选择--------</td>");
            strHtm.push("<td></td></tr>");
            for(i=0;i<rs.length;i++){
                strHtm.push("<tr style='height:20px'  > ");
                if (op.kbn == 1 || op.kbn==3){
                    strHtm.push("<td jsData='{cd:\""+ rs[i].c +"\",name:\""+ rs[i].m +"\"}' onmouseover='" + me + ".over(this," + op.kbn + ")' onclick='" + me + ".write(this," + op.kbn + ")'>"+ rs[i].m +"</td>");
                }else{                
                    strHtm.push("<td jsData='{cd:\""+ rs[i].c +"\",name:\"" + rs[i].r + "(" + rs[i].c +")\"}'  onmouseover='" + me + ".over(this," + op.kbn + ")' onclick='" + me + ".write(this," + op.kbn + ")'>" + rs[i].m + "(" + rs[i].c + ")</td>");
                }                    
                if(op.kbn == max){                   
                    strHtm.push("<td></td>");
                }else{
                    strHtm.push("<td style='font-size:10px'>►</td>");
                }
            }
            strHtm.push("</table></div>");
            if(rs.length > 15){
                strHtm.unshift("<tr><td style='font-size:10px; text-align:center ' onmouseover='" + me + ".startScroll(this,\"up\"," + op.kbn + ")' onmouseout='" + me + ".stopScroll(this)'>▲</td></tr><tr><td>");
                strHtm.unshift("<table border='0' cellpadding='0' cellspacing='0'>");
                strHtm.push("</td></tr><tr><td style='font-size:10px;text-align:center' onmouseover='" + me + ".startScroll(this,\"down\"," + op.kbn + ")' onmouseout='" + me + ".stopScroll(this)'>▼</td></tr></table>");
            }
            $(div.M).html(strHtm.join(""));
            self.pos(obj,div,op.kbn);
            div.setSize();
            
        }
        if(obj.nodeName=="INPUT" && op.kbn>0){
            if($(this.hid[op.kbn-1]).val()==""){
                $(div.M).html(this.msg[op.kbn]);
                div.setSize();
                return;
            }
        }
       
        op.cd=op.cd || (this.hid[op.kbn-1]? $(this.hid[op.kbn-1]).val() : "");
        new	ajax.request({
            type: "POST",
            data: "kbn=" + op.kbn + "&cd=" + op.cd,
            url: "../Common/MenuAction.ashx",
            success:setData
        });        
    },
    over:function(obj,n){
        $(obj).css({
            filter:"progid:DXImageTransform.Microsoft.Gradient(startColorStr='#002f5e', endColorStr='#3568CC', gradientType='0'",
            cursor:"pointer",
            color:"white"
        });
        
        if(this.colorRow[n] && this.colorRow[n]!=obj){
            $(this.colorRow[n]).css({filter:""});
            if(this.colorRow[n].nextSibling){
                $(this.colorRow[n].nextSibling).css({color:""}); 
            }
            $(this.colorRow[n]).css({color:""});           
        }
        var jsData=eval("(" + obj.getAttribute("jsData") + ")"); 
        this.colorRow[n]=obj;
        this.code[n]=jsData.cd;
        this.text[n]=jsData.name;
        $(obj.nextSibling).css({color:"blue"});
        if(jsData.clr){
            var j=n+1
            var id="divMenu" + j;
	        while($("divMenu" + j).get()){
		        $("divMenu" + j).hide();
		        $("dvPr" + j).hide();
		        this.scrTop[j]=0;
		        j++;
	        } 
        }
        else if(n<this.max && this.code){
            this.show(obj,{"kbn":n+1,"cd":this.code[n]});
        }
    },
    write:function(obj,n){
        for(i=0;i<=n;i++){
            if(typeof(this.text[i])!='undefined'){
                $(this.txt[i]).val(this.text[i]);
                $(this.hid[i]).val(this.code[i]);
            }
        }
        for(i=n+1;i<=this.max;i++){
            $(this.txt[i]).val("");
            $(this.hid[i]).val("");
        }
        this.clr();
    },
    clr:function(){
        for(i=0;i<=this.max;i++){
            if($("divMenu"+i).get()){
                $("divMenu"+i).html("");
                $("divMenu"+i).hide();
                $("dvPr"+i).hide();
                this.scrTop[i]=0;
            }
        }
        this.code=[];
        this.text=[];
    },
    pos:function(obj,div,n){
        var t,l;
        var pos=this.posXY(obj);
        if(obj.nodeName=="INPUT"){
            div.pos(pos.top+obj.offsetHeight,pos.left);            
        }else{
            if(parseInt(pos.top+div.M.offsetHeight-this.scrTop[n-1],10)>parseInt(getScreenHeight()-20,10)){               
                t=getScreenHeight()-div.M.offsetHeight-10+this.scrTop[n-1];
            }else{
                t=pos.top; 
            }
            if(parseInt(div.M.style.top, 10) <0){
                t = 0;
            }
            l=pos.left+obj.offsetWidth+10;
            div.pos(t-this.scrTop[n-1],l);
        }
    },
    posXY:function(obj){
        var intTop=obj.offsetTop;
        var intLeft=obj.offsetLeft;  
        try{
            while(obj.offsetParent){
                obj=obj.offsetParent
                intTop+=obj.offsetTop;
                intLeft+=obj.offsetLeft; 
            }
        }catch(e){} 
        return {"top":intTop,"left":intLeft};
    },
    startScroll:function(obj,flg,n){
        var func;
        var me=this;
        $(obj).css({cursor:"pointer",color:"blue"});
        div=$("divList" + n).get();        
        if(flg=="up"){
            func=function(){
                try{
                    div.scrollTop-=1;
                    me.scrTop[n]=div.scrollTop;
                }catch(e){}
            }
        }else{
            func=function(){
                try{
                    div.scrollTop+=1;
                    me.scrTop[n]=div.scrollTop;
                }catch(e){}
            }
        }
        this.interval=window.setInterval(func, 10);       
    },
    stopScroll:function(obj){
        $(obj).css({color:""});
        window.clearInterval(this.interval);
        this.interval=null;
    },
    wheel:function(e,obj,n){    
        if(e.wheelDelta>0){
            obj.scrollTop-=15;
        }else{
            obj.scrollTop+=15;
        }
        this.scrTop[n]=obj.scrollTop;
    },
    onclr:function(){ 
        //var me=this;
        var obj=window.event.srcElement;
        if(obj.nodeName!='INPUT' && this.kbn(obj)==null){
            this.clr();
        }
    },
    kbn:function(obj){
        while(obj.nodeName!="BODY"){
            for(i=0;i<=this.max;i++){
                if(obj.id=="divMenu"+i) return i;
            }       
            obj=obj.parentNode;
        }  
        return null;  
    },
    loading:function(){
        var strHtml=[];
        strHtml.push("<table style='width:100px;hight:120px;text-align:center'>");
        strHtml.push("<tr>");
        strHtml.push("<td><img src='../App_Themes/images/loading.gif'/>");
        strHtml.push("</td></tr><tr>");
        strHtml.push("<td style='font-size:13px'>正在读取数据...</td>");
        strHtml.push("</tr></table>");      
        return strHtml.join("");
    }
}
function getScreenHeight(){
    var objBody = (document.documentElement && document.documentElement.clientWidth)?document.documentElement:document.body;   
    return (objBody.offsetHeight + objBody.scrollTop);
}
function createDIV(n){
    var div,dvpr;
    var show=function(){
        $(this.M).show();
        $(this.P).show();
    }
    var pos=function(t,l){
        $(this.M).css({top:t,left:l});
        $(this.P).css({top:t,left:l});       
    }
    var SetSize=function(){  
        $(this.P).css({width:this.M.offsetWidth + "px",height:this.M.offsetHeight + "px"})
        $(this.P.childNodes[0]).css({height:this.M.offsetHeight + "px"});       
    }
    if($("divMenu" + n).get()){
        div=$("divMenu" + n).get();
        dvpr=$("dvPr" + n).get();
        return {M:div,P:dvpr,'show':show,'pos':pos,'setSize':SetSize};
    }
    div=document.createElement("DIV");
    div.id="divMenu" + n;
    div.className="menu";
    $(div).css({padding:'10px',position:"absolute",zIndex:100+n});
    $(div).hide();
    document.body.appendChild(div);
    dvpr=document.createElement("<div id='dvPr"+n+"' style='position:absolute; display:none;z-index:"+ (90+n) +"px;width:0px'></div>");
    $(dvpr).html("<iframe  frameborder=0 width='100%'  height='100%' id=ifr"+ n +" scrolling=no></iframe>");
    document.body.appendChild(dvpr);
    return {M:div,P:dvpr,'show':show,'pos':pos,'setSize':SetSize};    
}
function $(id){
    return {
        get:function(){
            return "string" == typeof id ? document.getElementById(id) : id;
        },
        hide:function(){
            this.css({display:"none"});
        },
        show:function(){
            this.css({display:""});
        },
        html:function(val){
            if(val==undefined){
                return this.get().innerHTML;
            }
            this.get().innerHTML=val;
        },
        val:function(val){
            if(val==undefined){
                return this.get().value;
            }
            this.get().value=val;
        },
        css:function(options){
            for ( var name in options ) {
			    this.get().style[ name ] = options[ name ];
		    }
        }
    }
}
 
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    JS写的三级联动菜单

    在这个场景中,我们讨论的是一个使用JS编写的三级联动菜单。这种菜单通常用于网站的地区选择,例如省、市、区的选择,为用户提供方便的导航体验。 三级联动菜单的工作原理是,当用户在第一级菜单(如省份)中选择一...

    联动菜单大全(含ajax,无限级联动菜单)

    联动菜单是两个或多个下拉框之间通过特定逻辑关联起来,当用户在一个下拉框中做出选择时,其他下拉框的内容会根据这个选择自动更新。这种动态更新的能力使得用户能够在不离开当前页面的情况下完成多级选择,减少了...

    四级联动菜单,联动菜单

    联动菜单,四级联动菜单,联动下拉菜单,简单易懂,可自定义任何区域或者行业

    JS城市联动菜单.rar

    城市联动菜单,顾名思义,是指当用户在一个下拉菜单中选择一个城市或省份时,另一个下拉菜单会自动更新为相应城市的下属区域。这种交互方式常见于电子商务网站、地图服务等需要精确地域定位的场景,提高了用户在选择...

    JS城市联动菜单JS城市联动菜单

    JS城市联动菜单JS城市联动菜单JS城市联动菜单JS城市联动菜单

    js四级联动菜单

    联动菜单是指一个菜单项的选择会影响后续菜单项的显示,这种机制常见于多级下拉菜单、表单选择器等场景。四级联动菜单即菜单分为四个层级,每一级的选择都会触发下一级菜单的更新,直至第四级。 **2. JavaScript在...

    联动菜单联动菜单 JavaScript

    联动菜单 JavaScript 联动菜单 JavaScript 联动菜单 JavaScript 联动菜单 JavaScript

    省市级联动菜单省市级联动菜单

    它是指当用户在前端选择一个省份时,对应的市一级的下拉菜单会自动更新,展示该省份内的所有城市;同样,选择城市后,区县的下拉菜单也会随之更新。这种联动效果是通过JavaScript(如jQuery)监听事件并异步请求后端...

    java联动菜单实例详解

    首先,联动菜单的基本原理是:当用户在一个菜单项上选择时,会触发另一个相关菜单的显示或隐藏。这种交互方式有助于减少用户界面的混乱,同时提供更直观的操作路径。 实现联动菜单的关键在于事件监听和数据结构的...

    三级联动菜单

    通常,需要一个嵌套的 JSON 对象来表示各级菜单的层级关系。例如: ```json { text: '一级菜单', children: [ { text: '二级菜单', children: [ { text: '三级菜单' } ] } ] } ``` 3. **El-Cascader ...

    一个和数据库关联的,二级联动菜单示例ajax实现

    这个"一个和数据库关联的,二级联动菜单示例ajax实现"是一个实用的代码示例,它展示了如何利用AJAX(异步JavaScript和XML)技术动态加载并更新二级菜单的内容,根据用户在一级菜单中的选择。 首先,我们来理解一下...

    ajax多级联动菜单

    6. **JavaScript函数**:在前端,编写JavaScript函数处理用户的选择事件,当用户选择一个菜单项时,触发Ajax请求,发送当前选中的菜单ID到服务器。服务器根据这个ID查询相关的子菜单数据,并返回。JavaScript函数...

    两级联动菜单两级联动菜单

    在IT行业中,尤其是在前端开发领域,"两级联动菜单"是一个常见的设计模式,它主要用于网站或应用的导航系统,提供简洁且高效的用户交互体验。两级联动菜单通常由一级菜单和二级菜单构成,用户点击一级菜单后,相应的...

    无限级联动菜单(AJAX源码)

    这个教程和源码将帮助你理解如何利用AJAX实现一个无限级联动菜单。 1. **AJAX基础** AJAX的核心是XMLHttpRequest对象,它可以异步地向服务器发送请求,获取响应数据。在JavaScript中,你可以通过创建...

    ASP+ACC二级联动菜单

    在本例中,它可能包含两个表:一个用于存储一级菜单,另一个用于存储二级菜单,两者之间通过某种关联实现联动。例如,一级菜单ID可能是二级菜单的外键,这样可以通过一级菜单的选择来筛选出对应的二级菜单项。 二级...

    ASP无限级联动菜单源码[80端口原创]

    在"ASP无限级联动菜单源码[80端口原创]"中,`MenuClass80.asp`可能是一个包含自定义菜单类的脚本文件。这个类可能封装了处理无限级菜单逻辑的方法,如读取数据库中的菜单结构,生成HTML代码,以及处理菜单的展开与...

    jsp+ajax 三级联动菜单

    【jsp+ajax 三级联动菜单】是一个典型的Web开发技术应用场景,它主要利用JavaServer Pages(JSP)和Asynchronous JavaScript and XML(AJAX)来实现动态网页中的数据交互和页面更新。在这个例子中,我们看到的是一个...

    android实现三级联动菜单

    在Android开发中,构建一个三级联动菜单是一项常见的需求,它能够为用户提供更加便捷的操作体验,尤其是在数据层级结构较深的应用中。本示例主要讲解如何使用Android原生组件和一些设计模式来实现这样的功能。 首先...

    asp无刷新二级联动菜单

    在二级联动菜单中,当用户在一级菜单中做出选择时,JavaScript会触发一个事件,该事件通过Ajax发送异步请求到服务器。 Ajax(Asynchronous JavaScript and XML)允许在不重新加载整个网页的情况下,与服务器交换...

Global site tag (gtag.js) - Google Analytics