Как в JavaScript и HTML получить доступ к <div>, который находится на текущей кнопке?

В HTML у меня есть

 <div>
      <button onclick = "action()">button</button>
 </div>

Не передавая ID или class элементу div, что я могу сделать в JavaScript, чтобы получить к нему доступ и использовать его?

Используйте селектор closest или получите доступ к parentElement элемента (поместите свой Javascript в раздел Javascript - помещать его в атрибуты HTML так же плохо, как и eval)

CertainPerformance 02.05.2018 08:20
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
64
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

используя this в onclick=action(), а затем родительский .parentNode тогда ваш метод будет выглядеть так:

<div>
  <button onclick = "action(this);">button</button>
</div>

function action(el) {
  console.info(el.parentNode);
}

но я предпочитаю .addEventListenerи для вашего следующего вопроса:

var $el = document.getElementById("a");
$el.addEventListener("click", function(e) {
  // Create a <button> element
  var btn = document.createElement("BUTTON");
  // Create a text node 
  var t = document.createTextNode("CLICK ME");
  // Append the text to <button>
  btn.appendChild(t);        
  // Append <button> to the parentNode          
  this.parentNode.appendChild(btn);
});
<div>
  <button id = "a">Button</button>
</div>

Также на случай, если вам интересно, есть ли более короткая версия и, вероятно, вводится jQuery:

;$(function(){
  $("#a").on("click", function(e) {  
    $(this).parent().append('<button>Click Me</button>');
  });
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <button id = "a">Button</button>
</div>

Другой, но не прямой способ получить родительский элемент вместо .parentNode - это метод .closest():

element.closest("div"); // also supported in jQuery

Возвращает первого предка элемента, то есть элемент <div>:

Что, если я хочу добавить еще одну кнопку после ее нажатия, просто скажу «function action (e) {e.parentNode.appendChild (button);}

user9724045 02.05.2018 08:31

@ronnLee & nullqube: e - очень плохой выбор имени для этого параметра, поскольку action является обработчиком событий и в большинстве случаев обработчик событий, принимающий параметр с именем e, получает объект события, но action выше - это нет. "если я хочу добавить еще одну кнопку" Да, это сработает. Просто измените название параметра. :-)

T.J. Crowder 02.05.2018 08:43
Ответ принят как подходящий

Передайте this в action:

<button onclick = "action(this)">button</button>

а затем в действии

function action(btn) {
    var div = btn.parentNode;
    // ...
}

или, если вы хотите немного большей гибкости, используйте (относительно новый) метод closest:

function action(btn) {
    var div = btn.closest("div");
    // ...
}

Боковое примечание: вместо обработчиков событий в стиле атрибутов onxyz рассмотрите возможность использования современной обработки событий (addEventListener, attachEvent в устаревших браузерах). Если вам нужно поддерживать устаревшие браузеры, мой ответ здесь предоставляет функцию, которую вы можете использовать для решения проблемы отсутствия addEventListener.

Разве «это» не относится к кнопке?

user9724045 02.05.2018 08:25

@ronnLee: Нет, если вы используете onclick = "action()", нет. Это произойдет, если вы используете современную обработку событий.

T.J. Crowder 02.05.2018 08:26

Значит, кроме использования его в «onclick = " action () », это обычно относится к текущему элементу?

user9724045 02.05.2018 08:26

@ronnLee: Извините, я неправильно понял, о чем вы спрашивали в своем комментарии, и был неясен. В onclick = "action(this)" да, this относится к кнопке (элемент, на котором установлен атрибут). Но вaction, this не будут ссылаться на кнопку (поэтому я прошу вас передать это). При современной обработке событий this в action будет ссылаться на кнопку.

T.J. Crowder 02.05.2018 08:40

Если есть возможность, переходите к действию this (button). Затем вы можете получить доступ к родителю с помощью element.parentNode. Пример: https://jsbin.com/fidufa/edit

Возьмите событие, затем возьмите currentTarget, затем найдите parentNode. Очень простой способ сделать это. Это будет работать независимо от того, какой элемент нажат. См. Демонстрацию фрагмента кода.

function getParentNode(event) {
  console.info(event.currentTarget.parentNode);
}
<div id = "div1"><button onclick = "getParentNode(event)">Click</button></div>
<div id = "div2"><button onclick = "getParentNode(event)">Click</button></div>

@ronnLee Есть ли прогресс по этому вопросу?

Cory Kleiser 07.06.2018 05:40

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