В HTML у меня есть
<div>
<button onclick = "action()">button</button>
</div>
Не передавая ID
или class
элементу div
, что я могу сделать в JavaScript, чтобы получить к нему доступ и использовать его?
используя 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);}
@ronnLee & nullqube: e
- очень плохой выбор имени для этого параметра, поскольку action
является обработчиком событий и в большинстве случаев обработчик событий, принимающий параметр с именем e
, получает объект события, но action
выше - это нет. "если я хочу добавить еще одну кнопку" Да, это сработает. Просто измените название параметра. :-)
Передайте 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
.
Разве «это» не относится к кнопке?
@ronnLee: Нет, если вы используете onclick = "action()"
, нет. Это произойдет, если вы используете современную обработку событий.
Значит, кроме использования его в «onclick = " action () », это обычно относится к текущему элементу?
@ronnLee: Извините, я неправильно понял, о чем вы спрашивали в своем комментарии, и был неясен. В onclick = "action(this)"
да, this
относится к кнопке (элемент, на котором установлен атрибут). Но вaction
, this
не будут ссылаться на кнопку (поэтому я прошу вас передать это). При современной обработке событий this
в action
будет ссылаться на кнопку.
Если есть возможность, переходите к действию 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 Есть ли прогресс по этому вопросу?
Используйте селектор
closest
или получите доступ кparentElement
элемента (поместите свой Javascript в раздел Javascript - помещать его в атрибуты HTML так же плохо, как иeval
)