提问人:John Conor 提问时间:4/14/2023 最后编辑:John Conor 更新时间:4/15/2023 访问量:451
从 API 数据创建数据表 - javascript、JQuery、ajax
Create data table from API data - javascript, JQuery, ajax
问:
我正在尝试使用 javascript 中的 JQuery 从 API 创建一个表,我是该语言的新手,我不清楚如何访问从 .ajax 查询返回的数据。
在下面的代码中,我能够获取数据并在控制台中返回它,但是当我尝试将其设置为用于可视化的变量时,我收到错误:
"<a class='gotoLine' href='#65:39'>65:39</a> Uncaught ReferenceError: data is not defined"
我是否缺少将变量设置为可以在提取请求之外访问的内容的步骤?data
这是我的代码:
#HTML
<script src="script.js"></script>
<table>
<thead>
<tr>
<th>City</th>
<th>County</th>
<th>Percent Immunized</th>
</tr>
</thead>
<tbody id="vaxData">
#JS
$.ajax({
url: "https://health.data.ny.gov/resource/nvtm-yit2.json",
type: "GET",
data: {
"$limit" : 5000,
"$$app_token" : "aGFbKDOg0gCeCm2c9Od2EsFjL"
}
}).done(function(data) {
alert("Retrieved " + data.length + " records from the dataset!");
console.log(data);
return data
});
var vaxData = document.getElementById(data);
答:
您收到的特定错误与以下行有关:
var vaxData = document.getElementById(data);
因为这里没有数据变量。
您可能认为从完成的回调返回值会填充此变量,但事实并非如此,因为它位于不同的作用域中(您可以通过在调用前声明 var 数据来修复),并且它发生在不同的时间和上下文中。javascript 的执行不会等待完成的回调完成,而是在运行之前运行。对于这种事情,可以在 MDN 上找到更好的解释。$.ajax
var vaxData = document.getElementById(data);
alert("Retrieved " + data.length + " records from the dataset!");
此外,期望字符串而不是数组,就像从 API 返回的数据一样。document.getElementById()
若要解决此问题,可以在调用之前声明变量,并在 done 回调函数中执行表的更新。在下面的示例中,我使用了调用的 a 函数来执行此操作,并且调用了 .data
$.ajax
update_table
data
vaccination_data
另一个问题是表的 HTML 在您的示例中未完成。
var vaccination_data = [];
$.ajax({
url: "https://health.data.ny.gov/resource/nvtm-yit2.json",
type: "GET",
data: {
"$limit" : 5000,
"$$app_token" : 'your_app_token'
}
}).done(function(api_data) {
vaccination_data = api_data;
update_table();
});
var vaxData = document.getElementById('vaxData');
const cell_keys = ['city', 'county', 'percentcompletelyimmunized'];
function create_element(tag, attributes, children = []) {
const element = Object.assign(document.createElement(tag), attributes);
element.append(...children);
return element;
}
function create_row_element(item) {
return create_element(
'tr', {},
cell_keys.map( (key) => create_element('td', { innerHTML: item[key] }) )
);
}
function update_table() {
vaxData.innerHTML = '';
vaxData.append(...vaccination_data.map(create_row_element));
}
<table>
<thead>
<tr>
<th>City</th>
<th>County</th>
<th>Percent Immunized</th>
</tr>
</thead>
<tbody id="vaxData"></tbody>
</table>
编辑添加,此行:还使用称为闭包的东西来工作,以便完成的回调函数具有对变量的引用。vaccination_data = api_data;
vaccination_data
评论
"<a class='gotoLine' href='#52:1'>52:1</a> Uncaught ReferenceError: $ is not defined"
vaxData
评论