i++ 从 JavaScript for 循环传递到 jQuery(document).ready(function() { 在遍历数组时不用作动态索引

i++ passed from JavaScript for loop to jQuery(document).ready(function() { not working as dynamic index when iterating over the array

提问人:ja_him 提问时间:10/17/2018 更新时间:10/17/2018 访问量:372

问:

对于我的罪过,我不是全职的 JavaScript 从业者,但我正在尝试。这是我尝试的广告管理命名空间的简化版本,它使用 Google 发布商代码 API

slots是 返回的 GPT 槽数组,设置在 head 中,它试图通过将其推迟到 jQuery 来定位仅存在于 CMS HTML 渲染后的 div。googletag.defineSlot(

我该怎么做:

var i;
for (i=0;i<slots.length;i++) {
    jQuery(document).ready(function() { 
        jQuery('#ads').append('<div id="'+slots[i].getSlotElementId()+'"></div>');
    });
}

...带有动态,因为当我调试它时,我看到我不能像这样传递,只能传递硬编码的索引。ii

这在以下范围内有效:jQuery(document).ready(function() {

console.log('adManager.all_devices.button.slots[3].getSlotElementId());

这会导致未定义的错误:

console.log('adManager.all_devices.button.slots[i].getSlotElementId());

我一直在阅读(诚实),但我很困惑。委婉地说,这是怎么回事,我该如何解决?

JavaScript jQuery 命名空间 google-publisher-tag

评论

1赞 Pointy 10/17/2018
为什么不直接在处理程序函数中移动循环呢?
0赞 ja_him 10/17/2018
为什么呢?我的意思是,如果这是正确的做法,那么我全力以赴,但我很好奇为什么它需要这样,有没有一个术语可以描述这一点?
1赞 Pointy 10/17/2018
代码的问题在于,每个单独的“就绪”处理程序回调函数共享相同的变量。换句话说,每个函数都引用了您声明的相同函数。给定的单个变量只能保存一个值。还有其他方法可以修复它,但在这种情况下,我不明白为什么您无论如何都要设置所有这些单独的“就绪”处理程序。iivar i;
0赞 ja_him 10/17/2018
好的,很酷,谢谢。我可以搜索什么来阅读更多关于它们为什么/如何共享相同变量的信息?我看到了你在我的代码中描述的内容,但我想了解更多(这对我来说似乎还不合逻辑)i
1赞 Pointy 10/17/2018
这是一个较旧的 Stackoverflow 帖子,其中包含大量信息。

答:

3赞 MysterX 10/17/2018 #1

你的结构是错误的。您需要附加一次侦听器,然后在回调中执行循环。如下:ready

  jQuery(document).ready(function() {
    for (var i=0;i<slots.length;i++) {
        jQuery('#ads').append('<div id="'+slots[i].getSlotElementId()+'"></div>');
    }
  });

评论

0赞 ja_him 10/17/2018
为什么有必要这样做?有没有一个术语可以描述为什么我以我的方式制造问题?
0赞 MysterX 10/17/2018
因为侦听器是异步的,但循环是同步的。我没有时间解释这么广泛的主题readyfor
1赞 Andy 10/17/2018
另一个更简单的原因是,您只需要检查文档是否已准备就绪一次。它的回调用于包含要运行的其余代码。
0赞 ja_him 10/17/2018
@Andy这是一个单独的原因?或者这是MysterX上面给出的部分原因吗?我的意思是,正如你所说,在document.ready上循环是没有意义的,我明白了,但另外,使用那里不起作用的原因是jQuery在文档准备就绪时对函数进行排队,并且不会接受异步系统中的同步内容。是吗?i
0赞 ja_him 10/17/2018
好的,我会花一些时间通读这篇文章,然后从那里探索