Получить идентификатор нажатого элемента и включить его в функцию с чистым JS?

Мне нужно отображать разные выходные данные в соответствии с каждым щелчком по разному значку без определения отдельных функций;

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";
}

Я пробовал описанный выше метод, который, по-видимому, не сработал, мне нужно: а) сохранить идентификатор значка и б) объединить идентификатор со строкой. Не уверен, возможно ли это.

Это document.getElementById("block" + this.getAttribute('id')?

deEr. 23.04.2018 11:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
2 769
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Передайте параметры функции

Вам нужно передать некоторые данные (например, ссылку на объект, его имя или что-то еще, что вам нужно) в функцию, которую вы вызываете.

Например, посмотрите пример кода из 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 :) Также спасибо за выяснение опечаток.

pploypiti 23.04.2018 11:47

Я мог бы подойти к этому несколько иначе, удалив встроенный 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>

Ага, я новичок. Извините, но я не знаю, для чего нужен цикл?

pploypiti 23.04.2018 11:54
document.querySelectorAll("p") дает вам список узлов всех подходящих элементов. Итак, вам нужно добавить слушателя ко всем узлам в списке узлов / Вот почему существует цикл
Muhammad Usman 23.04.2018 11:56

Другие вопросы по теме