0

我正在尝试在 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仍然$anzahlElemente需要 0. 才能显示表格分页功能。

奇怪的是,当我尝试以下操作时,第一个警报显示“0”,第二个警报显示正确的行数。如果没有警报,元素的数量和分页功能就会丢失。但是有了它们,一切正常,除此之外我不想收到这些警报。;)

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

您是否需要所有其他部分,例如 html、php、css 和图像,或者您是否直接看到我的错误?

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

4

2 回答 2

2

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

您可以将代码更改为

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);
});

这样,只有在成功showTable时才会执行$.get

在更多细节。对 countLines 的调用实际上在调用 do 之前结束,$.get然后在您的代码中,您在$.get调用执行回调(匿名函数设置)之前执行对 showTable 的调用$anzahlElemente。当您插入警报时,您正在更改调用的时间表示回调有足够的时间执行。

于 2013-07-04T07:23:01.970 回答
0

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

于 2013-07-04T08:37:35.967 回答