Мне нужно отображать разные выходные данные в соответствии с каждым щелчком по разному значку без определения отдельных функций;
HTML:
<p onclick = "expand()" id = "i1">icon1</p>
<p onclick = "expand()" id = "i2">icon2</p>
<p onclick = "expand()" id = "i3">icon3</p>
<div id = "blocki1"></div>
<div id = "blocki2"></div>
<div id = "blocki3"></div>
Могу я сделать что-то подобное с JS?
function expand() {
document.getElementById("block" + this.id).style.display = "block";
}
Я пробовал описанный выше метод, который, по-видимому, не сработал, мне нужно: а) сохранить идентификатор значка и б) объединить идентификатор со строкой. Не уверен, возможно ли это.



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


Вам нужно передать некоторые данные (например, ссылку на объект, его имя или что-то еще, что вам нужно) в функцию, которую вы вызываете.
Например, посмотрите пример кода из https://www.w3schools.com/jsref/event_onclick.asp
<p onclick = "myFunction(this, 'red')">Click me to change my text color.</p>
<script>
function myFunction(elmnt,clr) {
elmnt.style.color = clr;
}
</script>
<p onclick = "expand(this.id) id = "i1">icon1</p>
<p onclick = "expand(this.id) id = "i2">icon2</p>
<p onclick = "expand(this.id) id = "i3">icon3</p>
<div id = "blocki1"></div>
<div id = "blocki2"></div>
<div id = "blocki3"></div>
<script>
function expand(e) {
document.getElementById("block" + e).style.display = "block";
}}
</script>
Во-первых .. У вас 4 опечатки. Первые 3 - это то, что у вас нет закрытия " после onclick = "expand()
<p onclick = "expand() id = "i1">icon1</p>
<!-- There needs to be " after expand() -->
Последняя опечатка - у вас есть лишний закрывающий } после функции раскрытия.
Теперь, поскольку вы не используете addEventListener API, значение этого не будет установлено в вашей функции expand.
Итак, вам нужно передать текущий элемент в качестве параметра функции.
<p onclick = "expand(this)" id = "i1">icon1</p>
<p onclick = "expand(this)" id = "i2">icon2</p>
<p onclick = "expand(this)" id = "i3">icon3</p>
<div id = "blocki1">blocki1</div>
<div id = "blocki2">blocki2</div>
<div id = "blocki3">blocki3</div>
(Добавлен текст-заполнитель в div, чтобы проверить, работает ли это)
Наконец, получите доступ к текущему элементу в вашей функции в качестве первого параметра.
function expand(el) {
document.getElementById("block" + el.id).style.display = "block";
}
Это похоже на решение @ajith :) Также спасибо за выяснение опечаток.
Я мог бы подойти к этому несколько иначе, удалив встроенный JS и используя классы и атрибуты данных. Здесь у меня есть классы и атрибуты данных для всех элементов. Я прикрепляю прослушиватели событий щелчка к «кнопкам», которые вызывают функцию handleClick. Эта функция проверяет атрибут id данных кнопки и захватывает соответствующий слайд, добавляя класс «шоу» в свой список классов.
const buttons = document.querySelectorAll('.button');
buttons.forEach(button => {
button.addEventListener('click', handleClick, false);
});
function handleClick(e) {
const id = e.target.dataset.id;
const slide = document.querySelector(`.slide[data-id = "${id}"]`);
slide.classList.add('show');
}.slide {
display: none;
}
.show {
display: block;
}<p class = "button" data-id = "1">icon1</p>
<p class = "button" data-id = "2">icon2</p>
<p class = "button" data-id = "3">icon3</p>
<div class = "slide" data-id = "1">blocki1</div>
<div class = "slide" data-id = "2">blocki2</div>
<div class = "slide" data-id = "3">blocki3</div>Вашему коду должно понравиться это
<p onclick = "expand(this) id = "i1">icon1</p>
<p onclick = "expand(this) id = "i2">icon2</p>
<p onclick = "expand(this) id = "i3">icon3</p>
<div id = "blocki1"></div>
<div id = "blocki2"></div>
<div id = "blocki3"></div>
<script>
function expand(elm) {
document.getElementById("block" + elm.id).style.display = "block";
}
</script>
Если вы новичок, я бы посоветовал вам избегать практики добавления обработчиков в HTML, прежде чем это станет вашим отношением к кодированию.
Вместо этого добавьте для них прослушиватели событий в js. Разделение интересов - действительно большая теория.
А с this в обработчиках событий относительно легко справиться.
Подробнее об этом можно прочитать здесь
var ps = Array.from(document.querySelectorAll("p"));
for(var i=0; i< ps.length; i++){
ps[i].addEventListener(("click"), function(){
document.getElementById("block" + this.id).style.display = "block";
})
}div{
display: none;
}<p id = "i1">icon1</p>
<p id = "i2">icon2</p>
<p id = "i3">icon3</p>
<div id = "blocki1">This is 1</div>
<div id = "blocki2">This is 2</div>
<div id = "blocki3">This is 3</div>Ага, я новичок. Извините, но я не знаю, для чего нужен цикл?
document.querySelectorAll("p") дает вам список узлов всех подходящих элементов. Итак, вам нужно добавить слушателя ко всем узлам в списке узлов / Вот почему существует цикл
Это
document.getElementById("block" + this.getAttribute('id')?