Eventi personalizzati in JavaScript

Spesso può rivelarsi utile creare degli eventi personalizzati oltre a quelli esistenti. Il metodo più semplice funziona così:

var event = new CustomEvent('nomeEvento');
// Ascoltiamo su un elemento:
elem.addEventListener('nomeEvento', function(e){...});
// Trigger:
event.dispatchEvent(event);

Questo metodo funziona su tutti browser più moderni – tranne Internet Explorer. Per funzionare anche con browser antiquati e in IE, dobbiamo usare anche qualche metodo alternativo:

function creaEvento(eventType) {
    try {
        return new CustomEvent(eventType);
    } catch (error) { // CustomEvent non supportato
        if (document.createEvent && document.createEvent.initEvent) {
            // browser vecchi
            var ev = document.createEvent("HTMLEvents");
            ev.initEvent(eventType, true, true);
        } else if (document.createEventObject) {
            // IE
            var ev = document.createEventObject();
            ev.eventType = eventType;
        } else {
            return false;
        }

        return ev;
    }
}

A questo punto, però bisogna tenere a mente che gli eventi creati con createEventObject non hanno il metodo dispatchEvent, ma usano fireEvent.

function triggerEvento(element, event) {
    if (element.dispatchEvent) {
        element.dispatchEvent(event);
    } else if (element.fireEvent) {
        element.fireEvent("on" + event.eventType, event);
    } else {
        return false;
    }
    return true;
}

Possiamo così creare e usare i nostri eventi personalizzati!