Кнопка не отображается при использовании JS для динамического добавления на страницу

function addElements(mailbox) {
  if (mailbox != 'sent') {
    let actionDivArchiveBtn = document.querySelector('#actions')
    let archiveButton = document.createElement("button");
    archiveButton.classList.add('archive');
    archiveButton.innerHTML = `<i class = "fa fa-archive" aria-hidden = "true"></i>`
    actionDivArchiveBtn.appendChild(archiveButton);

    archiveButton.addEventListener('click', () => {
      if (email.archived === false) {
        actionDivArchiveBtn.style.color = "blue";
        fetch(`/emails/archive/${id}`, {
          method: 'PUT',
          body: JSON.stringify({
            archived: true
          })
        })
      } else {
        actionDivArchiveBtn.style.color = "black";
        fetch(`/emails/archive/${id}`, {
          method: 'PUT',
          body: JSON.stringify({
            archived: false
          })
        })
      }
    })
  }
  load_mailbox('inbox');
}
<div class = "actions">
  <span class = "action"><i class = "fa fa-reply" aria-hidden = "true"></i></span>
</div>
<div class = "header">
  <span class = "from">${email.sender}</span>
  <span class = "date">
                            <span class = "float-right"></span>${email.timestamp}</span>
</div>
<div class = "title">${email.subject}</div>
<div class = "description">${email.body}</div>

Я создаю gmail как одностраничное приложение, я хочу динамически создать кнопку архива, используя ванильный javascript (кнопка не отображается на моем экране), и я хочу слушать, когда пользователь нажимает кнопку архива, используя прослушиватели событий, затем проверьте если архив равен true, используйте PUT и измените его на false и наоборот.

У меня проблема в том, что моя кнопка не отображается.

Я не знаю, почему, потому что я проверил аналогичные примеры того, как создавать и добавлять кнопки, и был предпринят аналогичный процесс. Пожалуйста, помогите с обзором кода.


                        <div class = "actions">
                            <span class = "action"><i class = "fa fa-reply" aria-hidden = "true"></i></span>
                        </div>
                        <div class = "header">
                            <span class = "from">${email.sender}</span>
                            <span class = "date">
                            <span class = "float-right"></span>${email.timestamp}</span>
                        </div>
                        <div class = "title">${email.subject}</div>
                        <div class = "description">${email.body}</div>

function addElements(mailbox) {
      if (mailbox != 'sent'){
        let actionDivArchiveBtn = document.querySelector('#actions')
        let archiveButton = document.createElement("button");
        archiveButton.classList.add('archive');
        archiveButton.innerHTML = `<i class = "fa fa-archive" aria-hidden = "true"></i>`
        actionDivArchiveBtn.appendChild(archiveButton);

        archiveButton.addEventListener('click',() => {
          if (email.archived === false) {

function addElements(mailbox) {
  if (mailbox != 'sent') {
    let actionDivArchiveBtn = document.querySelector('#actions')
    let archiveButton = document.createElement("button");
    archiveButton.classList.add('archive');
    archiveButton.innerHTML = `<i class = "fa fa-archive" aria-hidden = "true"></i>`
    actionDivArchiveBtn.appendChild(archiveButton);

    archiveButton.addEventListener('click', () => {
      if (email.archived === false) {
        actionDivArchiveBtn.style.color = "blue";
        fetch(`/emails/archive/${id}`, {
          method: 'PUT',
          body: JSON.stringify({
            archived: true
          })
        })
      } else {
        actionDivArchiveBtn.style.color = "black";
        fetch(`/emails/archive/${id}`, {
          method: 'PUT',
          body: JSON.stringify({
            archived: false
          })
        })
      }
    })
  }
  load_mailbox('inbox');
}
<div class = "actions">
  <span class = "action"><i class = "fa fa-reply" aria-hidden = "true"></i></span>
</div>
<div class = "header">
  <span class = "from">${email.sender}</span>
  <span class = "date">
                            <span class = "float-right"></span>${email.timestamp}</span>
</div>
<div class = "title">${email.subject}</div>
<div class = "description">${email.body}</div>
function addElements(mailbox) {
  if (mailbox != 'sent') {
    let actionDivArchiveBtn = document.querySelector('#actions')
    let archiveButton = document.createElement("button");
    archiveButton.classList.add('archive');
    archiveButton.innerHTML = `<i class = "fa fa-archive" aria-hidden = "true"></i>`
    actionDivArchiveBtn.appendChild(archiveButton);

    archiveButton.addEventListener('click', () => {
      if (email.archived === false) {
        actionDivArchiveBtn.style.color = "blue";
        fetch(`/emails/archive/${id}`, {
          method: 'PUT',
          body: JSON.stringify({
            archived: true
          })
        })
      } else {
        actionDivArchiveBtn.style.color = "black";
        fetch(`/emails/archive/${id}`, {
          method: 'PUT',
          body: JSON.stringify({
            archived: false
          })
        })
      }
    })
  }
  load_mailbox('inbox');
}
<div class = "actions">
  <span class = "action"><i class = "fa fa-reply" aria-hidden = "true"></i></span>
</div>
<div class = "header">
  <span class = "from">${email.sender}</span>
  <span class = "date">
                            <span class = "float-right"></span>${email.timestamp}</span>
</div>
<div class = "title">${email.subject}</div>
<div class = "description">${email.body}</div>

Переместите свой код во фрагмент кода (нажмите Ctrl+M в редакторе) и покажите макет HTML!

EzioMercer 06.05.2022 13:21

вместо того, чтобы вставлять весь код, привязанный к вашему контексту... почему бы вам не упростить проблему, пытаясь лучше понять, что вы делаете неправильно? например document.querySelector('actions') Я сомневаюсь, что он когда-либо вернет какой-либо результат, так как у вас есть действия типа элемента html ??

Diego De Vita 06.05.2022 13:24
// select the div housing the archive and reply button - вы не выбираете ни одного элемента div, document.querySelector('actions') попытается найти элемент с название тэгаactions.
CBroe 06.05.2022 13:25

@EzioMercer, я думаю, что сделал это, нажал Ctrl + M и Сохранить и вставить в сообщение.

Chuks 06.05.2022 13:25

@Chuks Ваш код не работает, так что нет, вы этого не делали. Должна быть кнопка «Выполнить фрагмент кода».

EzioMercer 06.05.2022 13:28

@CBroe, блин, я отредактировал это, чтобы actionDivArchiveBtn = document.querySelector('#actions'). Спасибо за наблюдение. Моя кнопка все еще не отображается

Chuks 06.05.2022 13:28

Тогда ваш код для добавления кнопки сам по себе должен работать нормально, jsfiddle.net/a6fq2e84 Тогда вам нужно немного отладить себя, мы не можем сделать это за вас, основываясь на простом фрагменте, который вы показали.

CBroe 06.05.2022 13:32

@EzioMercer, я сейчас не использовал его раньше, поэтому подумал, что добавил его. Спасибо

Chuks 06.05.2022 13:33

@Chuks Спасибо! Теперь удалите свой код из фрагмента кода и добавьте макет HTML в блок HTML фрагмента кода.

EzioMercer 06.05.2022 13:34

Я добавил свой HTML-код и удалил другой код, которого не было во фрагменте кода.

Chuks 06.05.2022 13:39

@Chuks Вы можете (должны) добавить свой HTML-макет и код JS в один фрагмент кода. Фрагмент кода состоит из 4 разделов, 3 из которых предназначены для редактирования (блок HTML вверху слева, блок CSS вверху справа и блок JS внизу слева) и 1 для просмотра вывода. И не забудьте нажать кнопку «Tidy» во фрагменте кода, прежде чем нажать «Сохранить и вставить в сообщение».

EzioMercer 06.05.2022 13:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
11
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш querySelector вместо actionDivArchiveBtn неверен. Поскольку вы ищете по id, но в макете это class, поэтому я изменил в макете class на id, и теперь это работает. Но может быть вам нужно class в макете, тогда измените # на . в querySelector:

function load_mailbox(string) {
  console.info(string);
}

function addElements(mailbox) {
  if (mailbox != 'sent') {
    let actionDivArchiveBtn = document.querySelector('#actions')
    let archiveButton = document.createElement("button");
    archiveButton.classList.add('archive');
    archiveButton.innerHTML = `SOME TEXT<i class = "fa fa-archive" aria-hidden = "true"></i>`
    actionDivArchiveBtn.appendChild(archiveButton);

    archiveButton.addEventListener('click', () => {
      if (email.archived === false) {
        actionDivArchiveBtn.style.color = "blue";
        fetch(`/emails/archive/${id}`, {
          method: 'PUT',
          body: JSON.stringify({
            archived: true
          })
        })
      } else {
        actionDivArchiveBtn.style.color = "black";
        fetch(`/emails/archive/${id}`, {
          method: 'PUT',
          body: JSON.stringify({
            archived: false
          })
        })
      }
    })
  }
  load_mailbox('inbox');
}

addElements('receive');
<div id = "actions">
  <span class = "action"><i class = "fa fa-reply" aria-hidden = "true"></i></span>
</div>

<div class = "header">
  <span class = "from">${email.sender}</span>
  
  <span class = "date">
    <span class = "float-right"></span>${email.timestamp}
  </span>
</div>

<div class = "title">${email.subject}</div>

<div class = "description">${email.body}</div>

Другие вопросы по теме