【问题标题】:comment appending on the first post only in Vanilla JavaScript仅在 Vanilla JavaScript 中附加在第一篇文章上的评论
【发布时间】:2020-10-05 08:42:29
【问题描述】:

我正在创建一个状态发布和评论系统。 它是在 Vanilla JavaScript 中实现的。任何人都可以添加帖子并可以对帖子发表评论。 一切正常,但评论部分只在第一篇文章上工作。 删除评论和帖子工作正常。 我不知道是什么问题,如果有人可以帮助我.. 这是HTML代码

 <div class="container-post" id="container-post">
    <div class="create-post">
        <form>
            <div class="form-group">
                <div class="username">
                    <p class="name" style="top:15px;">User Name</p>
                </div>
                <p class="qoutes">
                    <textarea style=" font-size: 15pt;" class="form-control" id="enter-post" rows="7" id="mypara" placeholder="Share Your Thoughts..."></textarea>
                </p>
                <div class="postbar">
                    <button type="button" class="btn btn-primary post-me" id="post-button"> <span id="postText">Post</span></button>
                </div>
            </div>
        </form>
    </div>
    <hr class="line-bar">

    <div class="allpost">

        <div class="mainpost" id="post-div"></div>
       
    </div>

这里是 JavaSCript 代码

showTask();
showComment();

let addPost = document.getElementById("enter-post");
let addPostBtton = document.getElementById("post-button");

addPostBtton.addEventListener("click", function () {

var addPostVal = addPost.value;
if (addPostVal.trim() != 0) {
    let webtask = localStorage.getItem("localtask");

    if (webtask == null) {
        var taskObj = [];
    }
    else {
        taskObj = JSON.parse(webtask);
    }
    taskObj.push(addPostVal);
    localStorage.setItem("localtask", JSON.stringify(taskObj));

}

showTask();
});


function showTask() {
let webtask = localStorage.getItem("localtask");

if (webtask == null) {
    var taskObj = [];
}
else {
    taskObj = JSON.parse(webtask);
}

let htmlVal = '';
let createPost = document.getElementById("post-div");
taskObj.forEach((item, index) => {
    htmlVal += `
                <div class="post-class"><div class="username u-name">
                <p class="name i-name">${"User Name " + index}</p>
                <i class="fas fa-trash-alt" onclick="removePost(${index});"></i></button>
                </div>
                <hr>
                <p class="quotes">
                ${item}
                </p>
                <div class="comment-section" id="comment-section">
                    <p class="comment-qoute">
                        <textarea style=" font-size: 15pt;" class="form-control commentBox" rows="3" id="mypara" placeholder="Leave a comment"></textarea>
                    </p>
                    <button class="btn btn-primary comment-btn" id="commentBtn">comment</button>
                    <ul class="comments" id="comments-portion">
                        <p></p>

                    </ul>
            </div>
            </div>
                <br><br>`
});

createPost.innerHTML = htmlVal;
}

function removePost(index) {

let webtask = localStorage.getItem("localtask");
let taskObj = JSON.parse(webtask);
taskObj.splice(index, 1);
localStorage.setItem("localtask", JSON.stringify(taskObj));
showTask();
}

var commentPost = document.getElementById('mypara');
var commentBtn = document.getElementById('commentBtn');

commentBtn.addEventListener('click', function () {
var commentValue = commentPost.value;

if (commentValue.trim() != 0) {
    let commentTask = localStorage.getItem("comments");

    if (commentTask == null) {
        var commentObj = [];
    }
    else {
        commentObj = JSON.parse(commentTask);
    }
    commentObj.push(commentValue);
    localStorage.setItem("comments", JSON.stringify(commentObj));

}
showComment();
});


function showComment() {
let commentsTask = localStorage.getItem("comments");

if (commentsTask == null) {
    var commentObj = [];
}
else {
    commentObj = JSON.parse(commentsTask);
}

let commentHTMLValue = '';
var createComment = document.getElementById("comments-portion");
commentObj.forEach((item, index) => {
    commentHTMLValue += `<div class="comment-box-btn">
                            <p>${index + ". "}<span>${item}</span></p>
                            <i class="far fa-times-circle fa-2x" onclick="removeComment(${index});"></i>
                        </div>
                        `;
});

createComment.innerHTML = commentHTMLValue;
}


var deleteBtn = document.querySelector('.comment-del');
deleteBtn.addEventListener('click', () => {

});


// remove comment


function removeComment(index) {
let commentTask = localStorage.getItem("comments");
let commentObj = JSON.parse(commentTask);
commentObj.splice(index, 1);
localStorage.setItem("comments", JSON.stringify(commentObj));
showComment();
 }

【问题讨论】:

    标签: javascript html web-frontend


    【解决方案1】:

    当你使用如下代码时:

    createComment.innerHTML = commentHTMLValue;
    

    您正在完全替换元素的内容。尝试使用:

    createComment.innerHTML += commentHTMLValue;
    

    将新内容附加到现有内容的末尾。

    【讨论】:

    • 亲爱的 ATD,它给了我同样的结果
    • 你把它们都改了吗 - 例如,createPost.innerHTML = htmlVal;}createPost.innerHTML += htmlVal;}
    • 是的!结果相同,在 facebook 中有多个帖子,但我可以对第一个帖子发表评论。我可以看到多个帖子,但我可以对第一个帖子发表评论。不知道为什么会这样!
    • 我认为是这一行:var createComment = document.getElementById("comments-portion"); 如果有多个元素的idcomments-portion,您需要找到正确的元素,因为您只针对第一个元素。因此,您必须遍历它们,或者给它们一些独特的东西来直接定位它们。
    • 现在我想弄清楚我该怎么做。我是初学者,所以我有点困惑。
    【解决方案2】:

    由于不允许使用 localStorage,我无法在此处执行 sn-p。将此块复制到一个空白文件中,并将其保存为 html 文件,然后在浏览器中打开。

    这就是我认为您描述您的要求的方式,并且也是基于我的 cmets 中的数据格式。它不漂亮,需要大量修饰,但它可以运行。

    <!DOCTYPE html>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
    <html>
    <head>
    <title>Task listing</title>
    
    <script type="text/javascript">
    
    let taskList = [];
    
    function checkTasks() {
      let tasksList = getTasksList();
      if (tasksList.length == 0) {
        let newTask = prompt("Please enter a task description");
        if (newTask) {
          let thisIndex = getNewIndex();
          let a = {"id": thisIndex, "task": newTask, "comments": []}
          taskList.push(a);
          saveTasksList(taskList);
        }
      }
      displayTasks();
    }
    
    function displayTasks() {
      let container = document.getElementById("tasks");
      container.innerHTML = "";
      let taskList = getTasksList();
      taskList.forEach(function(task){
        let d = document.createElement("div");
        d.id = "task_" + task.id;
        d.className = "commentdiv";
        d.innerHTML = "<h3>" + task.task + "</h3>";
        let l = document.createElement("ul");
        l.id = "comments_" + task.id;
        let comments = task.comments;
        if (comments.length > 0) {
          let commentindex = 0;
          comments.forEach(function(comment) {
            let c = document.createElement("li");
            c.innerHTML = comment;
            let cb = document.createElement("button");
            cb.id = "deletecomment_" + task.id + "_" + commentindex;
            cb.innerHTML = "Delete comment";
            cb.onclick = function() {deleteComment(task.id, commentindex);};
            c.appendChild(cb);
            l.appendChild(c);
          })
        }
        let b = document.createElement("button");
        b.id = "addcomment_" + task.id;
        b.onclick = function() {addComment(task.id);};
        b.innerHTML = "Add comment";
        d.appendChild(b);
        d.appendChild(l);
        container.appendChild(d);
      })
    }
    
    function addComment(taskid) {
      let newcomment = prompt("Enter comment");
      if (newcomment) {
        let tasklist = getTasksList();
        let filtered = tasklist.filter(task => task.id == taskid);
        if (filtered[0]) {
          let thisTask = filtered[0];
          thisTask.comments.push(newcomment);
          let thisIndex = taskList.findIndex((task) => task.id == taskid);
          taskList[thisIndex] = thisTask;
        }
        saveTasksList(taskList);
        displayTasks();
      }
    }
    
    function addNewTask() {
      let newTask = prompt("Enter task description");
      let taskList = getTasksList();
      let lastindex = localStorage.getItem("tasksindex");
      let index = getNewIndex();
      let a = {"id": index, "task": newTask, "comments": []}
      taskList.push(a);
      saveTasksList(taskList);
      displayTasks();
    }
    
    function deleteComment(taskid, commentindex) {
      let tasklist = getTasksList();
      let filtered = tasklist.filter(task => task.id == taskid);
      // as long as there is at least one task with the taskid value, find and delete the comment
      // based on the index position of the comment in the comments array
      if (filtered[0]) {
        let thisTask = filtered[0];
        thisTask.comments.splice(commentindex, 1);
        let thisIndex = taskList.findIndex((task) => task.id == taskid);
        taskList[thisIndex] = thisTask;
      }
      saveTasksList(taskList);
      displayTasks();
    
    }
    
    function getTasksList() {
      let tasks = localStorage.getItem("tasks");
      taskList = JSON.parse(tasks);
      if (!taskList) {
        taskList = [];
      }
      return taskList;
    }
    
    function saveTasksList(taskList) {
      localStorage.setItem("tasks", JSON.stringify(taskList));
    }
    
    function getNewIndex() {
      let lastindex = localStorage.getItem("tasksindex");
      let idx = 0;
      if (!lastindex) {
        idx = 1;
      } else {
        idx = Number(lastindex) + 1;
      }
      localStorage.setItem("tasksindex", idx);
      return idx;
    }
    
    function removeAll() {
      localStorage.removeItem("tasks");
      localStorage.removeItem("tasksindex");
      displayTasks();
    
    }
    
    window.onload = checkTasks;
    
    
    </script>
    
    <style type="text/css">
    
    .commentdiv {
      border:1px solid black;
      width:1000px;
      padding:5px;
      border-radius:5px;
    }
    
    button {
      margin-left:10px;
    }
    
    h3 {
      width:100%;
      border-bottom: 1px dotted black;
    }
    
    ul {
      list-style-type:decimal;
    }
    
    </style>
    </head>
    <body>
    <h2>My task list <button id="addNewTaskButton" onclick="addNewTask();">Add new task</button></h2>
    <hr>
    <div id="tasks">
    
    </div>
    <button id="removeAll" onclick="removeAll();">Remove all tasks</button>
    </body>
    </html>
    

    【讨论】:

    • 当然,那是 my 代码 - 当您使用表单并且想要使用文本框而不是提示来获取任务/cmets 文本时,您的代码看起来会有所不同我也没有使用 eventListener - 只是为了让我更容易。但是,这应该让您了解如何工作以及如何存储、更新、删除和检索数据。与以往一样,有更好的方法来做事——我鼓励你找到这些方法,而不是仅仅抄袭我的代码。而且,当然,我没有真正的造型 - 这也取决于你!
    • 是的,我通过你的代码学到了现在我将从头开始实现这个东西。现在很多事情我都清楚了。
    • 太好了!我的意图就是这样做 - 给你足够的学习机会,但不会为你编写整个代码;o)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2016-11-10
    • 2017-04-10
    • 2021-08-04
    相关资源
    最近更新 更多