javascript 右键菜单 (续)

转载 2007年09月19日 16:03:00

BSRightItem

/**
 * <p>标题: BSRightItem</p>
 * <p>功能描述: 右键菜单项。</p>
 * <p>作者: BinaryStar原创B/S框架</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.key = "";//右键菜单项的key;
  this.body = null;//该菜单项的对象;
  this.isError = false;//该节点点击出错


  
this.setDisabled = function (flag){
    
if (flag){
      
this.disabled = true;
    }

    
else{
      
this.disabled = false;
    }

  }


  
//添加子菜单项
  this.addItem = function (text, jsfun, img, disabled){
   
var rmObj = eval(this.pid);
 
return rmObj.itemAreaList[this.areaIndex].addItem(this.index, text, jsfun, img, disabled);
  }


  
//菜单项的展现
  this.show = function(){
   
var rmObj = eval(this.pid);
    
var htmlStr = "";
   
var pName = rmObj.getRMName(this.level);
    htmlStr 
+= "<tr id=""+this.id+"_tr" style=""+bs_rm_out+""";
    htmlStr 
+= " onmouseover=""+pName+".itemAreaList["+this.areaIndex+"].itemList["+this.index+"].doOnmouseover(event, this)"";
    htmlStr 
+= " onmouseout=""+pName+".itemAreaList["+this.areaIndex+"].itemList["+this.index+"].doOnmouseout(event, this)"";
    
if (!this.isSperator && !this.disabled){
      htmlStr 
+= " onmouseup=""+pName+".itemAreaList["+this.areaIndex+"].itemList["+this.index+"].doOnmouseup(event, this)"";
      htmlStr 
+= " onmousedown=""+pName+".itemAreaList["+this.areaIndex+"].itemList["+this.index+"].doOnmousedown(event, this)"";
    }

    
else{
      htmlStr 
+= " onmouseup="event.cancelBubble=true;return false;"";
      htmlStr 
+= " onmousedown="event.cancelBubble=true;return false;"";
    }

    htmlStr 
+= " onclick=window.event.cancelBubble=true;return false;";
    htmlStr 
+= ">";
    
//图片
    if (!this.isSperator){
      htmlStr 
+= "<td align="right" ";
      
if (this.img.Trim() != ""){
        htmlStr 
+= "style="width:22px;height:22px;";
        htmlStr 
+= "background: url("+rmObj.imagePath+this.img+");";
        htmlStr 
+= "background-repeat: no-repeat;";
        htmlStr 
+= "background-attachment: no-fixed;";
        htmlStr 
+= "background-position: right;"";
        htmlStr 
+= " valign="middle">&nbsp;&nbsp;&nbsp;</td>";
      }

      
else{
        htmlStr 
+= "style="width:2px;height:22px;";
        htmlStr 
+= " valign="middle">&nbsp;</td>";
      }

      
//文字
      var tempText = this.text;
      
var isLong = false;
      
var cn = 0;
      
if (tempText.match(/[^ -~]/g) != null){
       cn 
= tempText.match(/[^ -~]/g).length;
      }


      
if ((tempText.length-cn)+cn*2 >= 18){
       
if (cn <= 3){
        tempText 
= tempText.substring(018)+"...";
       }

       
else {
        tempText 
= tempText.substring(010)+"...";
       }

       isLong 
= true;
      }

      htmlStr 
+= "<td valign="middle" onmouseover="function(){return false;}"";
      
if (isLong){
       htmlStr 
+= " title=""+this.text+""";
      }

      
if (this.disabled){
        htmlStr 
+= " style="color:Gray;white-space:nowrap;word-break:word-break ;"";
      }

      htmlStr 
+= "><nobr onmouseover="function(){return false;}">"+tempText+"&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 style=""+bs_rm_sperator+""/></td>";
    }

    htmlStr 
+= "</tr>";
    
return htmlStr;
  }


  
//设置图片的背景色
  this.setImgSelect = function(elmObj, flag){
   
//文字背景
   if (!flag){
   elmObj.style.cssText 
= bs_rm_out;
   }

   
else if (this.isError){
   elmObj.style.cssText 
= bs_rm_error;
   }

   
else {
   elmObj.style.cssText 
= bs_rm_over;
   }

   
//图片背景
    if (this.img.Trim() != ""){
      
if (flag){
        elmObj.cells[
0].style.backgroundColor = "#8989bc";
      }

      
else{
        elmObj.cells[
0].style.backgroundColor = "";
      }

    }

  }


  
//展现下一级菜单
 this.showChildren = function(event){
    
var pobj = eval(this.pid);
   
var the_obj = event.srcElement.parentElement;
   
if (the_obj.tagName == "TD"){
    the_obj 
= the_obj.parentElement;
   }

   
if (the_obj.id == this.id+"_tr_str"){
    the_obj 
= the_obj.parentElement;
   }

    
if (this.childList.length > 0 && !this.disabled){
      
//创建popup
   if (pobj.popupList[this.level+1== null){
    pobj.popupList[
this.level+1= pobj.popupList[this.level].document.parentWindow.createPopup();
    pobj.popupList[
this.level+1].document.oncontextmenu = function(){return false;};
    
if (pobj.popupList[this.level+1].document.charset != "GB2312"){
     
try{
      pobj.popupList[
this.level+1].document.charset="GB2312";
     }

     
catch(ex){
     }

    }

   }

   pobj.popupList[
this.level+1].document.body.innerHTML = "";
   pobj.popupList[
this.level+1].show(0,0,1,1);

      
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 levelObj = null;
      levelObj 
= pobj.popupList[this.level+1].document.getElementById(this.pid+"_rm_"+(this.level+1));
      
//level+1层没有创建
      if (levelObj == null){
        levelObj 
= pobj.popupList[this.level+1].document.createElement("div");
        levelObj.id 
= this.pid+"_rm_"+(this.level+1);
        levelObj.style.cssText 
= bs_rm_div;
        pobj.popupList[
this.level+1].document.body.appendChild(levelObj);
      }

      htmlStr 
+= "<input type="hidden" id=""+pobj.id+"_selectItem" name=""+pobj.id+"_selectItem" value="-1"/>";
      
//alert(htmlStr);
      levelObj.innerHTML = htmlStr;
      levelObj.style.display 
= "block";
      
this.childIsShow = true;
   
var width = levelObj.offsetWidth;
   
var Height = levelObj.offsetHeight;
      
//定位
   var left = GetDefineX(the_obj)+the_obj.offsetWidth;
   
var top = GetDefineY(the_obj);
      
if(((left+pobj.popupList[this.level].document.parentWindow.screenLeft)+levelObj.offsetWidth) >= window.screen.availWidth){
        left 
-= (the_obj.offsetWidth + levelObj.offsetWidth-4);
      }

      
if(((top+pobj.popupList[this.level].document.parentWindow.screenTop)+levelObj.offsetHeight) > window.screen.availHeight){
        top 
-= (levelObj.offsetHeight-the_obj.offsetHeight);
      }

   pobj.popupList[
this.level+1].show(left, top, width, Height, pobj.popupList[this.level].document.body);
    }

   
else{
    pobj.hiddenAll(
this.level+1);
  }

 }


  
//鼠标按下动作
  this.doOnmousedown = function(event, elmObj){
    event.cancelBubble
=true;
    
if (this.childList.length <= 0){
      elmObj.setCapture();
    }

    
return false;
  }

  
//鼠标弹起动作
  this.doOnmouseup = function(event, elmObj){
    event.cancelBubble
=true;
    
if (this.childList.length <= 0){
      
var pobj = eval(this.pid);
      pobj.setRMIndex(
this.areaIndex, this.index);
      elmObj.releaseCapture();
      
if (this.jsfun.Trim() != ""){
        
try{
         eval(
this.jsfun);
       
this.isError = false;
        }

        
catch(e){
         
var errStr = "*^_^*恭喜你中招了!  "+e.name+":"+e.message+"  节点操作方法 "+this.jsfun+" 发生严重错误!";
       elmObj.style.cssText 
= bs_rm_error;
       
this.isError = true;
       elmObj.title 
= errStr;
          
return;
        }

      }

      pobj.hiddenAll(
0);
    }

    
return false;
  }

  
//鼠标移入动作
  this.doOnmouseover = function(event, elmObj){
    event.cancelBubble
=true;
    
if (!this.isSperator){
      
this.setImgSelect(elmObj, true);
    }

    
//改变其他的项的高选
    var pobj = eval(this.pid);
    
if (!pobj.itemAreaList[this.areaIndex].setIndexItem(this.level, this.index)){
     
this.showChildren(event);
    }

   
else if (this.childList.length <= 0){
     pobj.hiddenAll(
this.level+1);
  }

  pobj.setRMIndex(
this.areaIndex, this.index);
    
return false;
  }


  
//鼠标移出动作
  this.doOnmouseout = function(event, elmObj){
    event.cancelBubble
=true;
    
if (!this.isSperator && !this.childIsShow){
      
this.setImgSelect(elmObj, false);
    }

    
return false;
  }

}



 

相关文章推荐

右键菜单(javaScript)

  • 2008年06月25日 22:37
  • 2KB
  • 下载

收集到的Javascript右键菜单实例

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> http://www.w3.org/1999/xhtml"> 右键菜单 ...
  • tyysoft
  • tyysoft
  • 2011年12月04日 23:01
  • 231

dtree动态树+Javascript右键菜单

dtree动态树+Javascript右键菜单(一) 1、从网上下载dtree控件。(好多地方都有的哦:P) 2、在Jbuilder中新建Web应用,命名为TreeLearing 3、解压...

javascript+css 实现右键菜单 (IE, firefox,chrome)

 基本原理:我们知道鼠标的右键单击事件是通过document.oncontextmenu来调用的,如果我们自行定义document.oncontextmenu=某个函数,这样就可以实现新右键菜单的调用...

[Javascript]用jquery的ContextMenu插件设置右键菜单

Struts项目中右键菜单一般很少用到,但是一旦客户有要求,很多人就懵圈了,比如我。这个时候,当然要表现镇定,一面拍着胸口对客户承诺说绝对可以实现,一面赶紧打开百度神器,搜搜看是否有前人已经写好的插件...

JavaScript设置右键菜单

  • 2009年11月10日 13:23
  • 917B
  • 下载

dtree动态树+Javascript右键菜单

dtree控件介绍  dtree动态树+Javascript右键菜单(一) 1、从网上下载dtree控件。(好多地方都有的哦:P) 2、在Jbuilder中新建Web应用,命名为TreeLe...

Javascript 右键菜单 JQuery 实现

  • 2010年07月31日 22:15
  • 135KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:javascript 右键菜单 (续)
举报原因:
原因补充:

(最多只允许输入30个字)