AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.9" />

.NET API 1,181,184 bytes

 EventTarget

public abstract class EventTarget : IEventTarget
Event target base of all DOM nodes.
using AngleSharp.Dom.Events; using AngleSharp.Html; using System.Collections.Generic; using System.Diagnostics; namespace AngleSharp.Dom { [DebuggerStepThrough] public abstract class EventTarget : IEventTarget { private struct RegisteredEventListener { public string Type; public DomEventHandler Callback; public bool IsCaptured; } private readonly List<RegisteredEventListener> _listeners; public EventTarget() { _listeners = new List<RegisteredEventListener>(); } public void AddEventListener(string type, DomEventHandler callback = null, bool capture = false) { if (callback != null) _listeners.Add(new RegisteredEventListener { Type = type, Callback = callback, IsCaptured = capture }); } public void RemoveEventListener(string type, DomEventHandler callback = null, bool capture = false) { if (callback != null) _listeners.Remove(new RegisteredEventListener { Type = type, Callback = callback, IsCaptured = capture }); } internal void CallEventListener(Event ev) { string type = ev.Type; RegisteredEventListener[] array = _listeners.ToArray(); IEventTarget currentTarget = ev.CurrentTarget; EventPhase phase = ev.Phase; RegisteredEventListener[] array2 = array; for (int i = 0; i < array2.Length; i++) { RegisteredEventListener item = array2[i]; if (_listeners.Contains(item) && !(item.Type != type)) { if (ev.Flags.HasFlag(EventFlags.StopImmediatePropagation)) break; if ((!item.IsCaptured || phase != EventPhase.Bubbling) && (item.IsCaptured || phase != EventPhase.Capturing)) item.Callback(currentTarget, ev); } } } internal bool HasEventListener(string type) { foreach (RegisteredEventListener listener in _listeners) { RegisteredEventListener current = listener; if (current.Type == type) return true; } return false; } public bool Dispatch(Event ev) { if (ev == null || ev.Flags.HasFlag(EventFlags.Dispatch) || !ev.Flags.HasFlag(EventFlags.Initialized)) throw new DomException(DomError.InvalidState); ev.IsTrusted = false; return ev.Dispatch(this); } } }