在没有警报的情况下处理时未初始化的变量

Uninitialized variable when processing without alerts

本文关键字:初始化 变量 处理 情况下 有警      更新时间:2023-09-26

我正在尝试用Javascript/jQuery/PHP构建一个日志读取器,它在ingrid表中显示文本文件的内容。

Javascript部分具有以下功能:

<script type="text/javascript">
$(function() {
  // Count number of lines in the log file
  var $anzahlElemente=0;
  $.countLines = function() {
    $.get("../log.log", function(text) {
      var $lines = text.split(/'r|'r'n|'n/);
      $anzahlElemente = $lines.length-1;
    });
  };
  // Generate table
  $.showTable = function() {
    $("#table1").ingrid({
      url: 'ingrid.php',
      height: 625,
      initialLoad: true,
      rowClasses: ['grid-row-style1','grid-row-style1','grid-row-style2','grid-row-style1','grid-row-style1','grid-row-style3'],
      sorting: false,
      paging: true,
      totalRecords: $anzahlElemente
    });
  }
$.countLines();
$.showTable();
});
</script>

现在的问题是,函数处理的顺序或顺序似乎有问题。在完成这两个功能之后,$anzahlElemente仍然为0。需要CCD_ 2来显示表格分页功能。

奇怪的是,当我尝试以下操作时,第一个警报显示"0",第二个警报显示正确的行数。如果没有警报,则缺少元素数量和分页功能。但有了它们,一切都正常工作,除此之外,我不想有这些警报。)

$.countLines();
alert($anzahlElemente);
alert($anzahlElemente);
$.showTable();

你需要所有其他部分吗,比如html、php、css和图像,或者你直接看到我的错误了吗?

编辑:我希望可以附加文件。我没有找到上传选项,所以我这样做了:ingrid.zip

这个问题是对如何执行涉及异步I/O的javascript代码的常见误解。在您的代码中,由于$.get是异步,在设置命名变量之前实际执行了showTable

您可以将代码更改为

var countLines = function(renderTable) {
    $.get("../log.log", function(text) {
      var $lines = text.split(/'r|'r'n|'n/);
      showTable($lines.length-1)
    });
};
// Generate table
var showTable = function(anzahlElemente) {
    $("#table1").ingrid({
      url: 'ingrid.php',
      height: 625,
      initialLoad: true,
      rowClasses: ['grid-row-style1',
                   'grid-row-style1',
                   'grid-row-style2',
                   'grid-row-style1',
                   'grid-row-style1',
                   'grid-row-style3'],
      sorting: false,
      paging: true,
      totalRecords: anzahlElemente
    });
}
$(function() {
  countLines(showTable);
});

以这种方式,CCD_ 4将仅在CCD_ 5成功时执行。

再详细一点。对countLines的调用实际上在对$.get的调用之前结束,在您的代码中,您在$.get调用执行回调之前执行对showTable的调用(匿名函数设置$anzahlElemente)。当您插入警报时,您正在更改时间,使对所述回调的调用有足够的时间执行。

尝试$.countLines().end().showTable();