TransWikia.com

почему по цепочке вызовов меняется содержимое у div, на который кликнули в прошлый раз?

Stack Overflow на русском Asked by Bigata on December 28, 2021

Есть html:

<div class = "div1">1</div>
<div class = "div2">2</div>
<div class = "div3">3</div>
<div class = "div4">4</div>
<select class = "select1">
 <option>10</option>
 <option>20</option>
 <option>30</option>
 <option>40</option>
</select>

и к нему js

document.querySelectorAll('[class^="div"]').forEach((elem) => 
{
    elem.addEventListener('click', getIt);
});
function getIt()
{
    let target = this;
    document.getElementsByClassName('select1')[0].addEventListener('change', pasteC(target));
}
function pasteC(target)
{
    return (e) =>
    {
        target.textContent = e.target.options[e.target.selectedIndex].textContent;
    }
}

Если один раз кликнуть на любой div и потом выбрать в select, то содержимое кликнутого div заменяется на выбранное.
Но, если кликнуть на два разных div, то при выборе из select меняется содержимое у всех ранее кликнутых div. Собственно почему это происходит? И второй вопрос – как оставлять для изменения содержимого только последний кликнутый элемент?

One Answer

addEventListener - добавляет обработчик к элементу.

По любому клику на любой див, селекту добавляется обработчик события change, поэтому и срабатывать они будут всегда все вместе по порядку, включая одинаковые обработчики для одного дива. Проверить это можно добавив console.log в обработчик и посмотрев сколько раз он будет вызываться.

Если нужно, чтобы был только одни обработчик, вместо addEventListener проще воспользоваться свойством onchange, в этом случае в один момент времени будет только один такой обработчик.

Answered by Grundy on December 28, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP