VML封装库

vml工作流

最近看了下vml 把学到的一点东西封了一个类

/**
* @description 定制开发部 创建vml类
* @cop:北京神舟航天软件技术有限公司定制开发部
* @version 0.1 hemaoqing
* @date 2009-02-16
* @function 目前提供的功能:划线 矩形框,拖动
* @type 
*/
/*定义全局变量*/
var dragapproved = false;
var eventsource,x,y;
var popeventsource = "";
var temp1 = 0;
var temp2 = 0;
dzkf_vml={
/**
* 创建一个vml对象</br>内部调用

* @param {} s
* @return {}
*/
create_vml:function(s){return document.createElement('<vml:'+s+'/>');},
/**
* 创建一个绝对定位的vml
* @param {} s:vml的元素定义
* @return {} 返回创建的vml对象
*/
   create_ABS_vml:function(s){return this.create_vml(s+' style="position:absolute;Z-INDEX: 1;VERTICAL-ALIGN: middle;TEXT-ALIGN: center"');},
    /**
     * 改变大小
     * @param {} el
     * @param {} w
     * @param {} h
     */
   resize:function(el,w,h) { el.style.width=Math.round(w)+'px', el.style.height=Math.round(h)+'px'; }, 
   /**
    * 移动
    * @param {} el
    * @param {} x
    * @param {} y
    */
   moveto:function(el,x,y) { el.style.left=Math.round(x)+'px', el.style.top=Math.round(y)+'px'; },    
   
/**
* 在e1中插入el2并且命名为name
* @param {} el
* @param {} el2
* @param {} name
*/
insert_Sel:function(el,el2,name){
     el.insertBefore(el2); 
     el2.style.zIndex–; el2.style.zIndex++; 
     if(!el.els) el.els=new Array();
     if(name==""){ el.els[el.els.length]=el2; }
     else el.els[name]=el2;
},
/**
* 给el插入一个name的元素
* @param {} el
* @param {} name xx:线形 txt:文本框 sh:阴影 ext:立体图 fill:fill
* @return {}被插入的元素
*/
insert:function(el,name){
    var s;
    if(el.els){ if(el.els[name]) return el.els[name]; }
    if(name=="line||xx"||"arr") s='stroke endarrow="block"'; //线类型元素或箭头
    if(name=="text") s='Textbox inset="1px,1px,1px,1px" style="height:20;font-size:12px;WORD-BREAK:break-all;COLOR:#f81ad2"'; 
    if(name=="shadow") s='shadow on="T" type="single" color="#b3b3b3" offset="2px,2px"'; //阴影
    if(name=="ext") s='extrusion on="T" color="red" rotationangle="0,0"'; //立体图形
    if(name=="fill")s="fill";
    var el2=this.create_vml(s); this.insert_Sel(el,el2,name); return el2;
},
/**
   * 划线
   * @description 仅仅是划线 没有定义起始点
   * @return el 返回line节点
   */
create_line:function()
{
    var el=this.create_ABS_vml('line');
    return el;
},
/**
* @description 划线 定义 from   to
* @param {} x1 起始点坐标
* @param {} y1 起始点坐标
* @param {} x2 终止点坐标
* @param {} y2 终止点坐标
* @return {} 返回line节点
*/
create_line_from_to:function(x1,y1,x2,y2)
{
    var el=this.create_ABS_vml('line');
    el.from=Math.round(x1)+","+Math.round(y1);
    el.to =Math.round(x2)+","+Math.round(y2);
    return el;
},
/**
* 创建矩形
* @param {} x :x坐标
* @param {} y :y坐标
* @param {} sx :width宽度
* @param {} sy :height高度
* @return 返回该节点
*/
create_roundrect:function(x,y,sx,sy,id)
{
   var el=this.create_ABS_vml("roundrect");
   el.inset="2pt,2pt,2pt,2pt";
   this.moveto(el,x,y);
   this.resize(el,sx,sy);
   el.id=id;
   return el;
},
/**
* 划线 如果在创建线对象时没有指定from to则必须调用该方法
* 这里规定source是线的起始点对象的id 需要起始点对象定义id属性
* object 终结点对象id
*/
drawLine:function()
{
var source;
var object;
var sourceObj;
var objectObj;
var x0,y0,x1,y1;
var p0,p1;
var a = document.getElementsByTagName('line');
for (var i = 0; i < a.length; i++)
{
     source = a[i].getAttribute('source');
     object = a[i].getAttribute('object');
     if ((source != null) && (object != null))
     {
        sourceObj = document.getElementById(source);
        objectObj = document.getElementById(object);

        if ((sourceObj == null) || (objectObj == null)) continue;

        if (sourceObj.style.pixelLeft > objectObj.style.pixelLeft)
        {
           if ((sourceObj.style.pixelLeft – objectObj.style.pixelLeft) <= objectObj.style.pixelWidth)
           {
     x0 = sourceObj.style.pixelLeft + sourceObj.style.pixelWidth / 2;
     x1 = objectObj.style.pixelLeft + objectObj.style.pixelWidth / 2;
               if (sourceObj.style.pixelTop > objectObj.style.pixelTop)
                {
         y0 = sourceObj.style.pixelTop;
         y1 = objectObj.style.pixelTop + objectObj.style.pixelHeight;
               }
               else
               {
         y0 = sourceObj.style.pixelTop + sourceObj.style.pixelHeight;
         y1 = objectObj.style.pixelTop;
   }
           }
           else
           {
               x0 = sourceObj.style.pixelLeft;
               x1 = objectObj.style.pixelLeft + objectObj.style.pixelWidth;
       y0 = sourceObj.style.pixelTop + sourceObj.style.pixelHeight / 2;
       y1 = objectObj.style.pixelTop + objectObj.style.pixelHeight / 2;
           }
        }
        else
        {
           if ((objectObj.style.pixelLeft – sourceObj.style.pixelLeft) <= objectObj.style.pixelWidth)
           {
     x0 = sourceObj.style.pixelLeft + sourceObj.style.pixelWidth / 2;
     x1 = objectObj.style.pixelLeft + objectObj.style.pixelWidth / 2;
               if (sourceObj.style.pixelTop > objectObj.style.pixelTop)
               {
      y0 = sourceObj.style.pixelTop;
      y1 = objectObj.style.pixelTop + objectObj.style.pixelHeight;
               }
               else
               {
      y0 = sourceObj.style.pixelTop + sourceObj.style.pixelHeight;
      y1 = objectObj.style.pixelTop;
   }
           }
           else
           {
    x0 = sourceObj.style.pixelLeft + sourceObj.style.pixelWidth;
    x1 = objectObj.style.pixelLeft;
    y0 = sourceObj.style.pixelTop + sourceObj.style.pixelHeight / 2;
    y1 = objectObj.style.pixelTop + objectObj.style.pixelHeight / 2;
             }
        }

        a[i].from = String(x0) + ',' + String(y0);
        a[i].to = String(x1) + ',' + String(y1);

        a[i].style.pixelLeft = x0 + 'px';
        a[i].style.pixelTop = y0 + 'px';

     }
}

},
/**
* 移动
* @return {Boolean}
*/
move:function()
{
if (event.button == 1 && dragapproved)
{
   var newleft = temp1 + event.clientX – x;
   var newtop = temp2 + event.clientY – y;
   eventsource.style.pixelLeft = newleft;
   eventsource.style.pixelTop = newtop;
   dzkf_vml.drawLine();
   return false;
}
return;
},
/**
* 拖动
*/
drags:function()
{
if (event.button != 1)
     return;

var objRect = event.srcElement;
if (objRect.tagName == 'roundrect')
{
   dragapproved = true;
   eventsource = objRect;
   temp1 = eventsource.style.pixelLeft;
   temp2 = eventsource.style.pixelTop;
   x = event.clientX;
   y = event.clientY;
}
}, 
/**
* 结束拖动
*/
nodrags:function()
{
   dragapproved = false;
}

}

//var el=dzkf_vml.create_roundrect(100,100,100,100,'id1');
// var e2=dzkf_vml.insert(el,'txt');
// e2.style.COLOR="#f81ad2;";
//    dzkf_vml.insert(el,'shadow');
// var el1=dzkf_vml.create_roundrect(300,100,100,100,'id3');
//    dzkf_vml.insert(el1,'shadow');
//    el1.innerHTML='<vml:textbox title="步骤名称:部门 下一步骤:" inset="0pt,0pt,0pt,0pt">部门</vml:textbox> ';
//Ext.getBody().appendChild(el); 
//Ext.getBody().appendChild(el1);
//
//var l=dzkf_vml.create_line(); 
//l.source='id1';
//l.object='id3';
//s=dzkf_vml.insert(l,'arr');
//Ext.getBody().appendChild(l);

document.onmousedown = dzkf_vml.drags; 
document.onmouseup = dzkf_vml.nodrags; 
document.onmousemove =dzkf_vml.move;
dzkf_vml.drawLine();

来自http://hi.baidu.com/hemaoqing/item/9883f508ae9d58026c904852

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注