Javascript 是否使用jQuery立即刷新DOM?
我有一个外部JavaScript库来生成一些格式化的内容。我们称之为ExternalLibrary.GenerateGutterDivs 此代码生成一个带有一些div的表结构,类似于:Javascript 是否使用jQuery立即刷新DOM?,javascript,jquery,html,Javascript,Jquery,Html,我有一个外部JavaScript库来生成一些格式化的内容。我们称之为ExternalLibrary.GenerateGutterDivs 此代码生成一个带有一些div的表结构,类似于: <table> <tr> <td class="gutter"> <div>1</div> <div>2</div> <div>3</div>
<table>
<tr>
<td class="gutter">
<div>1</div>
<div>2</div>
<div>3</div>
...
</td>
<tr>
</table>
生成表后,我希望按如下方式操作生成的DOM对象:
<script type="text/javascript">
ExternalLibrary.generateGutterDivs();
alert("shomething"); //if I comment this I don't see the second alert
$("td.gutter > div").each(function(index, val)
{
alert("gutterfound");
});
</script>
问题是,如果我删除了第一个警报,那么我就看不到第二个警报。这使我们想到DOM可能并没有被及时刷新。你知道我为什么会遇到这种情况吗
感谢您的高级支持。MyCode.GenerateGutterDivs在jQuery代码片段被激发之前还没有完成DOM元素的生成。您需要修改MyCode.generateguttdivs以接受回调函数,类似于以下内容:
MyCode.GenerateGutterDivs(function() {
$("td.gutter > div").each(function(index, val) {
alert("gutterfound");
});
});
//inside MyCode
GenerateGutterDivs = function(callback) {
// Generate formatted content.
callback();
};
这里有一个概念证明:这是一个常见问题。您应该从MyCode.generateGutterDivs返回对div的引用,例如:
MyCode.generateGutterDivs = function () {
var safeReference = $("<div>1</div><div>2</div><div>3</div>")
.appendTo("td.gutter");
return safeReference;
};
然后:
编辑:由于修改库不是海报的选项,我认为设置超时0毫秒就可以了,让浏览器完成DOM更新:
<script type="text/javascript">
MyCode.generateGutterDivs();
setTimeout(function () {
divs.each(function(index, val)
{
alert("gutterfound"); // Should see 3 of these now
});
}, 0);
</script>
旁白:你不应该这样。你的猜测可能是正确的,但我不相信它是正确的。解决问题的最好方法不是让别人猜测,而是创建一个精简的测试用例。删除所有不影响问题的HTML、CSS和JS。然后再做一次,再做一次,直到你真的,真的没有多余的代码来混淆这个问题。如果您将该代码提供给其他人,他们可以快速重现您的问题,帮助您了解根本原因,并为您提供修复方案。通常,在解决问题的过程中,你会自己解决问题创建一个JSFIDLE:但在最坏的情况下:让GenerateGutterDiv接受回调,尽管现在我想,这可能无法解决问题。GenerateGutterDiv是一个外部库。我会调查我是否可以根据MIT许可证修改和发布它。谢谢您的帮助。此回调将具有相同的效果。。。它不会等到DOM完成更新。我不同意,我一直都在这样做。在某些情况下,它可能会正常工作,但如果您仔细想想,调用回调与返回有何不同?没有像在AJAX或事件处理程序中那样异步调用回调。@box0:谢谢您的帮助。问题是图书馆是外部的。我已经编辑了我的帖子。不管怎样,谢谢。这适用于100毫秒。但这似乎是一个危险的解决方案。我将包括一个安全时间,但我不太喜欢这个解决方案。是否有其他方法更新DOM?我的意思是,为什么不在中间刷新?代码是同步的,所以我不太明白发生了什么?
<script type="text/javascript">
MyCode.generateGutterDivs();
setTimeout(function () {
divs.each(function(index, val)
{
alert("gutterfound"); // Should see 3 of these now
});
}, 0);
</script>