我正在遵循这种方法来扩展和折叠客户端 JavaScript 中的所有节点:http ://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html
但是,处理这个需要很长时间,在展开然后折叠之后,我得到“脚本无响应”错误,所以我想知道是否有办法为相当大的树加快速度?有没有更好的方法来解析它?目前,这棵树有 4 层深。
谢谢。
我正在遵循这种方法来扩展和折叠客户端 JavaScript 中的所有节点:http ://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html
但是,处理这个需要很长时间,在展开然后折叠之后,我得到“脚本无响应”错误,所以我想知道是否有办法为相当大的树加快速度?有没有更好的方法来解析它?目前,这棵树有 4 层深。
谢谢。
首先使用 获取您的节点yourtreeViewInstance.get_nodes()
,然后是子节点eachChildNode.get_nodes()
,依此类推。
然后,您可以通过调用.set_expanded(true);
要扩展的每个节点来扩展每个项目。
我通过异步展开和折叠树来解决“脚本无响应”错误。此外,我从底部展开(因此您可以看到节点展开)并从顶部折叠,但仅当它到达每个分支中的最后一个节点时,因此在视觉上它对用户来说更有趣。他们实际上可以看到它的发生,如果它不快(IE7 和之前的版本特别慢),至少在他们等待的时候很有趣。
var treeView, nodes;
function expandAllNodesAsynchronously() {
if (<%= expandedLoaded.ToString().ToLower() %>) {
treeView = $find("<%= tv.ClientID %>");
nodes = treeView.get_allNodes();
if (nodes.length > 1) {
doTheWork(expandOneNode, nodes.length);
}
return false;
} else
return true;
}
function expandOneNode(whichNode) {
var actualNode = nodes.length - whichNode;
if (nodes[actualNode].get_nextNode() == null) {
nodes[actualNode].get_parent().expand();
}
}
function collapseAllNodesAsynchronously() {
treeView = $find("<%= tv.ClientID %>");
nodes = treeView.get_allNodes();
if (nodes.length > 1) {
doTheWork(collapseOneNode, nodes.length);
}
}
function collapseOneNode(whichNode) {
if (nodes[whichNode].get_nextNode() == null && nodes[whichNode].get_parent() != nodes[0]) {
nodes[whichNode].get_parent().collapse();
}
}
function doTheWork(operation, cycles) { //, callback
var self = this, // in case you need it
cyclesComplete = 1,
batchSize = 10; // Larger batch sizes will be slightly quicker, but visually choppier
var doOneBatch = function() {
var c = 0;
while(cyclesComplete < cycles) {
operation(cyclesComplete);
c++;
if(c >= batchSize) {
// may need to store interim results here
break;
}
cyclesComplete++;
}
if (cyclesComplete < cycles) {
setTimeout(doOneBatch, 1); // "1" is the length of the delay in milliseconds
}
else {
// Not necessary to do anything when done
//callback(); // maybe pass results here
}
};
// kickoff
doOneBatch();
return null;
};