@AlTerminator

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

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

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

или, чтобы сбросить onclick лишь однажды:
<button ontouchstart="ontouchstart=onclick; onclick=null; gg()" onclick="gg()">
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
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>
Ответ написан
Комментировать
muscimolus
@muscimolus
Так это не делается. Запомни элемент, назначь строковый обработчик, и в конце этого обработчика назначь этому же обработчику то же событие, но со значением null.

P.S. Если примером, то так:
<html>
    <head></head>
    <body>
        <button id="someButton">Click me</button>
        <script type="module">
            const someButton = document.querySelector('#someButton')
            someButton.onclick = e => {
                console.log(e)
                // сам себя открепляет
                someButton.onclick = null
            }
        </script>
    </body>
</html>

После того, как ты используешь обработчик - ты его затрёшь в элементе значением null.
Но я бы на твоём месте посмотрел в сторону addEventListener с параметром once: true, т.к. на одной кнопке может висеть как одно событие, так и несколько побочных которые, которые никогда не открепятся.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы