Javascript는 테이블 정렬, 편집, 드래그 및 Zooming_javascript 기술을 구현합니다.

WBOY
풀어 주다: 2016-05-16 16:22:45
원래의
999명이 탐색했습니다.

간단한 테이블 정렬

두 번 클릭하여 맞춤 편집된 규칙을 편집할 수 있습니다.

열 교체를 위해 열 드래그

테두리를 밀어 열 너비를 조정할 수 있습니다

코드 복사 코드는 다음과 같습니다.

 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
http://www.w3.org/1999/xhtml">


Table




 
  
      
      
      
      
      
  
 
  <본체>
 
   
   
   
   
   
 
 
   
   
   
   
       
 
 
   
   
   
   
       
 
 
   
   
   
   
       
 
 
   
   
   
   
       
 
 
   
   
   
   
       
 
 
   
   
   
   
       
 
 
   
   
   
   
       
 
 
   
   
   
   
       
 
 
   
   
   
   
       
 
 
   
   
   
   
       
                         
 

<스크립트 언어="javascript">
(함수(창,정의되지 않음){
window.Sys = 함수(ua){
    변수 b = {
        예: /msie/.test(ua) && !/opera/.test(ua),
        오페라: /opera/.test(ua),
        사파리: /webkit/.test(ua) && !/chrome/.test(ua),
        파이어폭스: /firefox/.test(ua),
        크롬: /chrome/.test(ua)
    },vMark = "";
    for (var i in b) {
        if (b[i]) { vMark = "사파리" == i ? "버전" : 나; 부서지다; }
    }
    b.version = vMark && RegExp("(?:" vMark ")[\/: ]([\d.] )").test(ua) ? RegExp.$1 : "0";
    b.ie6 = b.ie && parsInt(b.version, 10) == 6;
    b.ie7 = b.ie && parsInt(b.version, 10) == 7;
    b.ie8 = b.ie && parsInt(b.version, 10) == 8;  
    b를 돌려주세요;
}(window.navigator.userAgent.toLowerCase());

window.Sys.ie6&&document.execCommand("BackgroundImageCache", false, true);

window.$ = 함수(ID){
    return document.getElementById(Id);
};
window.addListener = 함수(요소,e,fn){
    !element.events&&(element.events = {});
    element.events[e]&&(element.events[e][addListener.guid ]=fn)||(element.events[e] = {'0':fn});
    element.addEventListener?element.addEventListener(e,fn,false):element.attachEvent("on" e,fn);
};
window.addListener.guid = 1;
window.removeListener = 함수(요소,e,fn){
    var handlers = element.events[e],type;
    if(fn){
        for(핸들러 입력)
            if(핸들러[유형]===fn){
                element.removeEventListener?element.removeEventListener(e,fn,false):element.detachEvent("on" e,fn);
                핸들러 삭제[유형];
            }
    }그밖에{
        for(핸들러 입력){
            element.removeEventListener?element.removeEventListener(e,handlers[type],false):element.detachEvent("on" e,handlers[type]);
            핸들러 삭제[유형];
        }
    }       
};
window.setStyle = 함수(e,o){
    if(typeof o=="string")
        e.style.cssText=o;
    그 외   
        for(var i in o)
            e.style[i] = o[i];
};

var 슬라이스 = Array.prototype.slice;
window.Bind = 함수(객체, 재미) {
    var args = Slice.call(arguments).slice(2);
    반환 함수() {
            return fun.apply(object, args);
    };
};
window.BindAsEventListener = function(object, fun,args) {
    var args = Slice.call(arguments).slice(2);
    반환함수(이벤트) {
        return fun.apply(object, [event || window.event].concat(args));
    }
};
//jQ에서 복사
window.Extend = 함수(){
 var 대상 = 인수[0] || {}, i = 1, 길이 = 인수.길이, 깊이 = true, 옵션;
 if ( typeof target === "boolean" ) {
  깊은 = 목표;
  대상 = 인수[1] || {};
  나는 = 2;
 }
 if ( typeof target !== "object" && Object.prototype.toString.call(target)!="[object Function]")
  대상 = {};
 for(;i   if ( (옵션 = 인수[ i ]) != null )
   for(옵션의 변수 이름){
    var src = 대상[ 이름 ], copy = 옵션[ 이름 ];
    if ( 대상 === 복사 )
     계속;
    if ( deep && copy && typeof copy === "object" && !copy.nodeType ){
     target[ 이름 ] = 인수.callee( deep, src || ( copy.length != null ? [ ] : { } ), copy );
    } 
    else if(복사 !== 정의되지 않음)
     대상[이름] = 복사;      
   }
 }
 반환 대상;   
};
window.objPos = 함수(o){
 var x = 0, y = 0;
 do{x = o.offsetLeft;y = o.offsetTop;}while((o=o.offsetParent));
 return {'x':x,'y':y};
}
window.Class = 함수(속성){
    var _class = function(){return (arguments[0] !== null && this.initialize && typeof(this.initialize) == 'function') ? this.initialize.apply(this, 인수) : this;};
    _class.prototype = 속성;
    return _class;
};
window.hasClass  = 함수(요소, 클래스이름){
 return element.className.match(new RegExp('(\s|^)' className '(\s|$)'));
} ;
window.addClass  = 함수(요소, 클래스 이름) {
 !this.hasClass(element, className)&&(element.className = " " className);
}
window.removeClass = function(element, className) {
 hasClass(element, className)&&(element.className = element.className.replace(new RegExp('(\s|^)' className '(\s|$)'),' ')) ;
}
})(창);

