JavaScript实现右键菜单(一)

来源:互联网 发布:淘宝店铺名片设计网站 编辑:程序博客网 时间:2024/05/01 13:44

效果:

javascript实现右键菜单的方式很多,思路也各有千秋,在介绍代码之前先简单介绍一下我的右键对象思路。

     1、   一个右键对象包含多个右键块。

  2、   任何一个页面控件都能且最多只能挂一个右键块。 

    3、  每个右键块存在独立的右键项体系。

  4、  每个右键块可以同时挂在不同的控件上。

根据以上规则,一个右键菜单模型包含:BSRightMenu(右键对象)BSRightItemArea(有件块对象)和BSRightItem右键项对象。下面具体介绍每个对象。

一、BSRightItem右键项对象

/**

  * <p>标题: BSRightItem</p>

  * <p>功能描述: 右键菜单项。</p>

  * <p>作者: BinaryStar</p>

  * <p>版本: 0.1</p>

 * <p>创建日期: 2005-12-21</p>

 */

function BSRightItem(pid, areaIndex, areaId,  pIndex, index, text, jsfun, img, disabled){

   this.pid = pid||"BSRightMenu_1";//BS右键菜单对象ID

   this.areaIndex = areaIndex;//右键块索引

   this.areaId = areaId||"";//BS右键菜单块ID

   this.pIndex = pIndex;//父菜单项索引

   this.level = 0;//树的深度

   this.index = index;//本菜单项索引

 

  this.id = this.areaId + "_item_" + this.index;//ID

 

 

  this.text = text || "BS菜单项";//菜单项文字

 

  this.jsfun = jsfun;//菜单项js函数

  this.img = img||"";//菜单项图片

 

  this.childList = new Array();//该菜单项包含的子菜单项

 

 

  this.isSperator = false;//是否是分隔符

 

 

  this.thisItemIndex = -1;//当前鼠标所在的子菜单项索引。

 

 

  this.disabled = disabled || false;//该菜单项是否可用

 

 

  this.childIsShow = false;//孩子菜单正在展现

 

 

  this.setDisabled = function (flag){

 

 

    if (flag){

 

 

      this.disabled = true;

 

    }

    else{

 

      this.disabled = false;

 

 

    }

 

  }

  //菜单项的展现

  this.show = function(){

    var htmlStr = "";

 

    htmlStr += "<tr id=/""+this.id+"_tr/" class=/"bs_rm_out/"";

 

    htmlStr += " onmouseover=/""+this.pid+".itemAreaList["+this.areaIndex+"].itemList["+this.index+"].doOnmouseover(this)/"";

 

    htmlStr += " onmouseout=/""+this.pid+".itemAreaList["+this.areaIndex+"].itemList["+this.index+"].doOnmouseout(this)/"";

 

 

    if (!this.isSperator && !this.disabled){

 

 

      htmlStr += " onmouseup=/""+this.pid+".itemAreaList["+this.areaIndex+"].itemList["+this.index+"].doOnmouseup(this)/"";

 

      htmlStr += " onmousedown=/""+this.pid+".itemAreaList["+this.areaIndex+"].itemList["+this.index+"].doOnmousedown(this)/"";

    }

    else{

 

      htmlStr += " onmouseup=/"window.event.cancelBubble=true;return false;/"";

 

 

      htmlStr += " onmousedown=/"window.event.cancelBubble=true;return false;/"";

 

 

    }

 

 

    htmlStr += " onclick=window.event.cancelBubble=true;return false;";

 

 

    htmlStr += ">";

 

    //图片

 

    if (!this.isSperator){

 

      htmlStr += "<td align=/"right/" style=/"width:22px;height:20px;";

 

 

      if (this.img.Trim() != ""){

 

 

        htmlStr += "background: url("+this.img+");";

 

 

        htmlStr += "background-repeat: no-repeat;";

 

        htmlStr += "background-attachment: no-fixed;";

 

        htmlStr += "background-position: center;/"";

 

 

      }

 

      htmlStr += " valign=/"middle/">&nbsp;</td>";

 

      //文字

 

 

      htmlStr += "<td><nobr";

 

 

      if (this.disabled){

 

        htmlStr += " style=/"color:Gray;/"";

      }

 

 

 

      htmlStr += ">&nbsp;"+this.text+"&nbsp;&nbsp;</nobr></td>";

 

 

 

      //存在孩子时显示箭头。

 

 

 

      htmlStr += "<td style='font-family: webdings;'>";

 

 

 

      if (this.childList.length > 0){

 

 

 

        htmlStr += "4";

 

 

 

      }

 

 

 

        htmlStr += "</td>";

 

 

 

    }

 

 

 

    else{

 

 

 

      //分隔符

 

 

 

      htmlStr += "<td colspan=/"3/" height=/"5/"><hr class=/"bs_rm_sperator/"/></td>";

 

 

 

    }

 

 

 

    htmlStr += "</tr>";

 

 

 

    return htmlStr;

 

 

 

  }

  //设置图片的背景色

 

 

 

  this.setImgSelect = function(elmObj, flag){

 

 

 

    if (this.img.Trim() != ""){

 

 

 

      if (flag){

 

 

 

        elmObj.cells[0].style.backgroundColor = "#8989bc";

 

 

 

      }

 

 

 

      else{

 

 

 

        elmObj.cells[0].style.backgroundColor = "";

 

 

 

      }

 

 

 

    }

 

 

 

  }

 

 

 

 

 

  //展现下一级菜单

 

 

 

  this.showChildren = function (elmObj){

 

 

 

    var pobj = eval(this.pid);

 

 

 

    pobj.hiddenAll(this.level+1);

 

 

 

 

 

    if (this.childList.length > 0 && !this.disabled){

 

 

 

      var htmlStr = "<table border='0' cellspacing='0'>";

 

 

 

      for (var i=0; i<this.childList.length; i++){

 

 

 

        htmlStr += pobj.itemAreaList[this.areaIndex].itemList[this.childList[i]].show();

 

 

 

      }

 

 

 

      htmlStr += "</table>";

 

 

 

      var thisDiv = document.getElementById(this.pid+"_rm_"+(this.level));

 

 

 

      var left = document.body.scrollLeft+thisDiv.offsetLeft+thisDiv.offsetWidth-4;

 

 

 

      var top = thisDiv.offsetTop+elmObj.offsetTop+1;

 

 

 

      var levelObj = null;

 

 

 

      levelObj = document.getElementById(this.pid+"_rm_"+(this.level+1));

 

 

 

      //level+1层没有创建

 

 

 

      if (levelObj == null){

 

 

 

        levelObj = document.createElement("div");

 

 

 

        levelObj.id = this.pid+"_rm_"+(this.level+1);

 

 

 

        levelObj.className = "bs_rm_div";

 

 

 

        document.body.appendChild(levelObj);

 

 

 

      }

 

 

 

      levelObj.innerHTML = htmlStr;

 

 

 

      levelObj.style.display = "block";

 

 

 

      //定位

 

 

 

      if((left+levelObj.offsetWidth) > document.body.scrollLeft+document.body.clientWidth){

 

 

 

        left -= (elmObj.offsetWidth + levelObj.offsetWidth-4);

 

 

 

      }

 

 

 

        window.status = ("top:"+top+ " thisDiv.offsetHeight:"+thisDiv.offsetHeight+" levelObj.offsetWidth:"+levelObj.offsetHeight+ " all:" + (top+levelObj.offsetHeight) +" max:"+(document.body.scrollLeft+document.body.clientHeight));

 

 

 

      if((top+levelObj.offsetHeight) > document.body.scrollTop+document.body.clientHeight){

 

 

 

        top -= (levelObj.offsetHeight-elmObj.offsetHeight);

 

 

 

      }

 

 

 

      levelObj.style.left = left;

 

 

 

      levelObj.style.top = top;

 

 

 

      this.childIsShow = true;

 

 

 

    }

 

 

 

  }

 

 

 

 

 

  //鼠标按下动作

 

 

 

  this.doOnmousedown = function(elmObj){

 

 

 

    window.event.cancelBubble=true;

 

 

 

    if (this.childList.length <= 0){

 

 

 

      elmObj.setCapture();

 

 

 

    }

 

 

 

    return false;

 

 

 

  }

 

 

 

  //鼠标弹起动作

 

 

 

  this.doOnmouseup = function(elmObj){

 

 

 

    window.event.cancelBubble=true;

 

 

 

    if (this.childList.length <= 0){

 

 

 

      var pobj = eval(this.pid);

 

 

 

      pobj.setRMIndex(this.areaIndex, this.index);

 

 

 

      elmObj.releaseCapture();

 

 

 

      pobj.hiddenAll(0);

 

 

 

      if (this.jsfun.Trim() != ""){

 

 

 

        eval(this.jsfun);

 

 

 

      }

 

 

 

    }

    return false;

 

  }

 

 

  //鼠标移入动作

 

 

  this.doOnmouseover = function(elmObj){

 

    window.event.cancelBubble=true;

 

    if (!this.isSperator){

 

      elmObj.className = "bs_rm_over";

 

      this.setImgSelect(elmObj, true);

 

 

    }

 

    //改变其他的项的高选 

    var pobj = eval(this.pid); 

    pobj.itemAreaList[this.areaIndex].setIndexItem(this.pIndex, this.index); 

    this.showChildren(elmObj);

    return false; 

  }

 

  //鼠标移出动作

 

 

  this.doOnmouseout = function(elmObj){ 

 

    window.event.cancelBubble=true; 

    if (!this.isSperator && !this.childIsShow

   elmObj.className = "bs_rm_out"; 

      this.setImgSelect(elmObj, false);  

     

    return false;  

   

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 洗衣服给白衣服染上色了怎么办 不小心喝了游泳池的水怎么办 铁水中硅的含量高了怎么办 视频拍摄单人变双人是怎么办的 四季青进来的货比淘宝还贵怎么办 淘宝还没收货价格买贵了怎么办 在微信上赌博庄跑了怎么办 微信赌博输了10000多怎么办 欠了信用卡说来来家里调查怎么办 没用过的超市购物卡丢了怎么办 体验服抢号成功手机号填错了怎么办 起亚kx3一键启动钥匙没电怎么办 逆战下载的时候显示文件损坏怎么办 移动公司买手机送话费套路怎么办 开通京东白条身份信息被占用怎么办 丰巢快递柜把东西寄丢了怎么办? 圆通快递把我寄的东西弄丢了怎么办 快递把我寄出去的东西弄丢了怎么办 京东被盗刷都是到付怎么办 订机票时护照号错了怎么办 请问网上不小心点了扣话费了怎么办 不小心被中国移动扣了话费怎么办 京东买东西已经付款了说无货怎么办 不小心提交了两次中信信用卡怎么办 淘宝买东西扣了银行卡两次钱怎么办 拼多多同一个订单支付了两次怎么办 京东手机号服务密码忘记了怎么办 京东买的东西转手给别人保修怎么办 改了无线网密码还是上不去网怎么办 买的京东e卡丢了怎么办 已认证未抵扣的发票发生退货怎么办 办的消费卡不给退怎么办 银行卡密码忘了手机号也换了怎么办 公务卡在当当购物的刷卡单怎么办 杭州市网签提示住宅均价异常怎么办 吃鸡账号没有绑定手机就买了怎么办 微信绑定的银行卡密码错误怎么办 淘宝单张券已领取达上限怎么办 去办公室给领导送礼总有人怎么办 招行信用卡临时额度到期后怎么办 中银e令不想用了怎么办