兼容性ios、安卓值input 以及fixed

 1.好久没解决兼容性的问题了。

研究了ios系统的上滑机制和安卓的上滑机制他是不一样的;

ios:是可视窗口向上顶上去了。

安卓:是可视窗口缩小了。

fixed定位ios只能依靠客户端了。这里不想多说啥。js解决不了。除非改造系统去吧。

 首先判断ios安卓机型代码如下:

var ua = window.navigator.userAgent.toLocaleLowerCase();

var isIOS = /iphone|ipad|ipod/.test(ua);

var isAndroid = /android/.test(ua);

ios存在问题:场景:一个页面有好多个input框;input拉起软键盘 - 收起的时候,input框会被遮挡。

 经过反复自测:得出的结论

下面的$input是document.querySelectorAll('.ininput');
var u = navigator.userAgent;
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
 
var oldh = 0;//初始化scrollTop位置
if (!isAndroid) {
 // IOS 键盘弹起:IOS 和 Android 输入框获取焦点键盘弹起
  $input.addEventListener('focus', function () {
      console.log('IOS 键盘弹起啦!');
      oldh = document.documentElement.scrollTop || document.body.scrollTop || 0;//
 }, false)

 // IOS 键盘收起:IOS 点击输入框以外区域或点击收起按钮,输入框都会失去焦点,键盘会收起,
 $input.addEventListener('blur', () => {
    console.log('IOS 键盘收起啦!'); 
    // IOS 键盘收起后操作
    setTimeout(() => { 
         const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0;
        var jp = scrollHeight-oldh;
        window.scrollTo(0, document.documentElement.scrollTop-jp);
    }, 500); 
  })
 }

 

微信ios中:拉起软键盘回复到原位置的问题网络上是这么描述的我这里不是很赞同,这里其实是解决当软键盘收起之后输入框下面的留白用这个可以解决:

$("input,select").blur(function(){

  setTimeout(function(){ 
    
  const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0;

      window.scrollTo(0, Math.max(scrollHeight - 1, 0));

    }, 100
 );

})

 

接下来说说安卓的,安卓:键盘拉起可视窗口会变小。

场景:拉起输入框的时候会被遮挡。

查看了网上的说法也是用:document.activeElement.scrollIntoViewIfNeeded();

 还是可用的,但是针对一些特殊的场景还是需要根据实际情况加工一下的。

 

### 已知问题分析 在 UniApp 中开发时,可能会遇到输入框(`<input>` 或 `<textarea>`)在手机键盘弹出后无法正常获取的情况。这种现象可能与以下几个因素有关: 1. **iOS 和 Android 的兼容性差异**:不同平台对软键盘的行为处理方式存在差异[^2]。 2. **输入框的绑定机制**:如果使用了某些框架组件(如 `u-view`),可能存在事件冲突或数据同步延迟的问题[^3]。 3. **键盘高度计算错误**:部分情况下,键盘的高度未正确传递给页面逻辑层,可能导致输入框位置异常或失去焦点[^4]。 --- ### 解决方案 #### 方法一:优化输入框绑定方式 通过原生的 `@input` 事件替代双向绑定 (`v-model`) 来捕获用户的输入内容。这种方式能够有效减少因框架封装而导致的数据更新滞后问题。 ```vue <input type="text" class="flex-1 ml-2" placeholder="请输入内容" autocomplete="off" always-embed="true" adjust-position="true" cursor-spacing="30" @input="handleInput" /> ``` 其中,`handleInput` 函数用于实时监听用户输入的内容: ```javascript methods: { handleInput(event) { const inputValue = event.detail.value; console.log('当前输入:', inputValue); this.inputValue = inputValue; // 将赋给 Vue 数据模型 } } ``` --- #### 方法二:调整页面布局防止输入框被遮挡 为了确保输入框不会因为键盘弹出而被遮挡,可以通过监听 `@focus` 和 `@blur` 事件动态调整输入框的位置。 以下是具体实现代码: ```html <template> <view class="container"> <!-- 页面头部 --> <view class="header">聊天室</view> <!-- 聊天消息区域 --> <scroll-view scroll-y class="message-area"></scroll-view> <!-- 输入框 --> <view :style="{ bottom: keyboardHeight + 'px' }" class="input-container"> <input type="text" placeholder="发送消息..." @focus="onFocus" @blur="onBlur" /> </view> </view> </template> <script> export default { data() { return { keyboardHeight: 0, // 键盘高度 }; }, methods: { onFocus(e) { const { height } = e.detail; // 获取键盘高度 this.keyboardHeight = height || 0; }, onBlur() { this.keyboardHeight = 0; // 键盘收起时重置高度 } } }; </script> <style scoped> .container { display: flex; flex-direction: column; height: 100vh; } .header { height: 80px; background-color: #f5f5f5; } .message-area { flex-grow: 1; overflow-y: auto; } .input-container { position: fixed; width: 100%; padding: 10px; box-sizing: border-box; transition: all 0.3s ease-in-out; } </style> ``` 上述代码的关键在于利用 `e.detail.height` 动态获取键盘高度,并将其应用到输入框容器的样式中,从而避免输入框被遮挡。 --- #### 方法三:强制嵌入模式 (always-embed=true) 对于 iOS 设备,在某些场景下默认行为会导致输入框无法正确响应键盘事件。此时可以在输入框上添加 `always-embed="true"` 属性,强制将输入框嵌入到 WebView 中运行。 示例代码如下: ```html <input type="text" always-embed="true" adjust-position="true" cursor-spacing="30" @input="handleInput" /> ``` 此属性的作用是让输入框始终处于嵌入状态,而不是依赖于系统的全局键盘管理器。 --- ### 总结 综合以上三种方法,推荐优先尝试以下步骤来解决问题: 1. 使用 `@input` 替代 `v-model` 绑定,确保输入能及时被捕获; 2. 添加 `always-embed="true"` 和 `adjust-position="true"` 属性以增强跨平台兼容性; 3. 如果仍存在问题,则可通过动态监听 `@focus` 和 `@blur` 事件调整输入框位置。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值