Только запустить событие один раз? - PullRequest
19 голосов
/ 03 августа 2010

Как я могу контролировать запуск события только один раз?

На самом деле, быстрый Google, похоже, намекает на то, что .one помогает ..

Ответы [ 7 ]

34 голосов
/ 17 декабря 2015

Используйте once, если вам не требуется поддержка Internet Explorer:

element.addEventListener(event, func, { once: true });

В противном случае используйте это:

function addEventListenerOnce(target, type, listener, addOptions, removeOptions) {
    target.addEventListener(type, function fn(event) {
        target.removeEventListener(type, fn, removeOptions);
        listener.apply(this, arguments);
    }, addOptions);
}

addEventListenerOnce(document.getElementById("myelement"), "click", function (event) {
    alert("You'll only see this once!");
});
18 голосов
/ 03 августа 2010

Вы можете использовать jQuery one метод , который будет подписываться только на первое появление события.
Например:

$('something').one('click', function(e) {
    alert('You will only see this once.');
});
3 голосов
/ 15 марта 2016

То же, что и ответ рофрола, только другая форма:

    function addEventListenerOnce(element, event, fn) {
        var func = function () {
            element.removeEventListener(event, func);
            fn();
        };
        element.addEventListener(event, func);
    }
2 голосов
/ 12 апреля 2018

Немного улучшенная версия anwser от rofrol:

function addEventListenerOnce(target, type, listener) {
    target.addEventListener(type, function fn() {
        target.removeEventListener(type, fn);
        listener.apply(this, arguments);
    });
}

При использовании apply все аргументы передаются и this работает как положено.

2 голосов
/ 01 ноября 2017

Просто используйте правильную опцию в вызове метода addEventListener:

element.addEventListener(event, func, { once: true })
1 голос
/ 18 августа 2017

Дополнительно вы можете сделать это:

window.addEventListener("click", function handleClick(e) {
    window.removeEventListener("click", handleClick);

    // ...
});
0 голосов
/ 22 октября 2017

Добавлены опции для добавления / удаления прослушивателя событий:

function addEventListenerOnce(target, type, listener, optionsOrUseCaptureForAdd, optionsOrUseCaptureForRemove) {
    const f = event => {
        target.removeEventListener(type, f, optionsOrUseCaptureForRemove);
        listener(event);
    }
    target.addEventListener(type, f, optionsOrUseCaptureForAdd);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...