Щелкните вложенные элементы в JavaScript

#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-capturing

2. Вы можете использовать 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) … отредактировал мой ответ, чтобы проиллюстрировать проблему