【问题标题】:javascript json hide empty rowsjavascript json隐藏空行
【发布时间】:2017-09-29 03:12:47
【问题描述】:

让我们先说我认为自己非常擅长处理已经存在的代码以满足我的需求,但在从头开始编写我自己的代码方面无论如何都不强。说了这么多,进入正题!

我正在使用 Google 表格来维护与我相关联的台球联赛的大量统计数据。

使用 Javascript/Jquery,我从工作表中提取数据,并且大部分情况下我可以根据自己的喜好对其进行格式化。但是,我遇到了一个问题,由于代码循环遍历行以从工作表中提取项目并解析为 JSON,因此它正在为比工作表上最长列短的列抓取空行。

这是我如何获取数据并对其进行格式化的示例:

// make JSON call to Google Data API
$.getJSON(url, function(data) {

    // Build the Table Headings for Teams
    var tmname = '';

    tmname += '<table class="table table-sm mb-0 tablesorter stand1">';
    tmname += '<thead>';
    tmname += '<tr>';
    tmname += '<th style="width: 50%;">Team Name</th>';
    tmname += '<th style="width: 50%;" class="text-right">Total Points</th>';
    tmname += '</tr>';
    tmname += '</thead>';
    tmname += '<tbody class="stand1">';

    // Build the Table Rows for Sunday Juniors      

    var sjt8 = '';
    // loop to build html output for 8 Ball Format
    var entrysjt8 = data.feed.entry;
    for (var i = 0; i < entrysjt8.length; i++) {
        sjt8 += '<tr>';
        sjt8 += '<td class="score1">' + entrysjt8[i]['gsx$sjt8name']['$t'] + '</td>';
        sjt8 += '<td class="text-right score1">' + entrysjt8[i]['gsx$sjt8point']['$t'] + '</td>';
        sjt8 += '</tr>';
    }

    var sjtlo = '';
    // loop to build html output for Laggers Option Format
    var entrysjtlo = data.feed.entry;
    for (var i1 = 0; i1 < entrysjtlo.length; i1++) {
        sjtlo += '<tr>';
        sjtlo += '<td>' + entrysjtlo[i1]['gsx$sjtloname']['$t'] + '</td>';
        sjtlo += '<td class="text-right">' + entrysjtlo[i1]['gsx$sjtlopoint']['$t'] + '</td>';
        sjtlo += '</tr>';
    }

    // Close the Tables
    var tbclose = '';
    tbclose += '</tbody>';
    tbclose += '</table>';

    // output html - Sunday Juniors     
    $('.sjt8').html(tmname + sjt8 + tbclose);
    $('.sjtlo').html(tmname + sjtlo + tbclose);
}); 

一旦数据被抓取,我只是将其注入到一个页面中,并通过对已定义类的 div 调用。

我尝试实现的一种解决方法是使用 jquery 函数隐藏空行,并尝试在加载文档后触发它。这只适用于刷新。它不适用于第一页加载。然后我在页面上添加了 500 毫秒的超时,它有点工作。用户看到它确实工作时会发生什么,但似乎大约十分之一的加载事件不会触发。这是代码:

console.log('Outside document ready handler ' + $('.test').length)
$(document).ready(function() {
    setTimeout(function() {
        $('table tbody.stand1 tr').filter(
            function(){
                return $(this).find('td').length == $(this).find('td:empty').length;
                }).hide();
    }, 500);
});

我一直在试图找到一个更好的解决方案,我在想如果有办法检查 JSON 字段的长度,如果为 null 或 =“”,那么我可以附加一个类要隐藏的样式,或直接追加 style="display: none;"。到目前为止,我在搜索中还没有偶然发现类似的东西。

我也对其他想法持开放态度。

如果您想了解我将这些数据用于什么目的,以及它的范围有多大,这里是所有排名都进入的页面: https://www.westmibcapl.com/leagues/standings/

【问题讨论】:

    标签: javascript jquery json google-sheets-api


    【解决方案1】:

    这里有一个示例解决方案https://jsfiddle.net/v7fkj7et/

    $('table tr').each(function(){
      var empty = true;
      $(this).find('td').each(function(){
        if($(this).text() != '')
          empty = false;
      });
      
      if(empty)
        $(this).hide();
    });
    td {
      border: 1px solid;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <table>
      <tr>
        <td></td>
        <td>2</td>
        <td></td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
      </tr>  
      <tr>
        <td></td>
        <td></td>
        <td>1</td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <tr>
        <td>1</td>
        <td></td>
        <td></td>
      </tr>
    </table>

    解决方案说明

    • 循环遍历所有tr 并设置一个值为true 的变量
    • 然后循环遍历每个td within each tr
    • 如果有td contains value,则将变量值更改为false
    • 检查variable value with the tr loop & 根据值隐藏tr (如果值为真则意味着所有td都是空的)

    替代解决方案

    在附加行检查值之前。

    var sjt8 = '';
    // loop to build html output for 8 Ball Format
    var entrysjt8 = data.feed.entry;
    for (var i = 0; i < entrysjt8.length; i++) {
      if( entrysjt8[i]['gsx$sjt8name']['$t'] != '' && entrysjt8[i]['gsx$sjt8point']['$t'] != '') {
        sjt8 += '<tr>';
        sjt8 += '<td class="score1">' + entrysjt8[i]['gsx$sjt8name']['$t'] + '</td>';
        sjt8 += '<td class="text-right score1">' + entrysjt8[i]['gsx$sjt8point']['$t'] + '</td>';
        sjt8 += '</tr>';
      }
    }
    

    希望这会对你有所帮助。

    【讨论】:

    • 这给了我类似的结果。我必须在页面加载后运行它,延迟 500 毫秒才能删除行。我正在寻找一种解决方案来在页面加载之前隐藏它们,或者根本不加载空行。非常感谢您抽出宝贵时间提供帮助 :)
    • @WayneBaker 最好的解决方案是不要附加空行。在追加行时检查空行并跳过它们追加。 据我所知,在页面加载之前隐藏表格是不可能的。
    • 这就是我有点模糊的地方。我不知道如何跳过空行而不追加它们。
    • 这绝对是完美的,我很惭愧它是如此简单。我刚刚用 if 语句更新了整个网站。非常感谢您的帮助。
    • @WayneBaker 欢迎好友:)
    猜你喜欢
    • 1970-01-01
    • 2023-02-14
    • 2019-10-05
    • 2012-10-28
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多