/**
* 可见窗口基类.
* 创建: QZZ
* 日期: 2014-04-06
*/
(function(undefined) {
nameSpace("com.ui");
com.ui.window = Extend(com.baseObject, {
/**
* 初始化函数.
* @param option 属性
* @param control DOM元素
* @param isDom 是否dom元素, 如果是在html页面上布局,
* 则option已自动解析,
*/
init:function(option, control, isDom) {
this.base(option);
if(typeof control != "undefined") {
//获取dom元素
this.thisWindow = control;
if(!isDom) {
//读取属性
var op = control.attributes.option;
if(typeof op != "undefined") {
op = eval("(" + op.nodeValue + ")");
}
if(typeof op != "undefined") {
for(var key in op) {
this.option[key] = op[key];
}
}
}
this.name = control.id || control.name;
}
this.logInfo("window.init");
this.render();
this.afterRender();
},
/**
* 对象创建函数.
*/
create:function() {
this.base();
this.className = "com.ui.window";
this.logInfo("window.create");
this.eventList = {};
this.keyBoard = {
DOWN:40,
UP:38,
LEFT:37,
RIGHT:39,
ENTER:13,
C:10,
V:86,
X:88,
Z:90
};
this.mouseType = {mtLeft : "L",
mtRight: "R"};
this.parent;
//处理宽高,顶点,左边
this.option.top = this._domValue(this.option.top, 0);
this.option.left = this._domValue(this.option.left, 0);
//绝对顶、左点
this._atop = null;
this._aleft = null;
//宽高
this.option.width = this._domValue(this.option.width, 10);
this.option.height = this._domValue(this.option.height, 10);
//内外边距
this.option.margin = this._domValue(this.option.margin,0);
this.option.padding = this._domValue(this.option.padding,0);
this.option.border = this.option.border||"";
this.focus = false;
//面板选择
this.hasSelect = false;
this._eventList = {};
this.body = null;
},
/**
* 渲染函数.
*/
render:function() {
this.logInfo("window.render");
if(typeof this.thisWindow == "undefined") {
this.thisWindow = this.createElement("div");
}
this.setStyle(this.thisWindow, "winStyle");
//处理大小变量
if(this._hasResize()) {
this._doResize();
}
},
/**
* 渲染后执行.
*/
afterRender:function(){
var _this = this;
this.thisWindow.onmouseup = function() {
_this.hasSelect = true;
};
//系统事件
this._sysEvent();
},
/**
* 执行变化调整事件.
* @return 返回状态
*/
_doResize:function() {
if(!this._update) return false;
this.logBegin("_doResize");
//边距处理
if(this.thisWindow.style.margin != this.option.margin + "px") {
this.thisWindow.style.margin = this.option.margin + "px";
}
if(this.thisWindow.style.padding != this.option.padding + "px") {
this.thisWindow.style.padding = this.option.padding + "px";
}
if(this.option.border !== "") {
this.thisWindow.style.border = this.option.border;
}
//计算长宽
var bw = this._getRectWidth();
var bh = this._getRectHeight();
if(bw <= 0) {
bw = 1;
}
bw += "px";
if(bh <= 0) {
bh = 1;
}
bh += "px"
var isResize = false;
var msg = "";
//处理大小
if(this.thisWindow.style.width != bw) {
msg += this.getName() + " width:" + this.thisWindow.style.width + " to " + bw + " ";
this.thisWindow.style.width = bw;
isResize = true;
}
if(this.thisWindow.style.height != bh) {
msg += this.getName() + " height:" + this.thisWindow.style.height + " to " + bh + " ";
this.thisWindow.style.height = bh;
isResize = true;
}
this.logEnd("_doResize " + msg);
return isResize;
},
/**
* 样式设置.
* @param tab 元素
* @param className 样式名
* @param doCss 设计样式
*/
setStyle:function(tab, className, doCss){
doCss = doCss || true;
if(className instanceof Array) {
//在元素上设置格式数组对象
tab.cssAry = className;
var cn = className.join(" ");
if(tab.className != cn && doCss) {
tab.className = cn;
}
} else {
//直接设置样式
if (tab.className != className) {
if(doCss) {
tab.className = className;
}
tab.cssAry = [className];
}
}
},
/**
* 添加样式.
* @param tab 元素
* @param className 样式名
* @param doCss 处理样式
*/
addStyle:function(tab, className, doCss) {
doCss = doCss || true;
if(typeof tab.cssAry != "undefined") {
//检查重复
var i = 0, len = tab.cssAry.length
for(; i < len; i++) {
if(tab.cssAry[i] == className) {
break;
}
}
//添加样式
if(i >= len) {
tab.cssAry.push(className);
}
} else {
tab.cssAry = [className];
}
if(doCss) {
//设计样式到dom
var ncs = tab.cssAry.join(" ");
if(ncs !== tab.className) {
tab.className = ncs;
}
}
},
/**
* 清除样式.
* @param tab 元素
* @param doCss 执行样式.
*/
clearStyle:function(tab, doCss) {
if(typeof tab.cssAry != "undefined") {
tab.cssAry = [];
}
doCss = doCss || true;
if(doCss && tab.className !== "") {
tab.className = "";
}
},
/**
* 删除样式.
* @param tab 元素
* @param className 样式名
* @param doCss 处理样式
*/
delStyle:function(tab, className, doCss) {
if(typeof tab.cssAry != "undefined") {
//查找需要删除的样式名
var i = 0, len = tab.cssAry.length;
for(; i < len; i++) {
if(tab.cssAry[i] == className) {
break;
}
}
if(i < len) {
tab.cssAry.splice(i, 1);
}
}
doCss = doCss || true;
if(doCss) {
var ncs = tab.cssAry.join(" ");
if(ncs !== tab.className) {
tab.className = ncs;
}
}
},
/**
* 解析dom元素的值.
* @param value 值
*/
_domValue:function(value, defValue) {
var vt = typeof value;
var defValue = defValue || 0;
if(vt == "string") {
value = value.replace(/px/, "");
if(this.isNotEmpty(value) && !isNaN(value)) {
value = parseInt(value, 10);
} else {
value = defValue;
}
} else if(vt != "number") {
value = defValue;
}
return value;
},
/**
* 大小是否发生变化.
*/
_hasResize:function() {
return !(this.thisWindow.style.top == this.option.top + "px"
&& this.thisWindow.style.left == this.option.left + "px"
&& this.thisWindow.style.width == this._getRectWidth() + "px"
&& this.thisWindow.style.height == this._getRectHeight() + "px");
},
/**
* 获取内宽.
* @return 返回宽度
*/
_getRectWidth:function() {
return this.getWidth() - (this._getBorderLeft()
+ this._getBorderRight()
+ this._getMarginLeft()
+ this._getMarginRight()
+ this._getPaddingLeft()
+ this._getPaddingRight());
},
/**
* 获取内高.
* @return 返回高度
*/
_getRectHeight:function() {
return this.getHeight() - (this._getBorderTop()
+ this._getBorderBottom()
+ this._getMarginTop()
+ this._getMarginBottom()
+ this._getPaddingTop()
+ this._getPaddingBottom());
},
/**
* 获取边左线.
* @param el 元素
* @return 返回宽度
*/
_getBorderLeft:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.borderLeftWidth, 0);;
},
/**
* 获取右边线
* @param el 元素
* @return 返回宽度
*/
_getBorderRight:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.borderRightWidth, 0);
},
/**
* 获取上边线
* @param el 元素
* @return 返回宽度
*/
_getBorderTop:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.borderTopWidth, 0);
},
/**
* 获取下边线
* @param el 元素
* @return 返回宽度
*/
_getBorderBottom:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.borderBottomWidth, 0);
},
/**
* 获取左外边距
* @param el 元素
* @return 返回宽度
*/
_getMarginLeft:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.marginLeft, 0);
},
/**
* 获取右外边距
* @param el 元素
* @return 返回宽度
*/
_getMarginRight:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.marginRight, 0);
},
/**
* 获取上外边距
* @param el 元素
* @return 返回宽度
*/
_getMarginTop:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.marginTop, 0);
},
/**
* 获取下外边距
* @param el 元素
* @return 返回宽度
*/
_getMarginBottom:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.marginBottom, 0);
},
/**
* 获取左内边距.
* @param el 元素
* @return 返回宽度
*/
_getPaddingLeft:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.paddingLeft, 0);
},
/**
* 获取右内边距.
* @param el 元素
* @return 返回宽度
*/
_getPaddingRight:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.paddingRight, 0);
},
/**
* 获取上内边距.
* @param el 元素
* @return 返回宽度
*/
_getPaddingTop:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.paddingTop, 0);
},
/**
* 获取下内边距.
* @param el 元素
* @return 返回宽度
*/
_getPaddingBottom:function(el) {
var el = el || this.thisWindow;
return this._domValue(el.style.paddingBottom, 0);
},
/**
* 获取body元素宽度.
* @return body宽度
*/
_getBodyWidth:function() {
if(this.browser.safari) {
return document.documentElement.clientWidth;
} else {
return this.body().width();
}
},
/**
* 获取body元素高度.
* @return body高度
*/
_getBodyHeight:function() {
if(this.browser.safari) {
return document.documentElement.clientHeight;
} else {
return this.body().height();
}
},
/**
* 返回当前窗口.
*/
getRectDom:function() {
return this.thisWindow;
},
/**
* 返回窗口body.
*/
body:function(){
if(typeof this.winBody == "undefined") {
this.winBody = document.getElementsByTagName("body")[0];
}
return this.winBody;
},
/**
* 获取高度.
* @return 返回高度
*/
getHeight:function() {
return this.option.height;
},
/**
* 设置高度.
* @param height 高度
* @param doRs 执行变更函数
*/
setHeight:function(height, doRs) {
this.option.height = height;
//this.logInfo("Window.setHeight");
doRs = doRs || true;
if(doRs && this._hasResize()) {
this._doResize();
}
},
/**
* 获取宽度
* @return 返回宽度
*/
getWidth:function() {
return this.option.width;
},
/**
* 设置宽度.
* @param width 宽度
* @param doRs 执行变更函数
*/
setWidth:function(width, doRs){
this.option.width = width;
//this.logInfo("Window.setWidth");
doRs = doRs || true;
if(doRs && this._hasResize()) {
this._doResize();
}
},
/**
* 设置顶点.
* @param top 顶点
* @param doRs 执行变更函数
*/
setTop:function(top, doRs) {
this.option.top = top;
this.logInfo("Window.setTop");
doRs = doRs || true;
if(doRs && this._hasResize()) {
this._doResize();
}
},
/**
* 获取当前顶点位置
* @return 顶点坐标
*/
getTop:function() {
return this.option.top;
},
/**
* 设置左边位置.
* @param left 左边位置
* @param doRs 执行变更函数
*/
setLeft:function(left, doRs) {
this.option.left = left;
this.logInfo("Window.setLeft");
doRs = doRs || true;
if(doRs && this._hasResize()) {
this._doResize();
}
},
/**
* 获取左边位置值.
* @return 返回
*/
getLeft:function() {
return this.option.left;
}
});
})();
有了上面的类,便可以在test.html文件中添加的自定义控件,如下<div>便是新增加的dom元素,这里把id设置为test, code为com.ui.window类,option中称添加height,width属性