等到上一个.append()完成
我们怎样才能使append
等待直到前一个append
完成。 我附加了大量数据,因此当前附加应检查先前的附加是否完整。 我能够通过给予所有附加物独立一些时间延迟来做到这一点。 但实际上根据我的代码我可能有’n’个附加,所以我想动态地这样做。
我尝试使用for或while循环,但脚本损坏,浏览器崩溃,因为下一个追加是在上一个追加完成之前开始的。
$('#printall1').click(function() { $('#fourElementsonly').empty(); var cleartable = 0; var maxlimit = 0; var presentarraycount = 0; $.post("/PortalUserReport/getjunkdata", null, function(response, status) { var report = eval(response); var totalRecordsCount = report.length; //6000 var totalRecordsCountfortheLoop = totalRecordsCount; var arraycount = Math.ceil(totalRecordsCount / 1000); var reports = new Array(arraycount); // reports[6] for (var i = 0; i < arraycount; i++) { $('#fourElementsonly').append('
'); } reports[presentarraycount] = ""; $.each(report, function(x) { if (cleartable == 0) { for (var i = 0; i < arraycount; i++) { $('#Portal_User_elements' + i).empty(); } cleartable++; } if (recordnumber <= totalRecordsCountfortheLoop) { reports[presentarraycount] += " " + recordnumber + " Name :" + report[x].FirstName + " UserName :" + report[x].UserName + " Company : " + report[x].Company + " "; reports[presentarraycount] += " Registration Date : User CN : " + report[x].UserCN + " Status: " + report[x].Status + " "; reports[presentarraycount] += " User Privilege : " + report[x].Privileges + " "; maxlimit++; if (maxlimit == 1000) { presentarraycount++; reports[presentarraycount] = ""; maxlimit = 0; } } recordnumber++; }); for (var i = 0; i < arraycount; i++) { $(this).delay(1000, function() { $('#Portal_User_elements' + i).append(reports[i]); }); } }); });
不幸的是,jQuery append()
函数不包含回调。 没有办法真正检查它的完成情况,因为它应该立即发生。
有关如何有效使用追加的一些信息, 请参阅此处 。 它的重点是你可以尝试将所有文本都放到一个变量中,然后只使用一次追加。
[更新]因为你在get Go中拥有JSON对象中的所有数据,所以只需循环遍历并将其全部放入变量中,然后在完成后添加。 [/更新]
我可以给你一些关于如何改进代码的提示。
for (var i = 0; i < arraycount; i++) { $('#fourElementsonly').append('
'); }
可以变成:
var html = ''; for (var i = 0; i < arraycount; i++) { html += '
'; } $('#fourElementsonly').append(html);
你会完成:
- ‘#fourElementsonly’少了999个jquery选项
- 如果在类“portUserElements”中放入样式,则需要注入较少的代码:
边界崩溃:崩溃; 宽度:800像素; 保证金:0像素; 填充:0像素; 边框颜色:黑
这意味着您还可以:
for (var i = 0; i < arraycount; i++) { $('#Portal_User_elements' + i).empty(); }
成为(不为循环!):
$('.portalUserElements').empty();
和:
for (var i = 0; i < arraycount; i++) { $('#Portal_User_elements' + i).append(reports[i]); }
可能成为:
$('.portalUserElements').each( function(i) { $(this).append(reports[i]); } );
编辑 :建议进行这些更改以提高算法性能,同时保持其提供的完整function。
您可能希望压缩单个字符串变量(包括表)中的所有内容并将其追加到最后。
在他的一个答案中查看Russ Cam建议你的文章。
一种笨重的方式……
一个函数(现有函数)处理所有附加。 跟随追加的代码包含在一个新函数“kickOffTheRestOfTheProcess”中。
完成所有初始附加后,添加一个最终附加。 它将不会被执行直到所有其他人。
$('body')).append("");
它对我有用。
基于animuson的答案,我发现这个解决方案非常优雅……
$(".selector").append(content).append(function() { //code goes here to run });
非常简单 :)
使用何时function。
$('Here').appendTo("body"); $.when( $("#appendedItem").length > 0).then(function(){ console.log( $("#appendedItem").length ); });
您是追加到不同的元素还是单个元素? 如果要附加到单个元素,则可能更容易连接所有数据并作为一个块追加。
此外,数据来自哪里? 如果数据是静态的(非ajax),那么你应该可以调用
$('selector').append(data1).append(data2).append(data3);
也许另一种方法可能是简单地检查您要追加的容器的innerHTML的长度是否等于轮询函数中最后一块内容的长度。
如果不附加,如果这样追加。
以下解决方案适用于所有浏览器,尤其是IE6。 Firefox中的响应时间为10秒,但在IE6中则为2分30秒。
$('#printall1').click(function() { $('#fourElementsonly').empty(); var cleartable = 0; var maxlimit = 0; var presentarraycount = 0; $.post("/PortalUserReport/getjunkdata", null, function(response, status) { var report = eval(response);// we have 6000 records in the report now var totalRecordsCount = report.length; // count = 6000 var totalRecordsCountfortheLoop = totalRecordsCount; var arraycount = Math.ceil(totalRecordsCount / 1000); var reports = new Array(arraycount); // reports[6] for (var i = 0; i < arraycount; i++) { $('#fourElementsonly').append('
'); } reports[presentarraycount] = ""; $.each(report, function(x) { if (cleartable == 0) { for (var i = 0; i < arraycount; i++) { $('#Portal_User_elements' + i).empty(); } cleartable++; } if (recordnumber <= totalRecordsCountfortheLoop) { reports[presentarraycount] += " " + recordnumber + " Name :" + report[x].FirstName + " UserName :" + report[x].UserName + " Company : " + report[x].Company + " "; reports[presentarraycount] += " Registration Date : User CN : " + report[x].UserCN + " Status: " + report[x].Status + " td> "; reports[presentarraycount] += " User Privilege : " + report[x].Privileges + " "; maxlimit++; if (maxlimit == 1000) { presentarraycount++; reports[presentarraycount] = ""; maxlimit = 0; } } recordnumber++; }); for (var i = 0; i < arraycount; i++) { $('#Portal_User_elements' + i).append(reports[i]); } }); });
建立在上面的家伙的答案我做了角度:
el.append('random stuff').append('{{randomFunction()}}');