use wasm_bindgen::{prelude::Closure, JsCast}; use web_sys::EventTarget; pub struct EventListenerHandle { target: EventTarget, event_type: &'static str, listener: Closure, } impl EventListenerHandle { pub fn new(target: U, event_type: &'static str, listener: Closure) -> Self where U: Into, { let target = target.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, } } } impl Drop for EventListenerHandle { fn drop(&mut self) { self.target .remove_event_listener_with_callback( self.event_type, self.listener.as_ref().unchecked_ref(), ) .unwrap_or_else(|e| { web_sys::console::error_2( &format!("Error removing event listener {}", self.event_type).into(), &e, ) }); } }