#javascript #onclick
#javascript #onclick
Вопрос:
Используя только JavaScript, я хочу создать пять вложенных разделов. При нажатии на один из них я хочу, чтобы только фон этого div менял свой цвет (в соответствии с массивом цветов).
Моя проблема здесь в том, что, поскольку divs вложены, нажатие на любой из них просто окрасит самый большой (родительский). Остальная часть кода в порядке, потому что, если я изо всех сил нажимаю на границу, я действительно могу добиться того, чего хочу. Но идея заключается в том, чтобы работать при нажатии внутри меньшего div.
var currentParent = document.body;
var colors = ['red', 'black', 'green', 'pink', 'purple']
var divArray = []
for (let i = 0; i < 5; i ) {
let currentDiv = document.createElement("div")
currentDiv.style.width = `${(i * 10 20)}px`
currentDiv.style.height = `${(i * 10 20)}px`
currentDiv.position = i
currentParent.append(currentDiv)
divArray.push(currentDiv)
currentParent = currentDiv
}
for (let i = 0; i < 5; i ) {
divArray[i].onclick = function() {
this.style.backgroundColor = colors [this.position]
}
}
Комментарии:
1. загляните в
event.stopPropagation
и узнайте о событии «bubbling». Смотрите, например javascript.info/bubbling-and-capturing2. Вы можете использовать stopPropagation, чтобы предотвратить передачу событий родителям, но потребуется более продвинутый css, если вы хотите, чтобы дочерние элементы того, на который вы нажимаете, не менялись
Ответ №1:
К каждому циклу добавляется элемент DIV, больший, чем его родительский элемент. Это означает, что можно щелкнуть только по последнему div, потому что он охватывает остальные.
Если изменить логику изменения размера, чтобы с каждым циклом DIVS становились все меньше, код будет работать так, как вы ожидаете.
Используйте event.stopPropagation();
, чтобы предотвратить передачу события другим элементам.
var currentParent = document.body;
var colors = ['red', 'black', 'green', 'pink', 'purple']
var divArray = []
for (let i = 0; i < 5; i ) {
let currentDiv = document.createElement("div")
currentDiv.style.width = `${(60 - i * 10)}px`
currentDiv.style.height = `${(60 - i * 10)}px`
currentDiv.position = i
currentParent.append(currentDiv)
divArray.push(currentDiv)
currentParent = currentDiv
}
for (let i = 0; i < 5; i ) {
divArray[i].onclick = function(e) {
e.stopPropagation();
this.style.backgroundColor = colors [this.position]
}
}
div {
outline: 1px solid orange;
background: #FFF;
}
Ответ №2:
Вам нужно остановить распространение события в onclick
событии, вот так
divArray[i].onclick = function(event) {
event.stopPropagation();
this.style.backgroundColor = colors [this.position]
}
Существует также preventDefault, чтобы предотвратить поведение по умолчанию, например, ссылку или кнопку формы.
var currentParent = document.body;
var colors = ['red', 'black', 'green', 'pink', 'purple']
var divArray = []
for (let i = 0; i < 5; i ) {
let currentDiv = document.createElement("div")
currentDiv.style.width = `${(i * 10 20)}px`
currentDiv.style.height = `${(i * 10 20)}px`
currentDiv.position = i
currentParent.append(currentDiv)
divArray.push(currentDiv)
currentParent = currentDiv
}
for (let i = 0; i < 5; i ) {
divArray[i].onclick = function() {
this.style.backgroundColor = colors [this.position]
}
}
div{
border: 1px solid #000;
}
Комментарии:
1. Уверен, что это проблема с css, проверьте позиции ваших divs, если вы используете
position:absolute
илиposition:relative
проверьтеz-index
… Я не могу сказать без вашего css, но из js divs становятся все больше и больше, таким образом, что последний div закрывает предыдущий (вы не можете щелкнуть предыдущий div) … отредактировал мой ответ, чтобы проиллюстрировать проблему