Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сделать так, чтобы onclick срабатывало только 1 раз? (https://javascript.ru/forum/misc/82988-kak-sdelat-tak-chtoby-onclick-srabatyvalo-tolko-1-raz.html)

javascript_pupil 21.08.2021 20:58

Как сделать так, чтобы onclick срабатывало только 1 раз?
 
Надо сделать защиту от дурака ошибки. Сейчас, при однократном нажатии кнопки значение поля изменяется. Очень желательно, чтобы при повторном нажатии изменений поля не происходило, либо, если это невозможно, при повторном нажатии мыши (скажем более 1 раза) происходило некое событие, например, менялся цвет поля (это я сам сделаю - примера с alert будет достаточно).

Читал stackoverflow, но одобренных решений не нашел.

javascript_pupil 21.08.2021 21:32

Всем спасибо за внимание, нашел! :)

if (!clicked) {
// Set clicked to true
clicked = true;
}


Там ещё были варианты, но этого хватило. :)

Aetae 21.08.2021 21:45

Но идеологически это не правильный вариант. Потому что бесполезное событие продолжает висеть.

Правильно делать так:
element.addEventElistener('click', function() {
  // ...
}, {
  once: true
})

рони 21.08.2021 21:46

Цитата:

Сообщение от javascript_pupil
onclick срабатывало только 1 раз?

element.addEventListener('click', function() {  } , {once : true});

https://learn.javascript.ru/introduction-browser-events

javascript_pupil 21.08.2021 22:55

Цитата:

Сообщение от Aetae
Потому что бесполезное событие продолжает висеть.

Оно может чему-то помешать или навредить?

Вам, экспертам javascript - хорошо, а мне далеко не всё понятно в ваших примерах. При этом в "if" я могу засунуть изменение цвета "псевдокнопки" (тег span), чтобы визуально было понятно, что она уже нажата.

Сейчас мой код выглядит так:
<script>
var clicked = false;

function example1() {

	if (!clicked) {
	// Set clicked to true
	clicked = true;

Здесь выполняем необходимые действия.

	}

}
</script>


Где должна быть указанная Вами и Вашим коллегой строка?

ksa 21.08.2021 23:36

Цитата:

Сообщение от javascript_pupil
Оно может чему-то помешать или навредить?

Не стоит оставлять то, что потом будет не нужно. ;)

Цитата:

Сообщение от javascript_pupil
При этом в "if" я могу засунуть изменение цвета "псевдокнопки" (тег span), чтобы визуально было понятно, что она уже нажата.

Это можно сделать в этом же обработчике или в другом обработчике, который так же навесить после отработки первого события...

Т.е. использовать глобальную переменную для такого дела вообще не стоит. :no:

ksa 21.08.2021 23:37

Цитата:

Сообщение от javascript_pupil
Где должна быть указанная Вами и Вашим коллегой строка?

После собственно определения элемента (в ДОМ), на который и будет навешиваться событие.

ksa 21.08.2021 23:41

Как вариант...
<button id='element'>Тест</button>
<script>
element.addEventListener('click', function() {  
	alert('Меняем')
	element.addEventListener('click', function() {  
		alert('Нет')
	});
} , {once : true});
</script>

javascript_pupil 22.08.2021 06:00

Цитата:

Сообщение от ksa
Как вариант...

Но я не могу использовать "button", а при использовании "span" это не работает.

voraa 22.08.2021 08:52

Все работает со span
<span id='element'>Тест</span>
<script>
element.addEventListener('click', function() { 
    alert('Меняем')
    element.addEventListener('click', function() { 
        alert('Нет')
    });
} , {once : true});
</script>


Часовой пояс GMT +3, время: 21:11.