Как получить соответствующее значение кнопки в JavaScript?

#javascript #html

Вопрос:

Мне не нужно значение кнопки, но вместо этого мне нужно значение промежутка внутри div, которое соответствует этой кнопке. У меня есть модель, в которой кнопки соответствуют div. введите описание изображения здесь

Например, здесь вы можете видеть, что есть 3 кнопки, соответствующие каждому назначению.

Всякий раз, когда пользователь нажимает кнопку «Назначить», мне нужно возвращать значение интервала заголовка, например, если кто-то сначала нажимает «Назначить», в консоли должно быть напечатано «Английский UOI 1».

HTML-код завершается следующим образом —

 <div class="assignment-wrapper">
    <div class="assignment-title"><span class="assignment-name">English UOI 1</span><span>15-06-2021</span></div>
    <div class="assignment-functions">
        <div class="assign-task assignment-function-btn">Assign</div>
        <div class="update-task assignment-function-btn">Update</div>
        <div class="view-results assignment-function-btn">Results</div>
    </div>
</div>
 

Теперь это пример структуры, но я бы делал это с помощью javascript, я получил данные для базы данных, и мне нужно представить каждое задание в табличной форме.

Если у вас есть лучшая модель, вы можете предложить изменения. Любая помощь будет признательна.

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

1. Вы ищете брата или сестру родителя кнопки div.

Ответ №1:

Вы можете нацелиться на 2 родителя в дереве элементов, а затем вернуться к двум дочерним элементам и получить текстовое содержимое spans.

 const btn = document.querySelectorAll('.assignment-function-btn')

function getValue(e){
  let target = e.target.parentNode.parentNode.children[0].children[0]
  console.log(target.textContent)
}

btn.forEach(button => {
  button.addEventListener('click', getValue)
}) 
 .row {
  display: flex;
  justify-content: space-around;
}

.assignment-function-btn {
  background: #ddd;
  border: 1px solid black;
  border-radius: 5px;
  margin-left: 5px;
  padding: 3px;
  cursor: pointer;
} 
   <div class="assignment-wrapper row">
    <div class="assignment-title">
       <span class="assignment-name">English UOI 1</span>    
       <span>15-06-2021</span>
    </div>
    <div class="assignment-functions row">
        <div class="assign-task assignment-function-btn">Assign</div>
        <div class="update-task assignment-function-btn">Update</div>
        <div class="view-results assignment-function-btn">Results</div>
    </div>
</div> 

или…

Если каждый из этих классов, скажем, имеет свою собственную строку с тремя кнопками для каждого заголовка/класса, вы можете закодировать атрибут набора данных в родительский элемент buttons, представляющий заголовок/класс, для которого используется кнопка. Смотрите мой второй фрагмент для этого примера…

Использование атрибута набора данных:

В своем HTML вы добавляете атрибут данных, например data-class-name="English UOI 1" , в прямой родительский элемент ваших кнопок. Затем используйте целевой объект события родительский код, чтобы получить e.target.parentNode.dataset.className .

className является ли javascript верблюжьим случаем для class-name .

     <div class="assignment-title">
      <span class="assignment-name">English UOI 1</span>
      <span>15-06-2021</span>
    </div>
    <!--/ Here we add the data attribute data-class-name="English UOI 1" /-->
    <div data-class-name="English UOI 1" class="assignment-functions row">
      <div class="assign-task assignment-function-btn">Assign</div>
      <div class="update-task assignment-function-btn">Update</div>
      <div class="view-results assignment-function-btn">Results</div>
    </div>
 
 const btn = document.querySelectorAll('.assignment-function-btn')

function getValue(e) {
  let target = e.target.parentNode
  console.log(target.dataset.className)
}

btn.forEach(button => {
  button.addEventListener('click', getValue)
}) 
 .row {
  display: flex;
  justify-content: space-around;
}

.assignment-title {
  flex: auto;
}

