AngleSharp by Florian Rappl

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

.NET API 1,171,968 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; namespace AngleSharp.Dom { 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; foreach (RegisteredEventListener registeredEventListener in array2) { if (_listeners.Contains(registeredEventListener) && !(registeredEventListener.Type != type)) { if (ev.Flags.HasFlag(EventFlags.StopImmediatePropagation)) break; if ((!registeredEventListener.IsCaptured || phase != EventPhase.Bubbling) && (registeredEventListener.IsCaptured || phase != EventPhase.Capturing)) registeredEventListener.Callback(currentTarget, ev); } } } internal bool HasEventListener(string type) { foreach (RegisteredEventListener listener in _listeners) { if (listener.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(ErrorCode.InvalidState); ev.IsTrusted = false; return ev.Dispatch(this); } } }