等到上一个.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 + " "; 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()}}');