在javascript中创建动态元素,并在创建节点后立即在UI上进行可视化
Create dynamic elements in javascript and visualize it on UI as soon as the node is created
我正在编写一个创建树的脚本。我面临的问题是,当大量数据到来时,它会被卡住一段时间,然后在最后渲染所有东西。
我想知道的是,有没有一种方法可以让它更具互动性。就像一个节点被制作出来,它就会在界面上弹出。
为了进入内部,我发布了我的代码。
function recursiveGenerateTree(objNode, parntSpan, ulContainer, objEditParam) {
var cntLi = 0;
var spnApplyClass;
var rdbValue;
var cntrList = 0;
for (cntLi = 0; cntLi <= objNode.NodeList.length - 1; cntLi++) {
objEditParam.rdbGroup = objEditParam.rdbGroup;
rdbValue = objEditParam.orgRootID + '_' + objNode.NodeList[cntLi].Id;
objEditParam.rdbValue = rdbValue;
objEditParam.selector = 'radio';
objEditParam.selector = '';
objEditParam.isNewNode = false;
addChild('', parntSpan, ulContainer, objEditParam);
$('#txtParent').val(objNode.NodeList[cntLi].Name);
spnApplyClass = $('#txtParent').parents('span:first');
$('#txtParent').trigger('blur', [spnApplyClass]);
spnApplyClass.removeClass('bgLime');
var li = spnApplyClass.parents("li:first");
li.attr("nodeId", objNode.NodeList[cntLi].Id);
li.attr("rootnodeId", objNode.NodeList[cntLi].RootOrgUnitId);
var ulPrsnt = objNode.NodeList[cntLi].NodeList;
if (ulPrsnt != undefined && ulPrsnt.length > 0) {
recursiveGenerateTree(objNode.NodeList[cntLi], spnApplyClass, '', objEditParam);
}
}
}
使用的第二个功能是添加子
function addChild(currentbtn, parentSpn, parentUl, objEditParam) {
var spnElement;
if ($(currentbtn).length > 0) {
var dvClick = $(currentbtn).closest('div').siblings('div.OrgGroupLists')
spnElement = $(dvClick).find('span.bgLime');
}
else {
spnElement = parentSpn;
}
if (spnElement.length == 0 && parentUl.length == 0)
return;
var crtUlChild;
if (spnElement.length > 0) {
var dvCurrent = $(spnElement).closest("div");
crtUlChild = $(dvCurrent).find('ul:first');
}
if (parentUl.length > 0) {
crtUlChild = parentUl;
}
if (crtUlChild.length == 0) {
var ulChildrens = createUl();
}
//Next line needs to be updated.
var spnImage = $(dvCurrent).find("span:first");
$(spnImage).removeClass("SpanSpace");
$(spnImage).addClass("L7CollapseTree");
var liChildrens = document.createElement("li");
$(liChildrens).attr("isNew", objEditParam.isNewNode);
$(liChildrens).attr("isTextEdited", false);
var dvChildrens = createDivNode(objEditParam);
$(liChildrens).append(dvChildrens);
if (crtUlChild.length == 0) {
$(ulChildrens).append(liChildrens);
$(dvCurrent).append(ulChildrens);
}
else {
crtUlChild.append(liChildrens);
}
}
如果需要更清楚地理解问题,请随时询问更多细节。
@nnnnnn的意思是在setTimeout中调用后续递归。我没有花时间尝试在本地复制您的代码。例如,请查看下面的JavaScript代码。setTimeout适用于下面的代码。您可以根据浏览器的不同改变变量j的长度。内部循环j用于阻塞JS线程。
<html><head>
<script>
var k = 0;
function recursiveTree(){
$("#holder").append("<div>Item</div>");
for(var j =0; j < 100000000; j++){
// blocking thread
}
if (k++ < 20) {
console.log(k);
setTimeout(function(){recursiveTree()},10);
}
}</script>
</head>
<body>
<div id='holder'></div></body>
</html>
我假设您使用的是JQuery。
只是为了确认您需要进行如下的递归调用
if (ulPrsnt != undefined && ulPrsnt.length > 0) {
setTimeout(function(){recursiveGenerateTree(objNode.NodeList[cntLi], spnApplyClass, '', objEditParam);},10);
}
相关文章:
- 使用导航属性创建Kendo UI网格模型的问题
- 如何在剑道UI中创建类转换效果
- 单击按钮创建多实例jQuery UI对话框
- 任何人都知道如何在asp.net telerik asp.net AJAX UI中创建自下而上的组合框
- 如何使用JavaScript在Android Studio中创建正确的UI
- 在我的选项卡jquery ui创建后回调
- 动态创建的 jQuery UI 对话框错误后 jQuery 2.2.0 升级
- 关闭动态创建的 jQuery-ui 对话框
- 如何使用 angularjs 使用 ngrepeat 和 bootstrap ui 创建分页
- 创建 UI 加载程序时的引导程序
- 使用AngularJS ui路由器创建类似弹出窗口的状态
- 如何在不创建数组的情况下使用NgFor来生成矩阵UI模式
- 在Javascript中创建自定义的可重用控件(Kendo UI)
- 如何在Jquery中使用kendo ui创建内联网格编辑
- 根据用户从jQuery UI可选下拉框中选择的内容创建链接
- jquery-ui-sortable在创建时修改html
- jquery ui自动完成combox重新创建选项不起作用
- 使用ui路由器在URL路由中创建一个必需的参数
- 在自动完成中为动态加载的内容创建UI
- 如何在Meteor 1.4中使用模板创建UI