IOS虚拟键盘弹出后,弹窗的按钮点击不起作用,不会触发click事件

背景

讨论区项目的回复框,使用的是Popup和TextArea做,布局如下图,希望键盘弹出时候,回复框可以紧贴键盘,这点实现起来比较简单,监听resize事件,动态修改popup的这题内容的top值即可,top的计算是document.body.clientHeight - popup中主体内容的高度即可

问题:

ios的键盘弹起时候,"发送"按钮的点击不起作用,"关闭"按钮不起作用,点击蒙层不起作用,就是不会触发click事件

暂时不知道原因,有大佬知道可以告知一下

解决方案:

键盘弹出时候,给按钮和蒙层添加touchstart事件代替click事件即可,重点逻辑:
1. 问题出在ios环境,所以需要是在ios环境才触发touchstart回调,否则直接return
2. 问题出在键盘弹起时候,需要也就是textarea聚焦时候才处理,否则直接return

主要代码图下:

  • 函数isIos判断是ios环境
  • window.visualViewport.addEventListener('resize', handler)监听键盘弹出收起时候,动态设置popup定位
  • processMaskListener是为蒙层添加touchstart事件
  • 为TextArea添加onBlur和onFocus事件,用于判断是否聚焦
  • 为关闭按钮和发送按钮添加onTouchStart事件
javascript 复制代码
useEffect(() => {
  /** 初始化监听 */
  window.visualViewport.addEventListener('resize', handler)
  processMaskListener()
}, [])

/** 判断是ios环境 */
const isIos = () => {
  return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
}

/** 蒙层添加touchstart事件 */
const processMaskListener = () => {
  status = ""
  const mask = document.getElementsByClassName('adm-mask')[0]
  if (!mask) { return }
  mask.addEventListener('touchstart', () => {
    if (isIos() && status === "focus") {
      maskClickWillDo()
    }
  }, false)
}

const  handler = () => {
  const popTop = document.body.clientHeight - document.getElementsByClassName('pop-input')[0].parentNode.clientHeight
  setPopStyle(popTop)
}

return (
  <React.Fragment>
    <Popup
      className='reply-pop'
      destroyOnClose={true}
      visible={visible}
      onMaskClick={() => maskClickWillDo()}
    >
      <div className="pop-input">
        <div className="input-title">
          <img
            className="input-close"
            alt=""
            src={closeImg}
            onTouchStart={() => {
              if (isIos() && status === "focus") {
                maskClickWillDo()
              }
            }}
            onClick={() => maskClickWillDo()}
          />
          <div
            className={inputValue ? 'commit' : 'commit no-commit'}
            onTouchStart={() => {
              if (isIos() && status === "focus") {
                onsole.log('%c [ onTouchStart执行了 ]-96', 'font-size:13px; background:pink; color:#bf2c9f;', )
                prop.onSendFunc(inputValue)
              }
            }}
            onClick={() => {
              console.log('%c [ onClick执行了 ]-101', 'font-size:13px; background:pink; color:#bf2c9f;', )
              prop.onSendFunc(inputValue)
            }}
          >
            {prop.btnText ? prop.btnText : "发送"}
          </div>
        </div>
        <div className='btn-style'>
          <TextArea
            id='textId'
            ref={inputRef}
            value={inputValue}
            rows={5}
            placeholder={prop.answerText ? prop.answerText : "我也来说两句.."}
            onChange={(e) => {
              setInputValue(e)
            }}
            onBlur={() => status = "blur"}
            onFocus={() => status = "focus"}
          />
        </div>
      </div>
    </Popup>
  </React.Fragment>
)

键盘弹起时候,点击发送按钮

相关推荐
阿祖zu2 小时前
芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App
前端·后端·ios
GitLqr9 小时前
iOS 27 强制要求 UISceneDelegate:UIKit 和 Flutter 开发者该如何应对?
flutter·ios·全栈
屑曦晨12 小时前
PKToolPicker工具栏图标错误模糊问题排查报告
ios
2501_9159214312 小时前
详细解析,iOS 应用上架 App Store 的完整流程与指南
android·ios·小程序·https·uni-app·iphone·webview
2501_9151063212 小时前
SwiftUI项目创建详解:使用Xcode从零开始创建第一个App项目
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
2501_9159184113 小时前
Xcode调试iOS应用内存管理与优化,识别泄漏与性能监控指南
android·ios·小程序·uni-app·cocoa·iphone·xcode
97650333515 小时前
iOS 上架/审核 4.3a Cocos 2026最新方案解读
flutter·ios·swift·cocos2d·ios开发
2501_9160074715 小时前
IDE 是什么?集成开发环境详解与 iOS 开发选型指南
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
梦想的颜色15 小时前
UniApp 四端对齐实战:iOS App / Android App / 小程序 / H5 兼容坑点与完整解决方案|AI 辅助多端落地
android·ios·小程序·uni‑app·uniapp 四端适配·多端兼容·ai 生成 uni‑app
CocoaKier1 天前
喜大普奔!2027年春季起,iOS提审最低支持iOS15.0以上
ios·apple