返回

浅析移动端引入 fastclick 导致 antd select 双击触发的问题

前端

在移动端开发中,优化用户体验是至关重要的。然而,当同时引入 fastclick.js 和 ant-design 中的 select 组件时,iOS 设备上的 select 组件会出现需要双击才能触发的异常现象。本文将深入分析这一问题,并提供一种切实可行的解决方案。

问题根源

fastclick.js 是一种 JavaScript 库,它通过消除移动端设备上的延迟来优化点击事件处理。它使用 touch 事件来触发点击,从而缩短了点击延迟时间。

然而,antd select 组件依赖于 click 事件来触发下拉菜单。当引入 fastclick.js 时,click 事件会被 fastclick 劫持,从而导致双击才能触发下拉菜单的问题。

解决方案

要解决此问题,需要在 fastclick.js 和 antd select 组件之间建立一个兼容机制。具体步骤如下:

  1. 为 select 组件添加一个自定义事件 :在 select 组件中添加一个名为 mySelectClick 的自定义事件,该事件在 click 事件触发时被触发。

  2. 修改 fastclick.js :在 fastclick.js 中,修改事件监听器,以便在触发 click 事件时也触发 mySelectClick 自定义事件。

具体代码如下:

// 修改 fastclick.js
addEventListener(element, 'click', function(event) {
  fastclick.fireEvent(event.target, 'mySelectClick');
  fastclick.fireEvent(event.target, 'click');
}, false);
  1. 监听 mySelectClick 事件 :在 select 组件中,监听 mySelectClick 事件,并在触发时打开下拉菜单。

具体代码如下:

// 修改 antd select 组件
useEffect(() => {
  const element = ReactDOM.findDOMNode(selectRef.current);
  element.addEventListener('mySelectClick', () => {
    // 打开下拉菜单
  });
  return () => {
    element.removeEventListener('mySelectClick');
  };
}, [selectRef]);

通过以上步骤,可以在引入 fastclick.js 的情况下,正常使用 antd select 组件。

结论

通过分析问题根源并采取适当的解决方案,可以轻松解决移动端引入 fastclick 导致 antd select 双击触发的异常现象。这不仅优化了移动端用户的体验,也为开发者提供了在实际开发中遇到的问题提供了一种实用的解决思路。