diff --git a/src/html/listener/macros.rs b/src/html/listener/macros.rs
index 957f69036c4..7e1199c1287 100644
--- a/src/html/listener/macros.rs
+++ b/src/html/listener/macros.rs
@@ -17,7 +17,7 @@ macro_rules! impl_action {
use stdweb::web::event::{$type, IEvent};
use stdweb::web::{Element, IEventTarget};
} else if #[cfg(feature = "web_sys")] {
- use gloo::events::EventListener;
+ use gloo::events::{EventListener, EventListenerOptions};
use wasm_bindgen::JsValue;
use web_sys::{$type as WebSysType, Element, EventTarget};
}
@@ -58,7 +58,16 @@ macro_rules! impl_action {
};
cfg_match! {
feature = "std_web" => EventListener(Some(element.add_event_listener(listener))),
- feature = "web_sys" => EventListener::new(&EventTarget::from(element.clone()), $name, listener),
+ feature = "web_sys" => ({
+ // We should only set passive event listeners for `touchstart` and `touchmove`.
+ // See here: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners
+ if $name == "touchstart" || $name == "touchmove" {
+ EventListener::new(&EventTarget::from(element.clone()), $name, listener)
+ } else {
+ let options = EventListenerOptions::enable_prevent_default();
+ EventListener::new_with_options(&EventTarget::from(element.clone()), $name, options, listener)
+ }
+ }),
}
}
}