.assignment-function-btn {
  background: #ddd;
  border: 1px solid black;
  border-radius: 5px;
  margin-left: 5px;
  padding: 3px;
  cursor: pointer;
} 
 <div class="assignment-wrapper">
  <div class="row">
    <div class="assignment-title">
      <span class="assignment-name">English UOI 1</span>
      <span>15-06-2021</span>
    </div>
    <div data-class-name="English UOI 1" class="assignment-functions row">
      <div class="assign-task assignment-function-btn">Assign</div>
      <div class="update-task assignment-function-btn">Update</div>
      <div class="view-results assignment-function-btn">Results</div>
    </div>
  </div>
  <div class="row">
    <div class="assignment-title">
      <span class="assignment-name">Social Sciences</span>
      <span>23-06-2021</span>
    </div>
    <div data-class-name="Social Sciences" class="assignment-functions row">
      <div class="assign-task assignment-function-btn">Assign</div>
      <div class="update-task assignment-function-btn">Update</div>
      <div class="view-results assignment-function-btn">Results</div>
    </div>
  </div>
  <div class="row">
    <div class="assignment-title">
      <span class="assignment-name">Concepts of Algebra</span>
      <span>26-06-2021</span>
    </div>
    <div data-class-name="Concepts of Algebra" class="assignment-functions row">
      <div class="assign-task assignment-function-btn">Assign</div>
      <div class="update-task assignment-function-btn">Update</div>
      <div class="view-results assignment-function-btn">Results</div>
    </div>
  </div>
</div> 

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

1. Спасибо, я тоже думал о чем-то вроде набора данных, но не был уверен, сработает ли это.

Ответ №2:

Вы могли бы использовать .closest , чтобы захватить .assignment-wrapper дерево DOM, а затем внутри оболочки найти .assignment-name элемент. Тогда хватай ее innerText .

Редактировать: Кроме того, я настоятельно рекомендую использовать button элементы для поведения кнопок в целях обеспечения специальных возможностей.

 const btn = document.querySelector(".assign-task");
btn.addEventListener("click", (e) => {
  const wrapper = e.target.closest(".assignment-wrapper");
  const assignment = wrapper.querySelector(".assignment-name");
  console.log(assignment.innerText);
}) 
 <div class="assignment-wrapper">
    <div class="assignment-title"><span class="assignment-name">English UOI 1</span><span>15-06-2021</span></div>
    <div class="assignment-functions">
        <button class="assign-task assignment-function-btn">Assign</button>
        <button class="update-task assignment-function-btn">Update</button>
        <button class="view-results assignment-function-btn">Results</button>
    </div>
</div> 

Ответ №3:

  • что я понимаю о вас, так это то, что вы хотите отправить текст .assignment-title span ошибок родителю этой кнопки

Вот Пример

 var assignTask = document.getElementsByClassName('assign-task');
for(var i = 0; i < assignTask.length; i  ) {
   assignTask[i].addEventListener('click',function() {
      var text = this.parentNode.parentNode.getElementsByClassName('assignment-name')[0].innerText;
      console.log(text)
   })
}
 

Ответ №4:

Вы можете попробовать следующее

     <div class="assignment-wrapper">
      <div class="assignment-title">
        <span class="assignment-name">English UOI 1</span
        ><span>15-06-2021</span>
      </div>
      <div class="assignment-functions">
        <div class="assign-task assignment-function-btn">Assign</div>
        <div class="update-task assignment-function-btn">Update</div>
        <div class="view-results assignment-function-btn">Results</div>
      </div>
    </div>

    <script>
      function handleButtonClick(event) {
        const buttonType = event.target.innerText;
        const assignmentName = event.target
          .closest(".assignment-wrapper")
          .querySelector(".assignment-name").innerText;
        console.log(`${assignmentName} -> ${buttonType}`);
      }

      document
        .querySelectorAll(".assignment-function-btn")
        .forEach((ele) => ele.addEventListener("click", handleButtonClick));
    </script>