Fixjs介绍
Fixjs是我打算在javascript技术领域开始积累的一个框架项目,这套框架主要为开发复杂组件提供底层的框架支持。
框架的类与接口我会尽量参考flash框架的实现。同时,我也会开放Fixjs的源代码,欢迎同仁一起学习、交流。
DisplayObjectContainer
DisplayObjectContainer是显示容器基类,它提供了显示子项的添加、移除、层次控制等接口。以下是代码实现:
fixjs.display.DisplayObjectContainer = fixjs.display.InteractiveObject.extend({
init: function (ele) {
fixjs.display.DisplayObjectContainer.base.init.call(this, ele);
this.mouseChildren = true;
this.numChildren = 0;
this.tabChildren = true;
this._children = [];
},
disposing:function () {
this.numChildren = 0;
fixjs.DisposeUtil.dispose(this._children);
this._children = null;
fixjs.display.DisplayObjectContainer.base.disposing.call(this);
},
setMouseChildren: function(value) {
var array = this._children;
for (var i = 0; i < array.length; i++) {
var child = array[i];
child.mouseEnabled = value;
if (child instanceof fixjs.display.DisplayObjectContainer) {
child.setMouseChildren(value);
}
}
},
setTabChildren: function(value) {
var array = this._children;
for (var i = 0; i < array.length; i++) {
var child = array[i];
child.tabEnabled = value;
if (child instanceof fixjs.display.DisplayObjectContainer) {
child.setTabChildren(value);
}
}
},
addChild: function(child) {
if (!(child instanceof fixjs.display.DisplayObject))
throw new Error("[ArgumentError]child必须是fixjs.display.DisplayObject类型!");
if (child == this)
throw new Error("[ArgumentError]child不能添加到自身!");
if (child.parent!= null)
throw new Error("[ArgumentError]child.parent不为空!");
if (this.contains(child))
throw new Error("[ArgumentError]已经包含child!");
this.ele.appendChild(child.ele);
child.parent = this;
this.numChildren++;
this._children.push(child);
var e = new fixjs.events.Event(fixjs.events.Event.ADDED);
this.dispatchEvent(e);
},
addChildAt: function(child, index) {
if (!(child instanceof fixjs.display.DisplayObject))
throw new Error("[ArgumentError]child必须是fixjs.display.DisplayObject类型!");
if (child == this)
throw new Error("[ArgumentError]child不能添加到自身!");
if (child.parent!= null)
throw new Error("[ArgumentError]child.parent不为空!");
if (this.contains(child))
throw new Error("[ArgumentError]已经包含child!");
if (index < 0 || index>= this.numChildren)
throw new Error("[RangeError]索引超出范围!");
var prev = this._children[index];
this.ele.insertBefore(child.ele, prev.ele);
child.parent = this;
this.numChildren++;
this._children.splice(index, 0, child);
var e = new fixjs.events.Event(fixjs.events.Event.ADDED);
this.dispatchEvent(e);
},
contains:function (child) {
var array = this._children;
return array.indexOf(child)>= 0;
},
getChildAt: function(index) {
if (index < 0 || index>= this.numChildren)
throw new Error("[RangeError]索引超出范围!");
return this._children[index];
},
getChildByName: function(name) {
var array = this._children;
for (var i = 0; i < array.length; i++) {
var child = array[i];
if (child.name== name)
return child;
}
},
getChildIndex: function(child) {
var i = this._children.indexOf(child);
if (i< 0)
throw newError("[ArgumentError]child不是该对象的子项!");
return i;
},
removeChild: function(child) {
var i = this._children.indexOf(child);
if (i< 0)
throw newError("[ArgumentError]child不是该对象的子项!");
return this.removeChildAt(i);
},
removeChildAt: function(index) {
if (index < 0 || index>= this.numChildren)
throw new Error("[RangeError]索引超出范围!");
var child = this._children[index];
this.ele.removeChild(child.ele);
this.numChildren--;
this._children.splice(index, 1);
var e = new fixjs.events.Event(fixjs.events.Event.REMOVED);
this.dispatchEvent(e);
return child;
},
removeAllChildren: function() {
var e;
if (this.numChildren)
e = new fixjs.events.Event(fixjs.events.Event.REMOVED);
while (this._children.length) {
var child = this._children.pop();
this.ele.removeChild(child.ele);
child.dispose();
}
this.numChildren = 0;
if (e)
this.dispatchEvent(e);
},
setChildIndex: function(child, index) {
if (index < 0 || index>= this.numChildren)
throw new Error("[RangeError]索引超出范围!");
var i = this._children.indexOf(child);
if (i< 0)
throw new Error("[ArgumentError]child不是该对象的子项!");
if (i== index)
return;
this._children.splice(i, 1);
this.ele.removeChild(child.ele);
if (index < this._children.length) {
var prev = this._children[index];
this.ele.insertBefore(child.ele, prev.ele);
}
else {
this.ele.appendChild(child.ele);
}
this._children.splice(index, 0, child);
},
swapChildren: function(child1, child2) {
var i1 = this._children.indexOf(child1);
if (i1 < 0)
throw new Error("[ArgumentError]child1不是该对象的子项!");
var i2 = this._children.indexOf(child2);
if (i2 < 0)
throw new Error("[ArgumentError]child2不是该对象的子项!");
var t1 = child1.ele.nextSibling;
var t2 = child2.ele.nextSibling;
if (t1)
this.ele.insertBefore(child2.ele, t1);
else
this.ele.appendChild(child2.ele);
if (t2)
this.ele.insertBefore(child1.ele, t2);
else
this.ele.appendChild(child1.ele);
},
swapChildrenAt: function(index1, index2) {
if (index1 < 0 || index1>= this.numChildren)
throw new Error("[RangeError]索引index1超出范围!");
if (index2 < 0 || index2>= this.numChildren)
throw new Error("[RangeError]索引index2超出范围!");
var child1 = this._children[index1];
var child2 = this._children[index2];
this.swapChildren(child1, child2);
}
});
相关文章