📄 dhtmlxgrid.js
字号:
/*
Copyright Scand LLC http://www.scbr.com
This version of Software is free for using in GNU GPL applications. For other use or to get Professional Edition please contact info@scbr.com to obtain license
*/
/*_TOPICS_
@0:initialization
@1:selection control
@2:rows control
@3:colums control
@4:cells controll
@5:data manipulation
@6:appearence control
@7:overal control
@8:tools
@9:treegrid
@10: event handlers
@11: paginal output
*/
var globalActiveDHTMLGridObject;
String.prototype._dhx_trim = function(){
return this.replace(/ /g," ").replace(/(^[ \t]*)|([ \t]*$)/g,"");
}
function dhtmlxArray(ar){ return dhtmlXHeir((ar||new Array()),new _dhtmlxArray()); };
function _dhtmlxArray(){ return this; };
_dhtmlxArray.prototype._dhx_find = function(pattern){
for(var i=0;i<this.length;i++){
if(pattern==this[i])
return i;
}
return -1;
}
_dhtmlxArray.prototype._dhx_delAt = function(ind){
if(Number(ind)<0 || this.length==0)
return false;
for(var i=ind;i<this.length;i++){
this[i]=this[i+1];
}
this.length--;
}
_dhtmlxArray.prototype._dhx_insertAt = function(ind,value){
this[this.length] = null;
for(var i=this.length-1;i>=ind;i--){
this[i] = this[i-1]
}
this[ind] = value
}
_dhtmlxArray.prototype._dhx_removeAt = function(ind){
for(var i=ind;i<this.length;i++){
this[i] = this[i+1]
}
this.length--;
}
_dhtmlxArray.prototype._dhx_swapItems = function(ind1,ind2){
var tmp = this[ind1];
this[ind1] = this[ind2]
this[ind2] = tmp;
}
/**
* @desc: dhtmlxGrid constructor
* @param: id - (optional) id of div element to base grid on
* @returns: dhtmlxGrid object
* @type: public
*/
function dhtmlXGridObject(id){
if (_isIE) try { document.execCommand("BackgroundImageCache", false, true); } catch (e){}
if(id){
if(typeof(id)=='object'){
this.entBox = id
this.entBox.id = "cgrid2_"+(new Date()).getTime();
}else
this.entBox = document.getElementById(id);
}else{
this.entBox = document.createElement("DIV");
this.entBox.id = "cgrid2_"+(new Date()).getTime();
}
this._tttag=this._tttag||"rows";
this._cttag=this._cttag||"cell";
this._rttag=this._rttag||"row";
var self = this;
this._wcorr=0;
this.nm = this.entBox.nm || "grid";
this.cell = null;
this.row = null;
this.editor=null;
this._f2kE=true; this._dclE=true;
this.combos=new Array(0);
this.defVal=new Array(0);
this.rowsAr = new Array(0);//array of rows by idd
this.rowsCol = new dhtmlxArray(0);//array of rows by index
//this.hiddenRowsAr = new Array(0);//nb added for paging
this._maskArr=new Array(0);
this.selectedRows = new dhtmlxArray(0);//selected rows array
this.rowsBuffer = new Array(new dhtmlxArray(0),new dhtmlxArray(0));//buffer of rows loaded, but not rendered (array of ids, array of cell values arrays)
this.loadedKidsHash = null;//not null if there is tree cell in grid
this.UserData = new Array(0)//array of rows (and for grid - "gridglobaluserdata") user data elements
/*MAIN OBJECTS*/
this.styleSheet = document.styleSheets;
this.entBox.className = "gridbox";
this.entBox.style.width = this.entBox.getAttribute("width") || (window.getComputedStyle?window.getComputedStyle(this.entBox,null)["width"]:(this.entBox.currentStyle?this.entBox.currentStyle["width"]:0)) || "100%";
this.entBox.style.height = this.entBox.getAttribute("height") || (window.getComputedStyle?window.getComputedStyle(this.entBox,null)["height"]:(this.entBox.currentStyle?this.entBox.currentStyle["height"]:0)) || "100%";
//cursor and text selection
this.entBox.style.cursor = 'default';
this.entBox.onselectstart = function(){return false};//avoid text select
this.obj = document.createElement("TABLE");
this.obj.cellSpacing = 0;
this.obj.cellPadding = 0;
this.obj.style.width = "100%";//nb:
this.obj.style.tableLayout = "fixed";
this.obj.className = "obj";
this.obj._rows=function(i){ return this.rows[i+1]; }
this.obj._rowslength=function(){ return this.rows.length-1; }
this.hdr = document.createElement("TABLE");
this.hdr.style.border="1px solid gray"; //FF 1.0 fix
this.hdr.cellSpacing = 0;
this.hdr.cellPadding = 0;
if ((!_isOpera)||(_OperaRv>=9))
this.hdr.style.tableLayout = "fixed";
this.hdr.className = "hdr";
this.hdr.width = "100%";
this.xHdr = document.createElement("TABLE");
this.xHdr.cellPadding = 0;
this.xHdr.cellSpacing = 0;
var r = this.xHdr.insertRow(0)
var c = r.insertCell(0);
r.insertCell(1).innerHTML = " ";
c.appendChild(this.hdr)
this.objBuf = document.createElement("DIV");
this.objBuf.appendChild(this.obj);
this.entCnt = document.createElement("TABLE");
this.entCnt.insertRow(0).insertCell(0)
this.entCnt.insertRow(1).insertCell(0);
this.entCnt.cellPadding = 0;
this.entCnt.cellSpacing = 0;
this.entCnt.width = "100%";
this.entCnt.height = "100%";
this.entCnt.style.tableLayout = "fixed";
this.objBox = document.createElement("DIV");
this.objBox.style.width = "100%";
this.objBox.style.height = this.entBox.style.height;
this.objBox.style.overflow = "auto";
this.objBox.style.position = "relative";
this.objBox.appendChild(this.objBuf);
this.objBox.className = "objbox";
this.hdrBox = document.createElement("DIV");
this.hdrBox.style.width = "100%"
if (((_isOpera)&&(_OperaRv<9)) )
this.hdrSizeA=25; else this.hdrSizeA=100;
this.hdrBox.style.height=this.hdrSizeA+"px";
if (_isIE)
this.hdrBox.style.overflowX="hidden";
else
this.hdrBox.style.overflow = "hidden";
this.hdrBox.style.position = "relative";
this.hdrBox.appendChild(this.xHdr);
this.preloadImagesAr = new Array(0)
this.sortImg = document.createElement("IMG")
this.sortImg.style.display = "none";
this.hdrBox.insertBefore(this.sortImg,this.xHdr)
this.entCnt.rows[0].cells[0].vAlign="top";
this.entCnt.rows[0].cells[0].appendChild(this.hdrBox);
this.entCnt.rows[1].cells[0].appendChild(this.objBox);
this.entBox.appendChild(this.entCnt);
//add links to current object
this.entBox.grid = this;
this.objBox.grid = this;
this.hdrBox.grid = this;
this.obj.grid = this;
this.hdr.grid = this;
/*PROPERTIES*/
this.cellWidthPX = new Array(0);//current width in pixels
this.cellWidthPC = new Array(0);//width in % if cellWidthType set in pc
this.cellWidthType = this.entBox.cellwidthtype || "px";//px or %
this.delim = this.entBox.delimiter || ",";
this._csvDelim = ",";
this.hdrLabels = (this.entBox.hdrlabels || "").split(",");
this.columnIds = (this.entBox.columnids || "").split(",");
this.columnColor = (this.entBox.columncolor || "").split(",");
this.cellType = dhtmlxArray((this.entBox.cellstype || "").split(","));
this.cellAlign = (this.entBox.cellsalign || "").split(",");
this.initCellWidth = (this.entBox.cellswidth || "").split(",");
this.fldSort = (this.entBox.fieldstosort || "").split(",")
this.imgURL = this.entBox.imagesurl || "gridCfx/";
this.isActive = false;//fl to indicate if grid is in work now
this.isEditable = true;
this.raNoState = this.entBox.ranostate || null;
this.chNoState = this.entBox.chnostate || null;
this.selBasedOn = (this.entBox.selbasedon || "cell").toLowerCase()
this.selMultiRows = this.entBox.selmultirows || false;
this.multiLine = this.entBox.multiline || false;
this.noHeader = this.entBox.noheader || false;
this.dynScroll = this.entBox.dynscroll || false;//add/remove rows from dom
this.dynScrollPageSize = 0;//will be autodetected
this.dynScrollPos = 0;//position of dynamic scroll
this.xmlFileUrl = this.entBox.xmlfileurl || "";
this.recordsNoMore = this.entBox.infinitloading || true;;//if true, then it will not attempt to fill the buffer from server
this.useImagesInHeader = false;//use images in header or not
this.pagingOn = false;//paging on/off
//this.dynScrollBuffer = 100;//number of rows in buffer
this.rowsBufferOutSize = 0;//number of rows rendered at a moment
/*EVENTS*/
this.onCheckbox=this.onEnter=this.onRowSelect=this.onEditCell = function(){return true;};
dhtmlxEvent(window,"unload",function(){try{ self.destructor(); } catch(e){}});
/*XML LOADER(S)*/
/**
* @desc: loads xml content from specified url
* @param: url - XML file url
* @param: afterCall - function which will be called after xml loading
* @type: public
* @topic: 0,5
*/
this.loadXML = function(url,afterCall){
if (this._dload) { this._dload=url; this._askRealRows(); return true; };
if (this._xmlaR) this.setXMLAutoLoading(url);
if(url.indexOf("?")!=-1)
var s = "&";
else
var s = "?";
var obj = this;
if (this.onXLS) this.onXLS(this);
if (afterCall) this.xmlLoader.waitCall=afterCall;
this.xmlLoader.loadXML(url+""+s+"rowsLoaded="+this.getRowsNum()+"&lastid="+this.getRowId(this.getRowsNum()-1)+"&sn="+Date.parse(new Date()));
//nb:
//if (this.onXLS) setTimeout(function(){obj.onXLS(obj)},0);
//setTimeout(function(){obj.xmlLoader.loadXML(url+""+s+"rowsLoaded="+obj.getRowsNum()+"&lastid="+obj.getRowId(obj.getRowsNum()-1)+"&sn="+Date.parse(new Date()));},1)
}
/**
* @desc: set one of predefined css styles (currently : xp)
* @param: name - style name
* @type: public
* @topic: 0,6
*/
this.setSkin = function(name){
this.entBox.className = "gridbox gridbox_"+name;
switch(name){
case "xp": this._srdh=22; break;
case "gray": this._borderFix=(_isIE?1:0); break;
}
}
/**
* @desc: puts xml to parser
* @type: private
* @topic: 0,5
*/
this.doLoadDetails = function(obj){
var root = self.xmlLoader.getXMLTopNode(self._tttag)
if (root.tagName!="DIV")
if(!self.xmlLoader.xmlDoc.nodeName){
self.parseXML(self.xmlLoader.xmlDoc.responseXML)
}else{
self.parseXML(self.xmlLoader.xmlDoc)
}
//nb:paging
if(self.pagingOn)
self.createPagingBlock()
}
this.xmlLoader = new dtmlXMLLoaderObject(this.doLoadDetails,window,true,this.no_cashe);
if (_isIE) this.preventIECashing(true);
this.dragger=new dhtmlDragAndDropObject();
/*METHODS. SERVICE*/
/**
* @desc: on scroll grid inner actions
* @type: private
* @topic: 7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -