【问题标题】:call function after div has been dynamically populated?div被动态填充后调用函数?
【发布时间】:2017-12-12 01:37:20
【问题描述】:

firebase.database().ref('zones').on('value', (snapper) => {
    //For each zone, populate HTML
    snapper.forEach((snap) => {
       var html = '<div id="child">Blahblah</div>';
       //Add the Injected HTML to the parent div called 'new'
       $("#parent").append(html);
    }
});
<!-- this is the parent div where I inject my HTML from JS -->

<div id="parent">

</div>

我有一个通过 Firebase 查询动态填充的 div。我的 firebase 查询检索我使用 $("#parent").append(html) 注入 HTML 的数据。

现在,一旦这个父 div 全部从 firebase 调用和 html 注入中填充,然后我想在该父 div 上运行一个函数 - 它基本上按数字对每个子 div 进行排序。

在运行我想要的函数之前,我似乎无法弄清楚如何等待父 div 完成填充。我知道由于异步操作,我的函数在父 div 甚至被填充之前运行,因此我的问题......

【问题讨论】:

  • 在任何循环等中显示您的实际代码,以便我们可以更好地帮助解决这个问题。注意 jQuery append() 的行为是同步的,因此您需要在此处提供有关在这种特殊情况下很重要的具体细节的更多信息。

标签: jquery html firebase asynchronous firebase-realtime-database


【解决方案1】:

既然您关心呼叫何时结束,为什么不使用.once(在docs 中找到)将读取数据并返回一次。这样,当它返回时,您就知道您拥有所有数据,然后可以对其进行排序

firebase.database().ref('zones').once('value').then(function(snapper) {
    //For each zone, populate HTML
    snapper.forEach((snap) => {
            var html = '<div id="child">Blahblah</div>';
            //Add the Injected HTML to the parent div called 'new'
            $("#parent").append(html);
    });
    // call sort function
});

【讨论】:

  • 我的想法也去了
  • 尝试这种方法,但该函数没有按预期对子 div 进行排序。我知道这个函数做了它应该做的,因为当我在开发工具的控制台中尝试它时,工作正常
  • 里面会不会多了一个}
  • 不走运,将继续调试:/
  • 在 forEach 之后你应该调用你的排序方法。 forEach 是同步的,所以当时所有的 div 都应该附加到 DOM(来自$("#parent").append(html);
【解决方案2】:

我不认为 jquery 中的 append 包含回调,因此您可能必须 将脚本放在要附加的 html 的末尾。

    html = html.append('<script>yourfunctiontorunattheend();</' + 'script>');

然后做:

    $("#parent").append(html)

编辑: 在 for 语句之后运行(参见 cmets):

string lcscript = '<script>yourfunctiontorunattheend();</' + 'script>'
for () {
 ...
}
$("#parent").append(lcscript);

【讨论】:

  • 我不认为这会起作用,因为我的追加基本上是在一个 for 循环内 - 所以对于我从数据库中检索的每个对象,我使用该对象添加 html 并附加到父 div .您的方法将为附加到我的 HTML 的每个对象添加一个脚本标记...不确定..?
  • 你想在for循环结束后在最后运行脚本吗?
  • 是的,for 循环将填充我的父 div。一旦整个过程完成,我想运行这个函数
  • 那么只需在 for 语句之后的最后附加
  • 这和在for循环之后直接调用函数有什么区别?也许我误解了 Firebase 的工作原理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2016-01-08
相关资源
最近更新 更多