我有这段代码,当按下第一个按钮时,它基本上消耗了一个API,并将数据放入表中。
数据内容的每一行都有一个按钮,以“收藏”该行并将其放入localStorage中,从而生成引用api对象的id值的keyID。
问题是:我可以开始工作,直到获得存储的行并在文档上渲染为止。我尝试了很多方法,并在堆栈溢出中阅读了很多其他文章,但没有成功。有人可以帮我这个小事吗?
基本上,我需要制作一个使用api并在表中呈现api数据的应用程序。该表的每个元素都需要有一个按钮,其作用类似于“收藏夹”按钮,即使我刷新,该按钮也可以将表的行保存在页面中。我需要将这些元素保存在浏览器的本地存储中,这已经完成了,但是刷新时我无法保存之前保存的行以保留在页面中。基本上,我想知道如何使保存的本地存储内容保留在页面中,因为刷新页面时,即使保存的内容也会消失。
代码如下:
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Fetch API - HTTP Requests</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
td{
border: 1px solid #999999;
padding: 3px;
}
td button{
height: 18vh;
}
.header{
text-align: center;
}
.header button{
width: 40%;
height: 8vh;
background-color: #212121;
color: #fff;
border-radius: 15px;
}
button:focus{
outline: none;
}
</style>
</head>
<body>
<div class="header">
<h1>Desafio.js 2</h1>
<button id="getPosts" type="button">Search data on the API</button>
<button id="eraser" type="button">Erase all, except the favorites</button>
</div>
<table id="output">
<script src="script.js"></script>
</table>
<hr>
</body>
</html>
JS:
//variables
var obj;
fetch('https://jsonplaceholder.typicode.com/posts')
.then(res => res.json())
.then(data => obj = data)
.then(() => console.log(obj)) //debug
//eventListeners
document.getElementById('getPosts').addEventListener('click', getPost);
//functions
function getPost(){
fetch('https://jsonplaceholder.typicode.com/posts')
.then((res) => res.json())
.then((data) => {
let output = '<h3>Postagens</h3>' + '<td>User ID</td><td>ID</td><td>Title</td><td>Body</td><td>Favoritos</td>'
data.forEach(function(post){
output+= `
<tr>
<td>${post.userId}</td>
<td>${post.id}</td>
<td>${post.title}</td>
<td>${post.body}</td>
<td><button type="button" class="favorite" data-id="${post.id}">Favoritar!</button></td>
</tr>
`
})
document.getElementById('output').innerHTML = output;
initListener();
})
}
function initListener(){
let favorites = document.querySelectorAll('.favorite');
let favLength = favorites.length;
favorites.forEach((favorites) =>{
favorites.addEventListener('click', (event) => {
let keyID = event.target.dataset.id;
let favObj = obj[(keyID)-1];
localStorage.setItem(keyID, JSON.stringify(favObj));
let dataObj = JSON.parse(localStorage.getItem(keyID));
})
})
}
答案 0 :(得分:0)
您正在做的是在收藏夹数组而不是单个元素上添加addEventListner。
我在代码中所做的更改是,在添加eventListener的行中,我将其从收藏夹更改为收藏夹。
收藏夹不是任何DOM元素,它只是DOM元素的数组。
function initListener(){
let favorites = document.querySelectorAll('.favorite');
let favLength = favorites.length;
favorites.forEach((favorite) =>{
favorite.addEventListener('click', (event) => {
let keyID = event.target.dataset.id;
let favObj = obj[(keyID)-1];
localStorage.setItem(keyID, JSON.stringify(favObj));
let dataObj = JSON.parse(localStorage.getItem(keyID));
})
})
}