localStorage“单击收藏夹”系统问题

时间:2018-12-07 05:24:20

标签: javascript json api stringify

我有这段代码,当按下第一个按钮时,它基本上消耗了一个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));

        })
    })

}

1 个答案:

答案 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));

    })
})

}