Задать вопрос
@AlTerminator

Как сделать, чтобы встроенный обработчик события убрал сам себя?

<DOCTYPE html>
<html>
<head></head>
<body>
<button ontouchstart="gg()" onclick="gg()"></button>
<script>
function gg(){
 if (event.type == "touchstart"){
 //Здесь удалить обработчик клика
 }
}
</script>
</body>
</html>
  • Вопрос задан
  • 802 просмотра
Подписаться 3 Средний 16 комментариев
Решения вопроса 1
wisgest
@wisgest
Не ИТ-специалист
Задача - избавиться навсегда от срабатывания onclick при срабатывании хотя бы раз ontouchstart.

<button ontouchstart="onclick=null; gg()" onclick="gg()">

или, чтобы сбросить onclick лишь однажды:
<button ontouchstart="ontouchstart=onclick; onclick=null; gg()" onclick="gg()">
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
levanufriev
@levanufriev
php, js, jq, mysql, delphi, c++
Если в параметрах функции вы передадите id той кнопки, с которой хотите убрать обработчик, например:
<button id="btn_103" ontouchstart="gg(this.id)" onclick="gg(this.id)"></button>

тогда:
function gg(id){
 if (event.type == "touchstart"){
    $('#'+id).off("touchstart");
 
 }
}

Или, уж совсем:
function gg(id){
   $('#'+id).off(event.type);
}


Но тогда надо где-то взять переменную event - а она ниоткуда не прилетит сама...

Поэтому лучше вешать обработчик события не в самой кнопке, а после неё:
<button id="btn_103" ></button>

$('#btn_103').on("touchstart click", (event)=>{
    // а вот тут уже ваш обработчик, который получит event в качестве переменной!
   // выполняем какие-то действия и отключаем обработчик. 
   // можно вырубить только конкретно использованный обработчик, 
   // а можно так же через пробел строкой указать все, как при назначении
   $(this).off(event.type);
   //поскольку this - это ссылка на DOM element, который запустил событие
   // вместо this можно использовать event.target - они оба ссылаются на одно и то же
} );


Как я понимаю, это задача, чтобы клик сработал единожды, и больше не срабатывал?

Вот тут, собственно, все ответы:
https://api.jquery.com/on/#on-events-selector-data...
Ответ написан
AlexanderK-A
@AlexanderK-A
UTC+10
Доброго дня!

Если я правильно понимаю вопрос, то вы можете воспользоваться сигналом остановки - AbortSignal при назначении обработчика события, например:

<DOCTYPE html>
<html>
<head></head>
<body>
<button ontouchstart="gg()" onclick="gg()"></button>
<script>
  const controller = new AbortController();
  const signal = controller.signal;
  const abort = () => controller.abort();

  document.querySelector('#btn_103')?.addEventListener('click', () => {
    abort();
    // логика для click

  },  { signal } ); // здесь передаем обработчику сигнал остановки

  document.querySelector('#btn_103')?.addEventListener('touch', () => {
    abort();
    // логика для touch

  },  { signal } ); // здесь передаем обработчику сигнал остановки
</script>
</body>
</html>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы