From 6d04e7243e8e0958eec473429f0f4563bc8e41b9 Mon Sep 17 00:00:00 2001 From: Nicolas Gallagher Date: Mon, 5 Oct 2020 15:33:50 -0700 Subject: [PATCH] [fix] Don't propagate click or contextmenu events on disabled elements This patch fixes the PressResponder to avoid propagating click and contextmenu events in all circumstances. It also prevents click propagating for focusable elements that are disabled, mirroring the behavior of native buttons when disabled. Fix #1757 --- .../src/hooks/usePressEvents/PressResponder.js | 3 ++- .../react-native-web/src/modules/createDOMProps/index.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/react-native-web/src/hooks/usePressEvents/PressResponder.js b/packages/react-native-web/src/hooks/usePressEvents/PressResponder.js index 327cdc20..915adbe1 100644 --- a/packages/react-native-web/src/hooks/usePressEvents/PressResponder.js +++ b/packages/react-native-web/src/hooks/usePressEvents/PressResponder.js @@ -388,8 +388,8 @@ export default class PressResponder { } else if (onPress != null && event.ctrlKey === false && event.altKey === false) { onPress(event); } - event.stopPropagation(); } + event.stopPropagation(); }, // If `onLongPress` is provided and a touch pointer is being used, prevent the @@ -399,6 +399,7 @@ export default class PressResponder { if (!disabled && onLongPress != null && this._isPointerTouch && !event.defaultPrevented) { event.preventDefault(); } + event.stopPropagation(); } }; } diff --git a/packages/react-native-web/src/modules/createDOMProps/index.js b/packages/react-native-web/src/modules/createDOMProps/index.js index 1c5e65f5..fbd1ecdf 100644 --- a/packages/react-native-web/src/modules/createDOMProps/index.js +++ b/packages/react-native-web/src/modules/createDOMProps/index.js @@ -229,7 +229,10 @@ const createDOMProps = (component, props) => { const onClick = domProps.onClick; if (onClick != null) { if (disabled) { - domProps.onClick = undefined; + // Prevent click propagating if the element is disabled. See #1757 + domProps.onClick = function(e) { + e.stopPropagation(); + }; } else if (!isNativeInteractiveElement) { // For native elements that are focusable but don't dispatch 'click' events // for keyboards.