【问题标题】:JavaScript HTML Rendering Out of Sync -- Spring MVC ProjectJavaScript HTML 渲染不同步 -- Spring MVC 项目
【发布时间】:2016-12-08 04:11:22
【问题描述】:

我正在开发一个仪表板站点,它使用 SpringMVC、FusionCharts 和 Bootstrap(提供架构概述)。当我新启动 Tomcat 服务器时,第一次为我提供索引页面时,按钮面板将无法正确呈现。我得到了正确数量的带有问号的白色圆圈,如 3 个 javascript 函数中的第一个。如果我刷新页面,预期的红色和绿色结果会立即出现,由第二个脚本函数生成。

作为序言,带有按钮的面板是正确生成的,具有正确的计数、正确的名称、正确的 HREF 和其他所有内容。在页面刷新之前颜色不会改变。回到这个项目最初构建的时候,数据是通过 http 请求服务器端收集的。它与现在发生的情况相当慢:从文件服务器端加载数据并以相同的格式发送。旧方法总是在等待 10 秒后生成正确的颜色和图标。现在,按钮保持空白,直到我刷新页面,然后我得到正确的结果。

我相信这只是两个 Javascript 函数相互踩踏的结果,尽管我知道 JavaScript 是单线程的。如果没有,我会很困惑和迷路。

索引.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Free Bootstrap Admin Template : Dream</title>
<!-- Bootstrap Styles-->
<link href="css/bootstrap.min.css" rel="stylesheet" />
<!-- FontAwesome Styles-->
<link href="css/font-awesome.css" rel="stylesheet" />
<!-- Morris Chart Styles-->
<link href="js/morris/morris-0.4.3.min.css" rel="stylesheet" />
<!-- Custom Styles-->
<link href="css/custom-styles.css" rel="stylesheet" />
<!-- Google Fonts-->
<link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css' />

<script type="text/javascript" src="js/fusioncharts/core/fusioncharts.js"></script>
<script type="text/javascript" src="js/fusioncharts/themes/fusioncharts.theme.fint.js"></script>


</head>
<body> 

...

<!-- this is where the button panel is correctly created on every load
     but only correctly modified on the 2nd load and later -->
<div class="row"> <div id="AppStatusTable"></div> </div>

...

<script src="js/jquery-1.10.2.js"></script>
<!-- Bootstrap Js -->
<script src="js/bootstrap.min.js"></script>
<!-- Metis Menu Js -->
<script src="js/jquery.metisMenu.js"></script>
<!-- Morris Chart Js -->
<script src="js/morris/raphael-2.1.0.min.js"></script>
<script src="js/morris/morris.js"></script>


<!-- Custom Js -->
    <!--
<script src="js/custom-scripts.js"></script>  -->
<script>

    $(document).ready(function(){
        $.get("/buttoninfo", function(data, status) {
            tableMaker(data, "AppStatusTable");
        });

        $.get("/appstatus", function(data, status) {
            appStatus(data);
        });

        $.get("/stackstatus", function(data, status) {
            stackUpdater(data);
        });

    });
</script>
</body>

最后 3 个函数填充面板的 html 以包含动态数量的按钮,修改这些按钮的内部 html,然后更新其他面板。第三个目前需要一段时间,并且总是产生正确的结果。我不怀疑这是问题所在。

dashboard.js

function templateLoader(appTag) {
    //$.get('/app/' + appTag);
    window.location = "/app/" + appTag;
}

function appStatus(data){

    for(var i = 0; i < data.length; ++i) {
        if(data[i][1] == "up"){
            $("#" + data[i][0] + "-appcheck").removeClass("btn-default");
            $("#" + data[i][0] + "-appcheck").addClass("btn-success");
            $("#" + data[i][0] + "-appcheck-icon").removeClass("fa-exclamation-circle");
            $("#" + data[i][0] + "-appcheck-icon").addClass("fa-check");
        } else if(data[i][1] == "down"){
            $("#" + data[i][0] + "-appcheck").removeClass("btn-default");
            $("#" + data[i][0] + "-appcheck").addClass("btn-danger");
            $("#" + data[i][0] + "-appcheck-icon").removeClass("fa-exclamation-circle");
            $("#" + data[i][0] + "-appcheck-icon").addClass("fa-close");
        }
    }
}

