Javascript 是否使用jQuery立即刷新DOM?

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>

我有一个外部JavaScript库来生成一些格式化的内容。我们称之为ExternalLibrary.GenerateGutterDivs

此代码生成一个带有一些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>