JavaScript仅在函数已经运行一次后才起作用

JavaScript仅在函数已经运行一次后才起作用,javascript,json,Javascript,Json,我有一个脚本,它从json数据调用来显示在给定时间谁在网页上。我有一个函数,它在我的页面底部被调用过一次。 然后有一个计时器,每5秒调用一次 当代码最初运行时,不会发生任何事情。alertvisListHtml;是空的。但当它在计时器上运行时,tt工作正常 你知道是什么原因导致它在第一次运行时是空的吗?Google开发工具显示getJSON返回的数据。如果我在for循环中加入警报。每次都会很好地弹出 这只是它第一次运行,它什么也不做。visListHtml为空。 我有以下代码: var prev

我有一个脚本,它从json数据调用来显示在给定时间谁在网页上。我有一个函数,它在我的页面底部被调用过一次。 然后有一个计时器,每5秒调用一次

当代码最初运行时,不会发生任何事情。alertvisListHtml;是空的。但当它在计时器上运行时,tt工作正常

你知道是什么原因导致它在第一次运行时是空的吗?Google开发工具显示getJSON返回的数据。如果我在for循环中加入警报。每次都会很好地弹出

这只是它第一次运行,它什么也不做。visListHtml为空。 我有以下代码:

var prev_GetLiveVisitorList = "";
var visListHtml = '';
function GetLiveVisitorList() {

        $.getJSON('<?php echo $apiEndpoint; ?>?cmd=GetLiveVisitorList&rnd'+Math.random(), function (allStatusJSON) {

          for (i in allStatusJSON.websiteVisitor) {
                visipAddr   = allStatusJSON.websiteVisitor[i].visipAddr;
                vistime     = allStatusJSON.websiteVisitor[i].vistime;
                visLandingPage = allStatusJSON.websiteVisitor[i].visLandingPage;
                visRefPage = allStatusJSON.websiteVisitor[i].visRefPage;

                visListHtml += '<div class="media"><span class="avatar status-success"><img src="../assets/img/avatar/1.jpg" alt="..."></span><div class="media-body"><p><strong>'+visipAddr+'</strong><time class="float-right" datetime="2018-07-14 20:00">'+vistime+'</time></p><p class="fs-14 semibold">Landing page: '+visLandingPage+'</p><p>Reffered By: '+visRefPage+'</p></div></div>';

            }
        });

            alert(visListHtml);

            if (prev_GetLiveVisitorList != visListHtml) {
                document.getElementById("GetLiveVisitorList").innerHTML = visListHtml;
                prev_GetLiveVisitorList = visListHtml;
            }
     }  

我缩进了代码,并在代码中解释了正在发生的事情。在这两种情况下,第一次然后使用计时器都不起作用:

var prev_GetLiveVisitorList = "";
var visListHtml = '';
function GetLiveVisitorList() {
  $.getJSON('<?php echo $apiEndpoint; ?>?cmd=GetLiveVisitorList&rnd'+Math.random(), function (allStatusJSON) {
    for (i in allStatusJSON.websiteVisitor) {
      visipAddr   = allStatusJSON.websiteVisitor[i].visipAddr;
      vistime     = allStatusJSON.websiteVisitor[i].vistime;
      visLandingPage = allStatusJSON.websiteVisitor[i].visLandingPage;
      visRefPage = allStatusJSON.websiteVisitor[i].visRefPage;
      visListHtml += '<div class="media"><span class="avatar status-success"><img src="../assets/img/avatar/1.jpg" alt="..."></span><div class="media-body"><p><strong>'+visipAddr+'</strong><time class="float-right" datetime="2018-07-14 20:00">'+vistime+'</time></p><p class="fs-14 semibold">Landing page: '+visLandingPage+'</p><p>Reffered By: '+visRefPage+'</p></div></div>';
    }
  });

  /**
  * First time visListHtml is empty because AJAX call is happening async below this line
  * When you said using the timer works, it's not working, is showing the result of the first time well
  * but is not showing the result of the second real time
  **/
  alert(visListHtml);

  if (prev_GetLiveVisitorList != visListHtml) {
    document.getElementById("GetLiveVisitorList").innerHTML = visListHtml;
    prev_GetLiveVisitorList = visListHtml;
  }
}
visListHtml被初始化为空字符串,这是第一次显示,因为$.JSON正在异步运行,并且仍然没有数据 使用计时器,works right意味着visListHtml由第一个$.JSON调用填充,并显示该调用的结果,但不显示计时器触发的当前$.JSON 要修复它,您需要在$.JSON修改DOM或执行真正需要的操作之后使用visListHtml 希望这有助于:
嗯,我不认为这是一个dom就绪的问题,其他脚本可以在页面的不同部分上正常工作,无论是在这一位之前还是之后呈现。$.getJSON是异步的,因此您的警报在AJAX请求完成之前运行。将警报和使用visListHtml的代码放在$.getJSON回调函数中。此外,数据也在那里。如果我提醒它,它将在for循环中加载数据表单。在第一次运行代码时,它不会离开循环。谢谢Alex Kudryashev和Luca。有道理!!现在一切正常。。谢谢你,事情变得更清楚了。