【问题标题】:.innerHtml text updates during script execution脚本执行期间的 .innerHtml 文本更新
【发布时间】:2014-12-03 19:46:02
【问题描述】:

我对为什么在 javascript/jquery/ajax 执行期间无法获取文本更新感到困惑。

我有以下代码。

$("#updates").html("Collecting your team names.");
YourTeamFirst(YourTeam, TeamValue);

$("#updates").html("Collecting their team names.");
TheirTeamNext(TheirTeam, TeamValue);

$("#updates").html("Gathering ID's.");
setNames(TeamValue);

$("#updates").html("Setting Details.");
setChampRatios(TeamValue);

$("#updates").html("Setting Ratios.");
setChampKDRS(TeamValue);

$("#updates").html("Finished!");

示例函数(唯一出现的ajax在子函数中,实际的函数调用和文本更新在一个普通的JS函数中,没有ajax...)

function TheirTeamNext(TheirTeam, TeamValue) {
      $.ajax({
          url: "/PlayerLookUp/TheirRankedData",
          type: "POST",
          data: "IDList=" + T[i],
          dataType: "json",
          async: false,
          success: function (resp) {
                   //just boring logic
          },
          error: function (XMLHttpRequest, textStatus, errorThrown) {
              if (XMLHttpRequest.status == 0) {
                        alert("Issue with reaching Riot API server. Pleast contact an Admin.");
               }
          }
      });       
}

而唯一出现的就是“完成”(在脚本完成之后),为什么什么都不会出现呢?执行大约需要 10 秒,因此应在 innerHtml/Html 中弹出其他更新。我也尝试过使用document.getElementById("updates").innerHTML = ...,它也没有显示任何内容,然后当它完成时将显示“完成”文本。

每个函数都是 JQuery、Ajax 或 javascript,在我的 C# 控制器中来回执行一些操作,但我觉得文本更新仍应更新我的 innerHtml 文本,除非有一些我不知道的关于 innerHtml 的脚本内容/HTML...

另外:如果我在某处输入alert(),则会出现最新的文本更新。那么为什么只有警报中断或脚本执行结束才会更新/发布我的文本。我希望我的用户看到脚本的更新消息。

【问题讨论】:

  • 请发布一个完整的代码示例,以便我们看到您所做的一切。很可能您的所有 .html() 语句都在执行,但是太快了,除了最后一次更新之外什么都看不到。再说一次,没有代码它是卡片,但既然你说警报有效并且警报被阻止,那是我的猜测。
  • @j08691 如果问题类似于“传播”,那么现在肯定需要大约 10 秒,因为我执行 3rd 方 API 调用,每个调用需要 1-2 秒,而我正在做大约 20到目前为止。
  • 您应该在阻止浏览器的 UI 之前强制 UI 重绘,这意味着在 html() 方法调用和同步 ajax 之间。就是说,这是一个很不清楚的问题恕我直言
  • 那么您可以尝试:$("#updates").html("Collecting your team names.").prop('offsetHeight'); YourTeamFirst(YourTeam, TeamValue); 等等吗?或者更好,为什么不使用异步 ajax 请求来代替???
  • @A.Wolff 我试过了,但似乎没有用。如果你去这里:pastebin.com/GDXaymAb 我发布了它。这是完成的第二个函数,称为 verifyNames(哦,它不在 playerViews 中,仅供参考)

标签: javascript jquery html ajax innerhtml


【解决方案1】:

因为 ajax 是异步执行的。

如果您希望出现这样的文本,则需要在 ajax 函数中使用回调。

更新:因为您使用的是async: false,所以这种行为看起来很奇怪,但我不知道在您的情况下,javascript 和 jquery 如何准确处理 synchronous 调用。

一个修补程序建议是仍然向您的函数添加回调。 (注意这是一个非常混乱的解决方法,应该只是帮助您修复问题。

function YourTeamFirst(YourTeam, TeamValue, callback) {
    /* ... */
    $.ajax({
        /* ... */
        success: function (resp) {
            /* ... */
            callback();
        }
    });
}

然后在您的函数调用中添加匿名函数作为回调参数。在这些函数的主体中始终添加 .html() 以供下一个要执行的函数。

$("#updates").html("Collecting your team names.");

YourTeamFirst(YourTeam, TeamValue, function () {
    $("#updates").html("Collecting their team names.");
});

TheirTeamNext(TheirTeam, TeamValue, function () {
    $("#updates").html("Gathering ID's.");
});
/* ... */

【讨论】:

  • 我所有的 ajax 函数都设置为 async: false。而且这些语句在 ajax 之外,ajax 只会出现在我上面显示的文本旁边的函数内部,例如 setNames(TeamValue); 的函数内部(或者这无关紧要吗?)。
  • @Austin I have all my ajax functions set to async: false 你为什么不对这个声明本身提出质疑???
  • @Austin 很好,没有看到更多你的代码,我不能说更多。
  • @A.Wolff 因为我的文本更新不在 Ajax 函数内部,而是在普通 javascript 函数内部,这有关系吗?
  • @Austin 异步 ajax 确实很重要,因为一旦您进入其中的 ajax 调用,被调用的函数就被认为已完成。
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多