JS всегда загружает представление по умолчанию

#javascript #django

#javascript #django

Вопрос:

Я прохожу курс CS50 «Веб-программирование на Python и Javascript».

В одном из проектов, которые необходимо выполнить, нужно реализовать платформу социальной сети, где пользователи могут публиковать некоторые тексты, ставить лайки и дизлайки и подписываться на других пользователей.

Пользователь может использовать 3 маршрута:

  • Все сообщения,
  • Следуя и
  • сообщения пользователей.

Я пытался решить эту проблему с помощью интерфейса js. У меня есть функция «view_posts», которая принимает аргумент, указывающий, какие сообщения должны быть извлечены и отображены на HTML-странице. Рассмотрим следующую часть моего js-файла:

 document.addEventListener('DOMContentLoaded', function() {
  username = document.getElementById('username').innerText
  document.querySelector('#posts').addEventListener('click', () => view_posts('all'));
  document.querySelector('#username').addEventListener('click', () => view_posts(username));
  document.querySelector('#following').addEventListener('click', () => view_posts('followers'));
  document.querySelector('#post-form').style.display = "none";

  view_posts('all')
});
  

Извлечение данных в основном работает, но js всегда отображает представление по умолчанию «view_posts (‘all’)». Это означает, что даже если я нажимаю на элемент с идентификатором #post, вызывая ту же самую функцию, включая тот же аргумент, функция вызывается без отображения чего-либо, прежде чем она снова вызовет представление по умолчанию (на этот раз данные будут отображаться правильно).

 function view_posts(selector) {
  // document.querySelector('#post-form').style.display = "none";

  if (selector === 'all') {
    document.querySelector('#header').innerText = "All Posts";
    document.querySelector('#post-form').style.display = "block";
  } else if (selector == 'following') {
    document.querySelector('#header').innerText = "Following";
  } else {
    document.querySelector('#header').innerText = selector;
  }

  fetch(`/network/${selector}`)
    // .then(response => response.text())
    // .then(posts => console.log(posts))
    .then(response => response.json())
    .then(posts => {
      posts.forEach((element) => {
        var item = document.createElement('div');

        item.className = "card";
        item.innerHTML = `<div class="card-body" id="item-${element.id}">
    
            ${element.author} | ${element.timestamp}
            <br>
            ${element.body}
            </div>`;
        document.querySelector('#post-view').append(item);
        // document.getElementById('item-${element.id}').addEventListener('click', () => view_posts(element.author))
      });
    });
  // .catch(console.log.bind(console));
};
  

РЕДАКТИРОВАТЬ: вот мой index.html

 {% extends "network/layout.html" %}
{% load static %}

{% block body %}
<div id="post-view">
  <h2 id="header" style="margin:10px"></h2>
    <div id=post-form>
      <h4>New Post</h4>
      <form>
        <textarea class="form-control" id="compose-body" placeholder="Type here..."></textarea>
        <input onclick="create_post()" type="button" class="btn btn-primary" value="Post"/>
      </form>
  </div>
</div>

{% endblock %}

{% block script %}
<script src="{% static 'network/index.js' %}"></script>
{% endblock %}
  

Комментарии:

1. На первый взгляд выглядит нормально. Покажите HTML-код с элементами, которые вы можете щелкнуть. Возможно, это проблема с сервером. Вы также должны показать этот код

2. @mplungjan да, этого намека было достаточно. У меня был href на панели навигации, заставляя перезагружаться index.html каждый раз. Довольно глупо. В любом случае, это решает мою проблему. С другой стороны, теперь у меня проблема в том, что вместо отображения только выбранных сообщений (например, определенного пользователя), он будет добавлять их в html каждый раз, когда я нажимаю на другое представление, пока я действительно не перезагружу страницу (f5)

Ответ №1:

Чтобы не добавлять

 document.getElementById('post-view').innerHTML = posts.map(element => (
  `<div class="card">
     <div class="card-body" id="item-${element.id}">
       ${element.author} | ${element.timestamp}<br>${element.body}
     </div>
   </div>`).join("");
  

Комментарии:

1. ну, на данный момент я нашел обходной путь: document . querySelector(‘#post-view’).innerHTML = «»; но где я должен разместить ваш фрагмент кода? Сразу после «.then(posts => {» ?

2. Да, он заменяет ваши posts.forEach