function tableMaker(data, tableID) {

    /* vars used below as the skeleton of the injected buttons*/

    var i = 0, j = 0, colLimit = 12;
    for(; i < data.length;){
        for (var j = 0; j < colLimit && i < data.length; ++j, ++i) {
            mytable +=  colStart + data[i][2] + titleEnd + '\n' + buttonStart + data[i][2] + buttonMiddle1 +
                    data[i][2] + buttonMiddle2 + data[i][2] + buttonMiddle3 + '><i id="' + data[i][2] +
                    buttonEnd + colEnd;
        }
    }

    panel += mytable + panelEnd;

    document.getElementById(tableID).innerHTML = panel;
}

function stackUpdater(data){
    for(var i = 0; i < data.length; ++i){
        var curStack = data[i][0];
        for(var j = 1; j < data[i].length; j++) {
            if(data[i][j] == null) {
                break;
            } else {
                $("#" + curStack + j).removeClass("progress-bar-info");
                if(data[i][j] == "up") {
                    $("#" + curStack + j).addClass("progress-bar-success");
                } else {
                    $("#" + curStack + j).addClass("progress-bar-danger");
                }
            }
        }
    }
}

我知道浏览器会缓存 javascript 函数的结果,但第三个函数会在每次刷新时运行,那么为什么前两个不是呢?那么,为什么第二个函数的结果只有在刷新后才会出现?

需要进行哪些更改才能确保在第一次加载此页面时正确修改按钮?

更新 1

在函数调用之间插入警报后,第一次尝试渲染就可以了,那么在没有这个的情况下确保同步的正确方法是什么?

Index.html 的底部:

    $(document).ready(function(){
        $.get("/buttoninfo", function(data, status) {
            tableMaker(data, "AppStatusTable");
        });

        alert("Button table made!");

        $.get("/appstatus", function(data, status) {
            appStatus(data);
        });

        alert("Button Data Updated!");

        $.get("/stackstatus", function(data, status) {
            stackUpdater(data);
        });

        alert("Stack Data Updated!");

    });
</script>

【问题讨论】:

  • 你不妨去掉这个问题。你已经完成了大量的代码转储。
  • 我不会在 70 行以下称其为庞大的,而且它的格式良好且易于阅读。一些 C++ 问题是 300 行垃圾,看在眼里。此外,说真的,没有想法?
  • 代码转储更多的是关于您分配与您的问题无关的东西。在您提出问题之前,您需要花时间将所有代码精简为最少量的代码,以证明您的问题。这和 Spring 有什么关系?
  • 这是最小的。我发布的只是在 html 页面上调用 JavaScript 的位置、正在使用的其他 javascript 库以及使用的顺序,以及我的 javascript 代码是什么。那是最小的。我不知道 Spring MVC 是否是问题的一部分,这就是我问它是否可能的部分原因。
  • 那里,修剪得够你吃士力架了吗?

标签: javascript java jquery html spring


【解决方案1】:

尝试使用缓存设置为 false 的 $.ajax,而不是使用 $.get。如果 $.get 是绝对必要的,请尝试为每个请求添加时间戳。您可以参考How to set cache: false in jQuery.get call

希望有所帮助。

【讨论】:

  • 我对为什么和如何做一样多。为什么这能解决问题?这不一定是必要的。我只是一个完整的 JavaScript 和 Web 开发新手,我正在努力充分利用一项任务。正如 JS 代码风格可能显示的那样,我来自后端背景。
  • 我已经通过在 appstatus 函数上放置 90 毫秒的延迟来实现临时修复。希望在修改 stackstatus 以从文件加载后,我可以更改函数调用顺序,并且这个竞争问题将自行解决。一旦它部署在 AWS 上,它也可能会自行解决,而且我们无论如何都会有传播延迟。
  • 不确定,但由于这 3 个函数正在 document.ready 事件中执行,并且每个函数都涉及带有回调的 ajax 调用,因此需要重新初始化回调。跨度>
  • 我一点也不精通JS,不知道你的意思是什么,非常感谢一个例子的链接。并感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 2020-09-17
  • 2016-02-16
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多