EventTarget
Event target base of all DOM nodes.
using AngleSharp.Dom.Events;
using AngleSharp.Extensions;
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 List<RegisteredEventListener> _listeners;
private List<RegisteredEventListener> Listeners => _listeners ?? (_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
});
}
public void RemoveEventListeners()
{
if (_listeners != null)
_listeners.Clear();
}
public void InvokeEventListener(Event ev)
{
if (_listeners != null) {
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.Is(type)) {
if ((ev.Flags & EventFlags.StopImmediatePropagation) == EventFlags.StopImmediatePropagation)
break;
if ((!registeredEventListener.IsCaptured || phase != EventPhase.Bubbling) && (registeredEventListener.IsCaptured || phase != EventPhase.Capturing))
registeredEventListener.Callback(currentTarget, ev);
}
}
}
}
public bool HasEventListener(string type)
{
if (_listeners != null) {
foreach (RegisteredEventListener listener in _listeners) {
if (listener.Type.Is(type))
return true;
}
}
return false;
}
public bool Dispatch(Event ev)
{
if (ev == null || (ev.Flags & EventFlags.Dispatch) == EventFlags.Dispatch || (ev.Flags & EventFlags.Initialized) != EventFlags.Initialized)
throw new DomException(DomError.InvalidState);
ev.IsTrusted = false;
return ev.Dispatch(this);
}
}
}