请按照我的解释和问题在下面找到代码:
我正在使用 myjson.com 生成 12 个"结果"。这些"结果"由 12 个客户端组成,所有这些客户端都有不同的关联数据位。例如
客户端 1: 名字 - 詹姆斯,
地址 - 1234枫树街
客户端 2: 名字 - 杰克,
地址 - 4321 Lorem Ipsum Lane(洛雷姆伊普苏姆巷(
我的问题: 如何在 JavaScript 和 Ajax 请求中使用 For 循环在 HTML 中填充以下 12 篇文章?
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>*
` const Employees = (function () {
let displayStudent = document.querySelector('.photo');
let name = document.querySelector('.name');
let email = document.querySelector('.email');
let phone = document.querySelector('.phone');
let streetAddress = document.querySelector('.streetAddress');
let city = document.querySelector('.city');
let state = document.querySelector('.state');
let zip = document.querySelector('.zip');
const ajaxCall = function () {
let hr = new XMLHttpRequest();
let url = 'https://api.myjson.com/bins/zfhmr'; //https://randomuser.me/api/
// myjson.com
hr.onreadystatechange = function () {
if (hr.readyState === 4) { //ajax is complete
if (hr.status === 200) { //successful network exchange
let myObj = JSON.parse(hr.responseText);
for(let i = 0; i < myObj.length; i++) {
displayStudent.src = myObj.results[0].picture.large;
name.innerHTML = myObj.results[0].name.first + " " + myObj.results[0].name.last;
}
console.log(myObj[i]);
/*
email.innerHTML = myObj.results[0].email;
phone.innerHTML = myObj.results[0].phone;
streetAddress.innerHTML = myObj.results[0].location.street;
city.innerHTML = myObj.results[0].location.city;
state.innerHTML = myObj.results[0].location.state;
zip.innerHTML = myObj.results[0].location.postcode;
*/
}
} else {
console.log("ajax error: " + hr.response);
}
};
hr.open("GET", url, true);
hr.send();
console.log(hr);
};
return {
init: function () {
ajaxCall();
}
};
}());
Employees.init(); `
我当时只用一个客户端填充多篇文章时遇到问题。任何帮助都非常感谢!
谢谢
当我检查您的JSON
响应时,我在您的代码示例中看到了一些奇怪的东西。
您的json
响应如下所示...
{
"results": [...]
}
您的 for 循环如下所示...
let myObj = JSON.parse(hr.responseText);
for(let i = 0; i < myObj.length; i++) {
displayStudent.src = myObj.results[0].picture.large;
name.innerHTML = myObj.results[0].name.first + " " +
myObj.results[0].name.last;
}
因此,在您的代码中,您尝试循环一个对象(甚至不包含
.length
属性(,在这种情况下myObj
不是数组列表。myObj.results[0]
总是返回第一个结果。
溶液
您应该在for
循环中动态注入html
元素。
<!-- In your HTML file -->
<div id="articleContainer"></div>
// In your javascript ajax response (success)
if (hr.readyState === 4 && hr.status === 200) { // ajax is complete and successful network exchange
let container = document.querySelector('#articleContainer');
let strArticles = "";
let myObj = JSON.parse(hr.responseText);
for(let i = 0; i < myObj.results.length; i++) {
let resObj = myObj.results[i];
strArticles += '<article>' +
'<img class="photo" src="' + resObj.picture.large + '" height="100" width="100">' +
'<hgroup>' +
'<h1 class="name">' + resObj.name.first + ' ' + name.last + '</h1>' +
'<h2 class="email">' + resObj.email + '</h2>' +
'</hgroup>' +
'</article>';
}
// Inject the string html into the container parent element.
container.innerHTML = strArticles;
}
希望这对你有用:)
你的 'i' 变量超出了你的 for 循环的范围,并且不嵌套 if 语句。此外,如果您尝试用数据填充重复的 HTML 片段,您可能需要考虑使用模板并将其吐出,而不是使用选择器查询所有单个元素。
const Employees = (function() {
let displayStudent = document.querySelector('.photo');
let name = document.querySelector('.name');
let email = document.querySelector('.email');
let phone = document.querySelector('.phone');
let streetAddress = document.querySelector('.streetAddress');
let city = document.querySelector('.city');
let state = document.querySelector('.state');
let zip = document.querySelector('.zip');
const ajaxCall = function() {
let hr = new XMLHttpRequest();
let url = 'https://api.myjson.com/bins/zfhmr'; //https://randomuser.me/api/
// myjson.com
hr.onreadystatechange = function() {
if (hr.readyState === 4 && hr.status === 200) { //ajax is complete
//successful network exchange
let myObj = JSON.parse(hr.responseText);
for (let i = 0; i < myObj.length; i++) {
displayStudent.src = myObj.results[0].picture.large;
name.innerHTML = myObj.results[0].name.first + " " + myObj.results[0].name.last;
console.log(myObj[i]);
/*
email.innerHTML = myObj.results[0].email;
phone.innerHTML = myObj.results[0].phone;
streetAddress.innerHTML = myObj.results[0].location.street;
city.innerHTML = myObj.results[0].location.city;
state.innerHTML = myObj.results[0].location.state;
zip.innerHTML = myObj.results[0].location.postcode;
*/
}
} else {
console.log("ajax error: " + hr.response);
}
};
hr.open("GET", url, true);
hr.send();
console.log(hr);
};
return {
init: function() {
ajaxCall();
}
};
})();
Employees.init();
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
<article>
<img class="photo" height="100" width="100">
<hgroup>
<h1 class="name"></h1>
<h2 class="email"></h2>
</hgroup>
</article>
一个扩展将是:
// blah blah blah ajax call blah blah blah fetch, blah blah blah something else that brings me data
//data comes back as something to iter through
var data = [{
email: 'something'
}, {
email: 'something2'
}, {
email: 'blah'
}, {
email: 'blah2'
}, {
email: 'blah blah'
}, {
email: ':o blah'
}]
data.forEach(item => {
var div = document.createElement('div')
div.innerHTML = `<div>some fancy box//// ${item.email} \\\some more facy box</div>`
document.body.appendChild(div);
})