use wasm_bindgen::{prelude::Closure, JsCast}; use web_sys::{EventListenerOptions, EventTarget}; pub struct EventListenerHandle { target: EventTarget, event_type: &'static str, listener: Closure, options: EventListenerOptions, } impl EventListenerHandle { pub fn new(target: &U, event_type: &'static str, listener: Closure) -> Self where U: Clone + Into, { let target = target.clone().into(); target .add_event_listener_with_callback(event_type, listener.as_ref().unchecked_ref()) .expect("Failed to add event listener"); EventListenerHandle { target, event_type, listener, options: EventListenerOptions::new(), } } } impl Drop for EventListenerHandle { fn drop(&mut self) { self.target .remove_event_listener_with_callback_and_event_listener_options( self.event_type, self.listener.as_ref().unchecked_ref(), &self.options, ) .unwrap_or_else(|e| { web_sys::console::error_2( &format!("Error removing event listener {}", self.event_type).into(), &e, ) }); } }