📄 zapatectree.js
字号:
item.className += " tree-item-collapsed";
this.toggleItem(id);
} else
item.className += " tree-item-expanded";
if (/(^|\s)selected(\s|$)/i.test(li.className))
this.selectedItem = item;
break;
}
}
if (!has_icon)
this.item_addDefaultIcon(item, this.config.defaultIcons);
return item;
};
/**
* \internal This function adds a TD element having a certain class attribute
* which helps having a tree containing icons without defining IMG tags for
* each item. The class name will be "tgb icon className" (where "className"
* is the specified parameter). Further, in order to customize the icons, one
* should add some CSS lines like this:
*
* \code
* div.tree-item td.customIcon {
* background: url("themes/img/fs/document2.png") no-repeat 0 50%;
* }
* div.tree-item-expanded td.customIcon {
* background: url("themes/img/fs/folder-open.png") no-repeat 0 50%;
* }
* div.tree-item-collapsed td.customIcon {
* background: url("themes/img/fs/folder.png") no-repeat 0 50%;
* }
* \endcode
*
* As you can see, it's very easy to customize the default icons for a normal
* tree item (that has no subtrees) or for expanded or collapsed items. For
* the above example to work, one has to pass { defaultIcons: "customIcon" } in
* the tree configuration object.
*
* This function does nothing if the \b className parameter has a false logical
* value (i.e. is null).
*
* @param item [HTMLElement] -- reference to the DIV element holding the item
* @param className -- a string containing the additional class name
*/
Zapatec.Tree.prototype.item_addDefaultIcon = function(item, className) {
if (!className)
return;
var last_td = item.firstChild.firstChild.firstChild.lastChild, td;
var td = Zapatec.Utils.createElement("td");
td.className = "tgb icon " + className;
td.onclick = Zapatec.Tree.onItemToggle;
last_td.parentNode.insertBefore(td, last_td);
};
/**
* \internal This function does different things, depending on whether the \b
* img parameter is passed or not. If the \b img is passed, then this function
* adds it as an icon for the given item. If not passed, this function creates
* a "+/-" button for the given item.
*
* @param item [HTMLElement] -- reference to the DIV holding the item elements
* @param img [HTMLImgElement, optional] -- reference to an IMG element; normally one found in the <LI>
*/
Zapatec.Tree.prototype.item_addIcon = function(item, img) {
if (this.config.d_profile) // PROFILE
++profile.icons; // PROFILE
var last_td = item.firstChild.firstChild.firstChild, td;
last_td = img ? last_td.lastChild : last_td.firstChild;
if (!img || !item.__msh_icon) {
td = Zapatec.Utils.createElement("td");
td.className = "tgb " + (img ? "icon" : "minus");
last_td.parentNode.insertBefore(td, last_td);
td.onclick = Zapatec.Tree.onImgToggle; //modify wanglj
} else {
td = item.__msh_icon;
img.style.display = "none";
}
if (!img) {
td.innerHTML = " ";
item.className += " tree-item-more";
item.__msh_state = true; // expanded
item.__msh_expand = td;
} else {
td.appendChild(img);
item.__msh_icon = td;
}
};
/**
* This function gets called from a global event handler when some item was
* clicked. It selects the item and toggles it if it has a subtree (expands or
* collapses it).
*
* @param item_id [string] -- the item ID
*/
Zapatec.Tree.prototype.itemClicked = function(item_id) {
this.selectedItem = this.toggleItem(item_id);
if (this.config.hiliteSelectedNode && this.selectedItem)
Zapatec.Utils.addClass(this.selectedItem, "tree-item-selected");
this.onItemSelect(this.selectedItem);
};
/**
* This function toggles an item if the \b state parameter is not specified.
* If \b state is \b true then it expands the item, and if \b state is \b false
* then it collapses the item.
*
* @param item_id [string] -- the item ID
* @param state [boolean, optional] -- the desired item state
*
* @return a reference to the item element if found, null otherwise
*/
Zapatec.Tree.prototype.toggleItem = function(item_id, state) {
if (item_id) {
if (this.config.hiliteSelectedNode && this.selectedItem)
Zapatec.Utils.removeClass(this.selectedItem, "tree-item-selected");
var item = this.items[item_id];
if (typeof state == "undefined")
state = !item.__msh_state;
if (state != item.__msh_state) {
var subtree = this._getTree(item.__msh_subtree, this.creating_now);
if (subtree) {
subtree.style.display = state ? "block" : "none";
Zapatec.Utils.removeClass(item, "tree-item-expanded");
Zapatec.Utils.removeClass(item, "tree-item-collapsed");
Zapatec.Utils.addClass(item, state ? "tree-item-expanded" : "tree-item-collapsed");
}
var img = item.__msh_expand;
if (img)
img.className = "tgb " + (state ? "minus" : "plus");
item.__msh_state = state;
img = item.__msh_icon;
if (img) {
img.firstChild.style.display = "none";
img.appendChild(img.firstChild);
img.firstChild.style.display = "block";
}
if (this.config.compact && state) {
var a = this._getTree(item.__msh_parent).__msh_items;
for (var i = a.length; --i >= 0;)
if (a[i] != item_id)
this.toggleItem(a[i], false);
}
}
return item;
}
return null;
};
/**
* Call this function to collapse all items in the tree.
*/
Zapatec.Tree.prototype.collapseAll = function() {
for (var i in this.trees)
this.toggleItem(this._getTree(i).__msh_item, false);
};
/**
* Call this function to expand all items in the tree.
*/
Zapatec.Tree.prototype.expandAll = function() {
for (var i in this.trees)
this.toggleItem(this._getTree(i).__msh_item, true);
};
/**
* Call this function to toggle all items in the tree.
*/
Zapatec.Tree.prototype.toggleAll = function() {
for (var i in this.trees)
this.toggleItem(this._getTree(i).__msh_item);
};
/**
* Call this function to synchronize the tree to a given item. This means that
* all items will be collapsed, except that item and the full path to it.
*
* @param item_id [string] -- the ID of the item to sync to.
*/
Zapatec.Tree.prototype.sync = function(item_id) {
var item = this.items[item_id];
if (item) {
this.collapseAll();
this.selectedItem = item;
var a = [];
while (item.__msh_parent) {
a[a.length] = item;
var pt = this._getTree(item.__msh_parent);
if (pt.__msh_item)
item = this.items[pt.__msh_item];
else
break;
}
for (var i = a.length; --i >= 0;)
this.toggleItem(a[i].__msh_item, true);
Zapatec.Utils.addClass(this.selectedItem, "tree-item-selected");
}
};
/**
* Destroys the tree. Removes all elements. Does not destroy the Zapatec.Tree
* object itself (actually there's no proper way in JavaScript to do that).
*/
Zapatec.Tree.prototype.destroy = function() {
var p = this.top_parent;
p.parentNode.removeChild(p);
};
/**
* \internal This function is used when "dynamic initialization" is on. It
* retrieves a reference to a subtree if already created, or creates it if it
* wasn't yet and \b dont_call is \b false (returns null in that case).
*
* @param tree_id [string] the ID of the subtree
* @param dont_call [boolean] pass true here if you don't want the subtree to be created
*
* @return reference to the tree if it was found or created, null otherwise.
*/
Zapatec.Tree.prototype._getTree = function(tree_id, dont_call) {
var tree = this.trees[tree_id];
if (typeof tree == "function") {
if (dont_call)
tree = null;
else {
tree();
tree = this.trees[tree_id];
}
}
return tree;
};
// CUSTOMIZABLE EVENT HANDLERS; default action is "do nothing"
/**
* Third party code can override this member in order to add an event handler
* that gets called each time a tree item is selected. It receives a single
* string parameter containing the item ID.
*/
Zapatec.Tree.prototype.onItemSelect = function(item) {
doThis(item._id,item._name,item._layer,item._pNode);
};
//add wanglj
// GLOBAL EVENT HANDLERS (to workaround the stupid Microsoft memory leak)
/**
* \internal This is a global event handler that gets called when a tree item
* is clicked. Don't override! ;-)
*/
Zapatec.Tree.onItemToggle = function() {
var item = this;
var body = document.body;
while (item && item !== body && !/tree-item/.test(item.className))
item = item.parentNode;
Zapatec.Tree.all[item.__msh_tree].itemClicked(item.__msh_item);
};
Zapatec.Tree.onImgToggle = function() {
var item = this;
var body = document.body;
while (item && item !== body && !/tree-item/.test(item.className))
item = item.parentNode;
Zapatec.Tree.all[item.__msh_tree].imgClicked(item.__msh_item);
};
Zapatec.Tree.prototype.imgClicked = function(item_id) {
this.selectedItem = this.toggleItem(item_id);
if (this.config.hiliteSelectedNode && this.selectedItem)
Zapatec.Utils.addClass(this.selectedItem, "tree-item-selected");
};
/**
* \internal This is a global event handler that gets called when a tree item
* is assigned. Don't override! ;-)
*/
Zapatec.Tree.prototype.expandItem= function(item_id) {
var arg=item_id.split("|");
for(i=0;i<arg.length;i++){
if(arg[i]!=null&&arg[i]!=""){
var item = this.items[arg[i]];
if(item==null) continue;
Zapatec.Tree.all[item.__msh_tree].imgClicked(item.__msh_item);
}
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -