dijit._Container源码
define("dijit/_Container", ["dojo", "dijit"], function(dojo, dijit) {dojo.declare("dijit._Container",null,{// summary://Mixin for widgets that contain a set of widget children.// description://Use this mixin for widgets that needs to know about and//keep track of their widget children. Suitable for widgets like BorderContainer//and TabContainer which contain (only) a set of child widgets.////It's not suitable for widgets like ContentPane//which contains mixed HTML (plain DOM nodes in addition to widgets),//and where contained widgets are not necessarily directly below//this.containerNode. In that case calls like addChild(node, position)//wouldn't make sense.// isContainer: [protected] Boolean//Indicates that this widget acts as a "parent" to the descendant widgets.//When the parent is started it will call startup() on the child widgets.//See also `isLayoutContainer`.isContainer: true,buildRendering: function(){this.inherited(arguments);if(!this.containerNode){// all widgets with descendants must set containerNode this.containerNode = this.domNode;}},addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){// summary://Makes the given widget a child of this widget.// description://Inserts specified child widget's dom node as a child of this widget's//container node, and possibly does other processing (such as layout).var refNode = this.containerNode;if(insertIndex && typeof insertIndex == "number"){var children = this.getChildren();if(children && children.length >= insertIndex){refNode = children[insertIndex-1].domNode;insertIndex = "after";}}dojo.place(widget.domNode, refNode, insertIndex);// If I've been started but the child widget hasn't been started,// start it now. Make sure to do this after widget has been// inserted into the DOM tree, so it can see that it's being controlled by me,// so it doesn't try to size itself.if(this._started && !widget._started){widget.startup();}},removeChild: function(/*Widget or int*/ widget){// summary://Removes the passed widget instance from this widget but does//not destroy it. You can also pass in an integer indicating//the index within the container to removeif(typeof widget == "number"){widget = this.getChildren()[widget];}if(widget){var node = widget.domNode;if(node && node.parentNode){node.parentNode.removeChild(node); // detach but don't destroy}}},hasChildren: function(){// summary://Returns true if widget has children, i.e. if this.containerNode contains something.return this.getChildren().length > 0;// Boolean},destroyDescendants: function(/*Boolean*/ preserveDom){// summary:// Destroys all the widgets inside this.containerNode,// but not this widget itselfdojo.forEach(this.getChildren(), function(child){ child.destroyRecursive(preserveDom); });},_getSiblingOfChild: function(/*dijit._Widget*/ child, /*int*/ dir){// summary://Get the next or previous widget sibling of child// dir://if 1, get the next sibling//if -1, get the previous sibling// tags:// privatevar node = child.domNode,which = (dir>0 ? "nextSibling" : "previousSibling");do{node = node[which];}while(node && (node.nodeType != 1 || !dijit.byNode(node)));return node && dijit.byNode(node);// dijit._Widget},getIndexOfChild: function(/*dijit._Widget*/ child){// summary://Gets the index of the child in this container or -1 if not foundreturn dojo.indexOf(this.getChildren(), child);// int},startup: function(){// summary://Called after all the widgets have been instantiated and their//dom nodes have been inserted somewhere under dojo.doc.body.////Widgets should override this method to do any initialization//dependent on other widgets existing, and then call//this superclass method to finish things off.////startup() in subclasses shouldn't do anything//size related because the size of the widget hasn't been set yet.if(this._started){ return; }// Startup all children of this widgetdojo.forEach(this.getChildren(), function(child){ child.startup(); });this.inherited(arguments);}});return dijit._Container;});?