Я хотел бы добавить событие щелчка на веб-странице везде, где буква «W» отображается серым цветом, чтобы после события mouseclick буква оставалась черной в том же месте в области svg, даже после того, как я перемещаю мышь. куда-нибудь еще.
В моем фрагменте JS-кода сейчас не работает неработающая функция addEventListener. В написанном на CSS фрагменте кода style под svg в HTML я могу сделать его черным только для того единственного случая, когда я нажимаю на букву.
Как я могу добиться этого в JS или CSS?
const svg = document.getElementsByTagName('svg');
const text = document.getElementsByTagName('text');
svg.addEventListener('click', () => {
text.style.opacity = 1;
text.style.fill = '#000000';
}); div {
border: 1px solid #000000;
}<div id='paper'>
<svg version='1.1'width = "595" height = "842" xmlns = "http://www.w3.org/2000/svg">
<style>
.text {
font-family: Sans-serif;
font-size: x-large;
fill: #D3D3D3;
opacity: 0;
cursor: none;
}
.text:hover {
opacity: 1;
}
.text:active {
fill: #000000;
opacity: 1;
}
</style>
<text x = "70" y = "97" class = "text">W</text>
<text x = "70" y = "100" class = "text">W</text>
<text x = "70" y = "103.5" class = "text">W</text>
<text x = "70" y = "107" class = "text">W</text>
<text x = "70" y = "110.5" class = "text">W</text>
<text x = "70" y = "114" class = "text">W</text>
<text x = "70" y = "117.5" class = "text">W</text>
<text x = "70" y = "121" class = "text">W</text>
<text x = "70" y = "124.5" class = "text">W</text>
<text x = "70" y = "128" class = "text">W</text>
<text x = "70" y = "131.5" class = "text">W</text>
</svg>
</div>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проверьте вывод консоли, она должна выдать ошибку, чтобы помочь вам правильно. getElementsByTagName возвращает коллекцию, см. пример здесь: https://www.w3schools.com/jsref/met_document_getelementsbytagname.asp
Итак, вы должны использовать цикл для добавления прослушивателя событий ко всем элементам svg и еще один цикл для изменения каждого текстового элемента. Я бы предложил использовать некоторые библиотеки, такие как JQuery, чтобы упростить работу со слушателями.
Я думаю, что то, что вы хотите, может быть достигнуто с помощью этого кода:
const svgColl = document.getElementsByTagName('svg');
const textColl = document.getElementsByClassName('text');
for (let i = 0; i < svgColl.length; i++) {
svgColl[i].addEventListener('click', () => {
for (let i = 0; i < textColl.length; i++) {
textColl[i].style.opacity = 1;
textColl[i].style.fill = '#000000';
}
});
}
Вы также можете добавить прослушиватель событий к элементам с текстовым классом вместо всего тега svg.
Вы должны отметить:
getElementsByTagName() возвращает массив, поэтому вам следует выбрать первый элемент по [0]
назначение свойств CSS с помощью JS устарело, лучше добавить классы, которые применяют изменения, как это сделал я.
назначив класс родительскому элементу, вы можете применить изменения ко всем его дочерним элементам.
Почему вы использовали css внутри html, когда у вас был файл css (что я подумал, глядя на ваш html: вам не нужно использовать элемент css внутри, чтобы применить его изменения.)
const svg = document.getElementsByTagName('svg')[0];
svg.addEventListener('click', () => {
svg.classList.add('active')
}) div {
border: 1px solid #000000;
}
.text {
font-family: Sans-serif;
font-size: x-large;
fill: #D3D3D3;
opacity: 0;
cursor: none;
}
svg.active .text{
opacity: 1;
fill: #000;
}<div id='paper'>
<svg version='1.1'width = "595" height = "842" xmlns = "http://www.w3.org/2000/svg">
<text x = "70" y = "97" class = "text">W</text>
<text x = "70" y = "100" class = "text">W</text>
<text x = "70" y = "103.5" class = "text">W</text>
<text x = "70" y = "107" class = "text">W</text>
<text x = "70" y = "110.5" class = "text">W</text>
<text x = "70" y = "114" class = "text">W</text>
<text x = "70" y = "117.5" class = "text">W</text>
<text x = "70" y = "121" class = "text">W</text>
<text x = "70" y = "124.5" class = "text">W</text>
<text x = "70" y = "128" class = "text">W</text>
<text x = "70" y = "131.5" class = "text">W</text>
</svg>
</div>Надеюсь, я помог ^_^
Ваш последний комментарий помог! Я подумал об этом, прежде чем задавать здесь свои вопросы, так что да, все нужно поместить в файл css. Спасибо!
Неудачная функция
addEventListenerпозволяет мне подумать о том, чтобы поместить ее во весь тег svg, что тоже не удалось. Его следует поместить в текстовый класс, как вы упомянули в последней строке. Спасибо!