【问题标题】:AJAX Refresh Blinks ScreenAJAX 刷新闪烁屏幕
【发布时间】:2015-10-19 20:34:21
【问题描述】:

我有一个应用程序,它有一个状态屏幕,该屏幕旨在始终显示在组织的各个地方。可能有 50 个不同的用户向其中输入不同的数据,状态屏幕每 10 秒更新一次新信息。它几乎是流经流程的小部件的跟踪板。

目前,我每 10 秒刷新一次,清空所有 div,然后循环通过活动小部件并将它们放置在每个它们应该去的地方,并根据状态和类似的东西设置颜色代码。但是,从 javascript 清空 div 到重新填充时,只有几分之一秒的时间,老实说,这很烦人。

我的问题是如何最好地更新没有闪烁的状态屏幕,内容只是清空并根据需要弹出。

我最初的想法是有一种方法可以“冻结”屏幕 2 秒钟,让它在后台重写,然后解冻,这样就不会眨眼了。

或者,这会更酷得多,这就是我只更新在 10 秒间隔内更新的部分的方式。因此,如果一个小部件从暂存区域进入成型,它会淡出暂存并淡入成型,并且不会触及其他 div。这会很酷,因为我可以通过这种方式添加一些动画。但是,我不确定如何“有效”地做到这一点。也许我有一个“活动数组”来存储所有内容,然后 AJAX 拉出一个新数组并在两者不匹配的地方执行更改?

无论如何,我想知道是否有屏幕冻结、在后台更新答案以及是否有类似第二个描述的情况。

对不起小说=(

【问题讨论】:

  • 我没时间看小说:P 请准确

标签: javascript php jquery ajax refresh


【解决方案1】:

这种闪烁或闪烁效果是 ajax 异步行为的结果。

发生的情况是您的 div 正在清空,但您的新数据尚未准备好填充它们。

解决方案是将 div 的清空和重新填充放在一个回调中,该回调传递给您的 ajax 请求的成功完成。

【讨论】:

  • 太棒了。为什么我没有考虑清楚。我在想这更多的是cpu处理时间而不是服务器延迟。我会试一试,因为我很容易尝试。
  • 要获得更流畅的结果,请参阅我对 documentFragmentreplaceChild 的评论
  • 呸,没用。将我的 ClearScreen 函数添加到 AJAX 的成功部分。将刷新和清除移动到完成而不是成功是否重要?
  • 我已经进行了更改并且有一段时间没看,但眨眼消失了。我想知道我是否没有将新页面加载到服务器上,或者我是否需要硬刷新页面,但这解决了它。我没有将它移到 AJAX 调用的完整部分,只是成功了。我敢肯定这里的其他解决方案会起作用,我仍然会尝试这样我可以获取动画,但那可能是 1.2 版 o.O
【解决方案2】:

我认为当您在重新填充之前清除所有数据时会出现很多问题。

您可以尝试两种方法来解决此问题。

解决方案 1 当你得到你的新结果时,构建一个 html 字符串。在循环中执行此操作,每次添加到字符串变量,然后用新的 html 替换“包装器”div 的 html。你可以让它变得花哨,也可以进行淡入/淡出。

var htmlString = '';
for(var i=0; i < jsonReturn.length; i++)
{
    htmlString += "<p>" + jsonReturn[i].data + "</p>";
}

$('#wrapper-div").empty().append(htmlString);

解决方案 2 提供基于您正在重新填充的数据中的 id 值的 html id。这将相当复杂,但它可以让您单独更新显示中的单个项目或仅在它们发生更改时更新。

<p id="data-spot-<?php echo $data['id']; ?>">Some display data</p>

然后在你的javascript中你会做

for(var i=0; i < jsonReturn.length; i++)
{
    $('#data-spot"+jsonReturn.id).empty().append("Some html string or data");
}

【讨论】:

  • 我真的希望 #2 成为我的最终游戏,因为它具有淡入淡出的美感,但你是对的,这将变得更加困难。这将是以后的优化。我会回到这里并在我这样做的时候发布它。我认为选项一是它所在的位置。不知道为什么我没想到!!!
  • 使用解决方案 1 - 使用文档片段和 replaceChild 方法要好得多 - 这样您可以在不影响当前视觉效果的情况下构建屏幕在片段中的外观,并替换整个一个比使用 innerHTML 快得多,或者上帝禁止 jQueery .html()
  • 如果他使用解决方案 1,淡入淡出效果将大大减轻执行 innerHTML 的速度。此外,编辑我的代码以正确的 jquery 方式执行 .html()。
  • 我想你在上面。这听起来会是最流畅的,不用担心延迟或 CPU 时间。不过,由于状态屏幕相当复杂,因此我需要一点时间来试一试。现在我拉出所有小部件,然后使用 if 语句将每个小部件放在一个循环中。这种方法希望我遍历每个着陆区,然后查看是否应该有一个小部件。所以我必须颠倒我认为的逻辑
  • jquery.html() 仍然比 innerHTML 慢 6 倍 - 并且 documentFragment 仍然更快 (5%)
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多