var 테이블 = 새 클래스({
옵션 :{
         최소 너비: 62
},
초기화: function(tab,set){
This.table = 탭;
This.rows = []; //모든 tr 참조 기록
This.sortCol = null; //정렬 중인 열을 기록합니다
This.inputtd = null; //편집 중인 td를 기록합니다
This.editconfig = {}; //테이블 편집 규칙 및 팁
This.thead = tab.getElementsByTagName('thead')[0];
This.theadTds = tab.getElementsByTagName('thead')[0].getElementsByTagName('td'); //일반적으로 사용되는 DOM 컬렉션은 속성으로 참조 가능
This.tbodyTds = tab.getElementsByTagName('tbody')[0].getElementsByTagName('td');
This.closConfig = {
on : 거짓,
~ ~             totd : null
        };
This.widthConfig = {
td : null,
nexttd : null,
x : 0,
td폭 : 0,
다음td폭 : 0
};
확장(this,this.options);
//이유는 모르겠지만 설정하지 않으면 랜덤으로 점프합니다
(Sys.ie6||Sys.chrome)&&(tab.width=tab.offsetWidth)
                              // 해당 체크박스를 기록하고 라디오가 선택되었습니다. 즉 6에서는 DOM 작업을 수행할 때 이러한 상태를 기억하지 않습니다.
If(Sys.ie6){
This.checkbox = {}
               var checkboxs = tab.getElementsByTagName('input'),i=0,l=checkboxs.length;
for(;i (checkboxs[i].type=="checkbox"||checkboxs[i].type=="radio")&&
                    addListener(checkboxs[i],"click",Bind(this,function(elm,i){
                    elm.checked==true?(this.checkbox[i] = elm):(delete this.checkbox[i]);
|         };
      var i=0,l=set.length,rows =tab.tBodies[0].rows,d=document,tabTads=tab.getElementsByTagName('td'),length=this.theadTds.length;
//편집용 입력
This.input = d.createElement('input')
This.input.type = "텍스트";
This.input.className = '편집';
​​​​ //끌고 있는 div를 표시하는데 사용됩니다
This.div = d.body.appendChild(d.createElement('div'));
This.div.className ="div";
//확대/축소 시 수직선 표시
This.line = d.body.appendChild(d.createElement('div'));
This.line.className = '라인';
This.line.style.top = objPos(tab).y "px";
//세트를 탐색하고 몇 가지 설정을 수행합니다.                                  for(;i //정렬이 필요한 헤드헌터에게 이벤트 바인딩
              addListener(this.theadTds[set[i].id],'click',Bind(this, this.sortTable, this.theadTds[set[i].id],set[i].type));
// 편집해야 하는 테이블의 열에 대한 필수 구성을 정의합니다.
set[i].edit&&(this.editconfig[set[i].id]={rule:set[i].edit.rule,message:set[i].edit.message});
}
//모든 tr을 정렬용 배열에 넣습니다
for( i=0,l=rows.length;i This.rows[i]=rows[i];
                                 
//모든 td를 탐색하고 일부 설정을 지정합니다
for( i=0,l=tabTads.length;i                      // 헤드에 모든 td를 표시하고 드래그할 때
를 사용하세요.                  i //편집해야 하는 td에 edit 속성을 추가합니다
i>=length&&this.editconfig[i%length]&&tabTads[i].setAttribute('edit',i%length);
}
                             
//드래그 및 확대/축소 작업 바인딩
         addListener(this.thead,'mousedown',BindAsEventListener(this,this.dragOrWidth));
                             
//드래그하면 td의 해당 열로 레코드가 이동됩니다
         addListener(this.thead,'mouseover',BindAsEventListener(this,this.theadHover));

//아아
addListener(this.thead,'mouseout',BindAsEventListener(this,this.theadOut));
                             
                      //편집 이벤트를 바인딩하고 e.srcElement 또는 e.target을 기반으로 어떤 테이블이 편집되는지 결정합니다.          addListener(tab,'dblclick',BindAsEventListener(this, this.edit));                                                      
//입력 종료 시 수정된 내용을 저장
AddListener(this.input,'blur',Bind(this,this.save,this.input)); },
SortTable :function(td,type){ //td는 클릭된 요소, n은 정렬할 열, type은 정렬 유형
      var frag=document.createDocumentFragment(),span=td.getElementsByTagName('span')[0],str=span.innerHTML;
If(td===this.sortCol){
This.rows.reverse();
                span.innerHTML =str.replace(/.$/,str.charAt(str.length-1)=="↓"?"↑":"↓") ;
         }그 외{
This.rows.sort(this.compare(td.getAttribute('clos'),type));
             span.innerHTML =span.innerHTML "↑";
this.sortCol!=null&&(this.sortCol.getElementsByTagName('span')[0].innerHTML = this.sortCol.getElementsByTagName('span')[0].innerHTML.replace(/.$/,'')) ;//이전 열의 정렬 표시 제거
        };
for(var i=0,l=this.rows.length;i                frag.appendChild(this.rows[i]);
This.table.tBodies[0].appendChild(frag);
If(Sys.ie6){
for(this.checkbox의 var s)
                this.checkbox[s].checked = true;
        }
        this.sortCol = td;   //记录哪一列正재排序中         
    },
    비교 :함수(n,유형){
  반환 함수 (a1,a2){
   var 변환 ={
    int    : function(v){returnparseInt(v)},
    float  : 함수(v){returnparseFloat(v)},
    날짜   : function(v){return v.toString()},
    문자열 : 함수(v){return v.toString()}
   };
   !convert[type]&&(convert[type]=function(v){return v.toString()});
   a1 =convert[유형](a1.cells[n].innerHTML);
   a2 =convert[유형](a2.cells[n].innerHTML);
   return a1==a2?0:a1   };
    },
    편집: 함수(e){
        var elem = this.inputtd=e.srcElement || e.target;
        if(!elem.getAttribute('edit'))return;
        this.input.value = elem.innerHTML;
        elem.innerHTML = "";
        elem.appendChild(this.input);
        this.input.focus();
    },
    저장 : 함수(elem){
  var editinfo=this.editconfig[elem.parentNode.getAttribute('edit')],status={
   "[개체 함수]" : editinfo.rule&&editinfo.rule(this.input.value)||false의 'length',       
   "[object RegExp]"   : editinfo.rule&&editinfo.rule.test(this.input.value)||false의 'test'
  }[Object.prototype.toString.call(editinfo.rule)],_self=this;
  //如果不符合条件  修改提示信息
  상태 유형 != "부울"&&(editinfo.message = 상태);
  if(상태===true){
   this.inputtd.innerHTML = this.input.value;
   this.inputtd=null;
  }그밖에{
   경고(editinfo.message);
   //firefox 아래  直接用input.focus()不会执行  用setTimeout可以执行
   setTimeout(function(){_self.input.focus()},0);
  }                    
    },
    theadHover  : 함수(e){
        var elem = e.srcElement || e.target;
        if(elem.nodeName.toLowerCase() ==='td'&&this.closConfig.on){
            this.closConfig.totd = elem.getAttribute('clos');
   !hasClass(elem,'thover')&&addClass(elem,'thover');
  }        
    },
 theadOut : 함수(e){
        var elem = e.srcElement || e.target;
        if(elem.nodeName.toLowerCase() ==='td'&&this.closConfig.on)removeClass(elem,'thover')
 },
    dragOrWidth : 함수(e){
        var elem = e.srcElement || e.target,widthConfig=this.widthConfig;
       
        //执行拖拽
        if(elem.nodeName.toLowerCase()==='td'){
            this.closConfig.td = elem.getAttribute('clos');
            addListener(document,'mousemove',BindAsEventListener(this,this.dragMove));
            addListener(document,'mouseup',Bind(this,this.dragUp));
   this.closConfig.on = true;
   Sys.ie?this.thead.setCapture(false):e.preventDefault();
        }
                  
  //이동속도缩放
  if(elem.nodeName.toLowerCase()==='div'){
   Sys.ie?(e.cancelBubble=true):e.stopPropagation();
   //如果是最后一个td里면적 div 不进行缩放
   if(this.theadTds[this.theadTds.length-1]===elem.parentNode)return
   Sys.ie?this.thead.setCapture(false):e.preventDefault();
   widthConfig.x = e.clientX;
   widthConfig.td = elem.parentNode;
   widthConfig.nexttd = widthConfig.td.nextSibling;
   while(widthConfig.nexttd.nodeName.toLowerCase()!="td"){
     widthConfig.nexttd = widthConfig.nexttd.nextSibling;
   };
   widthConfig.tdwidth     = widthConfig.td.offsetWidth;
   widthConfig.nexttdwidth = widthConfig.nexttd.offsetWidth;
   this.line.style.height = this.table.offsetHeight "px";
   addListener(document,'mousemove',BindAsEventListener(this,this.widthMove));
   addListener(document,'mouseup',Bind(this,this.widthUp));                                               
  }
    },
    dragMove : 함수(e){
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
        setStyle(this.div,{display:"block",left:e.clientX 9 "px",top:e.clientY 20 "px"});
    },
    드래그업 :function(){
        var closConfig = this.closConfig,rows = this.table.getElementsByTagName('tr'),td,n,o,i=0,l=rows.length;
  this.div.style.display = "없음";
        RemoveListener(document,'mousemove');
        RemoveListener(document,'mouseup');
  Sys.ie&&this.thead.releaseCapture();
  closConfig.on = 거짓; 
  if(closConfig.totd===null)return;
  RemoveClass(this.theadTds[closConfig.totd],'thover');
        //동일列 不进行列替换
        if(closConfig.td === closConfig.totd)return;
  
  //进行列替换 如果
  if(closConfig.td*1 1===closConfig.totd*1){
   n = closConfig.totd;
   o = closConfig.td;
  }그밖에{
   n = closConfig.td;
   o = closConfig.totd;
  }
        for(;i             td = 행[i].getElementsByTagName('td');
            행[i].insertBefore(td[n],td[o]);
        }                
                  
        //중요한 새로운 标识表头
        for(i=0,l=this.theadTds.length;i             this.theadTds[i].setAttribute('clos',i);
  closConfig.totd=closConfig.td=null;     
    },
 widthMove : 함수(e){
  window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
  var widthConfig = this.widthConfig,x = e.clientX - widthConfig.x,left = e.clientX,clientX=left;
  if(clientXwidthConfig.tdwidth-this.minWidth){
   왼쪽 = widthConfig.x - widthConfig.tdwidth this.minWidth;
  }
  if(clientX>widthConfig.x&&clientX - widthConfig.x>widthConfig.nexttdwidth-this.minWidth){
   왼쪽 =widthConfig.x widthConfig.nexttdwidth-this.minWidth;       
  }
  setStyle(this.line,{display:"block",left:left "px"});   
 },
 widthUp : 함수(){
  this.line.style.display = "없음";
var widthConfig = this.widthConfig,x= parsInt(this.line.style.left) - widthConfig.x
widthConfig.nexttd.style.width = widthConfig.nexttdwidth -x -1 'px';
widthConfig.td.style.width = widthConfig.tdwidth x -1 'px';
Sys.ie&&this.thead.releaseCapture();
RemoveListener(document,'mousemove');
RemoveListener(document,'mouseup');
}                                               });
window.onload = 함수(){
함수 checkName(val){
If(val.replace(/^s $/g,'')==='') return '이름 입력은 비워둘 수 없습니다.';
If(val.replace(/^s |s $/,'').length>10) return '이름은 10자를 초과할 수 없습니다.';
If(!/^[u4e00-u9fa5a-z] $/i.test(val)) return '이름은 한자와 문자로만 입력 가능합니다';
        true를 반환합니다.
};
함수 checkRemark(val){
if(val.replace(/^s $/g,'')===='') return '설명 입력은 비워둘 수 없습니다.';
if(val.replace(/^s |s $/,'').length>15) return '메모 길이는 15자를 초과할 수 없습니다.';
if(!/^[u4e00-u9fa5ws] $/i.test(val)) return '비고에는 중국어 숫자, 밑줄, 공백만 입력할 수 있습니다.';
true를 반환합니다.
}
var 세트 = [
{id:0,type:"int"},
{id:2,type:"string",edit:{rule:checkName,message:''}},
{id:3,type:"날짜",edit:{rule:/^d{4}-d{2}-d{2}$/, message:"이 형식으로 1985-02-30 날짜를 입력하세요." }},
{id:4,type:"string",edit:{rule:checkRemark,message:''}}
];
new Table($("tab"),set);
}


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
ID
选中
姓名
生日
备注
1소삼1982-05-27杯具,전체是杯具
3이사1983-06-27恩恩我魔兽技术不错
2王五1987-05-27波斯王子 时之刃还不错
4赵六1988-05-27我叫赵六
5朱八1984-05-27洗洗睡吧
6阿斯多夫1984-06-27阿斯多夫暗室逢灯
7杯具1984-06-27더 많은 것을 즐기세요
8餐具1984-02-27더 많은 모험
8洗具1984-08-27더 많은 것을 즐기세요
9内牛满면1984-12-2710快一晚
10犀利哥1984-12-21嘿嘿