Javascript 为什么会为无关元素触发此单击事件?
我正在处理此工具提示,如果将鼠标悬停在上面,它将显示工具提示: 但是,如果你(用手指)点击它,它将显示全屏(用于移动支持): 代码如下所示:Javascript 为什么会为无关元素触发此单击事件?,javascript,reactjs,event-handling,Javascript,Reactjs,Event Handling,我正在处理此工具提示,如果将鼠标悬停在上面,它将显示工具提示: 但是,如果你(用手指)点击它,它将显示全屏(用于移动支持): 代码如下所示: export default function Tooltip({ message, children }: Props) { const [showSmallTip, setShowSmallTip] = useState(false); const [showBigTap, setShowBigTip] = useState(fal
export default function Tooltip({ message, children }: Props) {
const [showSmallTip, setShowSmallTip] = useState(false);
const [showBigTap, setShowBigTip] = useState(false);
const ref = useRef(null);
const pos = useBoundingBox(ref);
const handleMouseEnter = useCallback(() => {
setShowSmallTip(true);
}, [setShowSmallTip]);
const handleMouseLeave = useCallback(() => {
setShowSmallTip(false);
}, [setShowSmallTip]);
const handleTap = useCallback(() => {
console.log("TAP!")
setShowBigTip(true);
setShowSmallTip(false);
}, [setShowBigTip]);
const closeFullscreen = useCallback((ev:MouseEvent<HTMLElement>) => {
console.log('CLOSE!!!')
ev.stopPropagation();
setShowBigTip(false);
setShowSmallTip(false);
}, [setShowBigTip]);
const onTap = useTap(handleTap);
return <>
<Wrapper ref={ref} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} {...onTap}>
{children}
</Wrapper>
{showSmallTip ? <End container={SCROLL_ROOT}><StyledTooltip style={{ top: pos.bottom, left: (pos.left + pos.right) / 2 }}>{message}</StyledTooltip></End> : null}
{showBigTap ? <End><FullscreenTip onClick={closeFullscreen}><FullscreenText>{message}</FullscreenText></FullscreenTip></End>:null}
</>
}
我遇到的问题是,当你点击图标时,它会立即打开和关闭全屏工具提示。i、 例如,它打印
TAP!
CLOSE!!!
用一个水龙头
现在我知道touchend
在单击之前会触发,但我不明白为什么这会很重要??如果您查看我对{…onTap}
和onClick={closeFullscreen}
处理程序的位置,它们是兄弟。事件不应该以这种方式冒泡(无论是在本机DOM中还是在本地DOM中),我当然没有点击
,那么全屏到底是如何触发的呢
是一个门户。
尝试调用onTouchEnd
上的ev.preventDefault()
根据touchend
事件是“可取消的”,这意味着您可以使用.preventDefault()
来防止鼠标事件
如果在此事件上调用preventDefault方法,则应防止由与同一活动触摸点关联的任何触摸事件(包括鼠标事件或滚动)引起的任何默认操作
这确实有效,但我仍然不确定为什么.shadow
会收到一个点击事件。我很惊讶,覆盖层甚至会在touchend和click之间渲染,但我认为如果有事件触发它,它会渲染。即便如此,您是否不需要该元素上的mousedown/touchstart事件来触发单击
?。shadow
正在接收一个单击事件,因为有足够的时间渲染它并在之后处理单击事件click
事件是关于一个“点”(移动设备的手指),而mousedown
事件只针对鼠标。我认为这样的决定是出于兼容性的原因。这就是为什么不需要处理mousedown/touchtstart
,click
就足够了。我确实需要一个touchtart事件,但如果我想打消长时间按下、拖动和鼠标事件的折扣,不是吗?我试图找到一个关于此行为的词,但找不到任何有用的词,只有一些人提到这件事。
TAP!
CLOSE!!!