繁体   English   中英

JSON 填充表的搜索功能

[英]Search function for JSON populated table

我正在尝试实现一个搜索功能,使用户能够搜索这个表,该表是从公共 api 的 JSON 填充的。

我的表:

<input type="text" id="myInput" onkeyup="searchPlayers()" placeholder="Search for player">
<table id ="player_info">
<tr>
<th>ID</th>
<th>Full Name</th>
<th>Team</th>
<th>Position</th>
<th>Current Price</th>
<th>Value Season</th>
<th>Cost Change from Start</th>
<th>Percentage selected by</th>
<th>Transfers In</th>
<th>Transfers Out</th>
<th>Total Points</th> 
<th>Points Per Game</th>
<th>Minutes</th>
<th>Goals Scored</th>
<th>Assists</th>
</tr>

从 JSON 填充表。 遍历 JSON 文件并为每个键创建一个新的表单元格。

request.onload = function() {
// Begin accessing JSON data here
var data = JSON.parse(this.response);

if (request.status >= 200 && request.status < 400) {

    var table = document.getElementById('player_info');

    data.elements.forEach(elements => {

    var tr = document.createElement('tr');
    tr.innerHTML = '<td>' + elements.id + '</td>' + 
        '<td>' + elements.first_name + '<p>' + '</p>' + elements.second_name + '</td>' + 
        '<td>' + elements.team_code + '</td>' + 
        '<td>' + elements.element_type + '</td>' + 
        '<td>' + elements.now_cost + '</td>' + 
        '<td>' + elements.value_season+ '</td>' + 
        '<td>' + elements.cost_change_start + '</td>' + 
        '<td>' + elements.selected_by_percent + '</td>' + 
        '<td>' + elements.transfers_in + '</td>' + 
        '<td>' + elements.transfers_out + '</td>' + 
        '<td>' + elements.total_points + '</td>' + 
        '<td>' + elements.points_per_game + '</td>' + 
        '<td>' + elements.minutes + '</td>' + 
        '<td>' + elements.goals_scored + '</td>' + 
        '<td>' + elements.assists + '</td>';

    table.appendChild(tr);
    });
}
//append_json(data);
console.log(data);
}

搜索玩家功能

function searchPlayers() {
  // Declare variables
  var input, filter, table, tr, td, i, txtValue;
  input = document.getElementById("myInput");
  filter = input.value.toUpperCase();
  table = document.getElementById("player_info");
  tr = table.getElementsByTagName("tr");

  // Loop through all table rows, and hide those who don't match the search query
  for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[0];
    if (td) {
      txtValue = td.textContent || td.innerText;
      if (txtValue.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else {
        tr[i].style.display = "none";
      }
    }
  }
}

有谁知道为什么这不起作用?

编辑:

使用本地下载的数据副本,我认为您的错误是这一行:

td = tr[i].getElementsByTagName("td")[0];

这是针对 PlayerId 列,而不是 PlayerName 列,应该是这样的:

td = tr[i].getElementsByTagName("td")[1];

看起来它现在可以工作了,但是您的过滤器需要一些改进才能考虑到非英语字符,例如Agüero中的Agüero 玩得开心,Fantasy API 是学习大量前端开发内容的好方法。

编辑2:

我把你的循环改成这样:

for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[1];
    if (td) {
      txtValue = td.innerText;
      if (txtValue.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "table-row";
      } else {
        tr[i].style.display = "none";
      }
    }
  }

我在显示的版本中添加了一个显示类型以确保它们得到更新,并且还删除了|| 从你的txtValue

txtValue = td.innerText;

原答案如下:

自从我显然使用 api 以来已经有几个赛季了。 您的 javascript 不一定有问题(尽管您的 HTML 表缺少theadtbody元素),因为我收到了 CORS 错误:

CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource

我没有时间弄清楚您需要在此处实施的解决方法,但是来自类似问题的这个答案可能会帮助您入门:

请求的资源上不存在“Access-Control-Allow-Origin”标头——尝试从 REST API 获取数据时

您最好执行我的旧应用程序所做的操作,因为此错误与尝试通过 AJAX 请求从远程资源获取数据有关,该资源具有网站所有者设置的 CORS 无访问权限。

您可以尝试使用上述方法解决它,但更好的解决方案是使用 PHP 或 .NET(或任何其他支持 CURL 或某种 HTTPGet 的后端语言)之类的东西在本地下载 json,然后使用 AJAX 访问本地 .json 文件。 还增加了更快的响应时间。 我会让它在 600 个左右的播放器 json 文件中循环并每隔一个小时将它们下载到磁盘上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM