在 Javascript 中 for 循环的每次迭代中调用该函数


function myFunction(xml) {
var i;
var xmlDoc = xml.responseXML;
var table =
"<tr><th>Title</th><th>Author</th><th>Cover Page</th><th>Ratings</th></tr>";
var x = xmlDoc.getElementsByTagName("best_book");
for (i = 0; i < x.length; i++) {
bookname = x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;
authorname = x[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
table +=
"<tr><td class='book'>" +
bookname +
"</td><td class='author'>" +
authorname +
"</td><td>" +
"<img src='" +
x[i].getElementsByTagName("image_url")[0].childNodes[0].nodeValue +
"' height='100px' width='70px'>" +
"</td><td>" +
"<div class='stars' data-rating='1'>" +
"<span class='star'>&nbsp;</span>" +
"<span class='star'>&nbsp;</span>" +
"<span class='star'>&nbsp;</span>" +
"<span class='star'>&nbsp;</span>" +
"<span class='star'>&nbsp;</span>" +
"<input type='button' value='Add Rating' onClick = 'submitRating()'>" +
"</div>" +
"</td></tr>";
console.log(bookname);
}
document.getElementById("result").innerHTML = table;
}
async function submitRating() {
try {
let boo = bookname;
console.log(boo);
let auth = authorname;
console.log(auth);
let rat = 5;
console.log(rat);
let data = JSON.stringify({
author: auth,
book: boo,
rating: rat
});
console.log(data);
let res = await fetch(hostUrl + "api/ratings", {
method: "POST",
body: data,
headers: {
"Content-Type": "application/json"
}
});
console.log(res);
res.json().then(matter => {
console.log(matter);
});
// let myJson = res.json();
// console.log(myJson);
if (res.status == 200) {
console.log("the status is " + res.status);
} else {
console.log("the status is " + res.status);
alert("rating not given");
}
} catch (error) {
console.log("Error:" + error);
}
}

我正在尝试在 for 循环的每次迭代中调用submitRating函数, 但我在JavaScript中没有得到正确的方法。 现在,在运行循环后,onclick = submitRating()函数仅提交mongodb中的最后一个值。 有人可以帮我解决这个问题吗?

这是因为booknameauthorname保留由 for 循环的最终迭代设置的最后一个值。换句话说,这些变量只是被多次覆盖,直到 for 循环结束。如果要按项目存储这些信息,可以将它们存储在 HTML5data-属性中,并在 onclick 处理程序中检索它们。

例如,您可以执行以下操作:

"<input type='button' value='Add Rating' data-bookname='"+bookname+"' data-authorname='"+authorname+"' onClick='submitRating(this)' />"

然后,在您的submitRating方法中,您可以使用Element.dataset简单地读取信息:

async function submitRating(el) {
const bookname = el.dataset.bookname;
const authorname = el.dataset.authorname;
// More logic here
}

最新更新