uniapp 滚动时不触发input失焦事件如何解决?
在uniapp开发中,页面滚动时input输入框无法正常触发失焦事件,导致键盘无法收起。尝试了@blur事件和手动调用uni.hideKeyboard(),但在滚动过程中依然失效。请问如何确保滚动时能正确触发input失焦?需要兼容iOS和Android平台。
2 回复
在input外层包个scroll-view,用@scroll事件替代页面滚动监听。或者用focus事件记录状态,手动处理失焦逻辑。
在 UniApp 中,滚动时 input 失焦事件不触发是常见问题,通常是由于滚动行为与输入框焦点管理冲突导致的。以下是几种解决方案:
1. 使用 @blur 事件并手动处理焦点
在 input 组件上绑定 @blur 事件,并结合 focus 状态控制:
<template>
<view>
<input
:focus="isFocused"
@blur="onBlur"
placeholder="输入内容"
/>
<scroll-view scroll-y @scroll="onScroll">
<!-- 其他内容 -->
</scroll-view>
</view>
</template>
<script>
export default {
data() {
return {
isFocused: false
};
},
methods: {
onBlur() {
// 失焦处理逻辑
this.isFocused = false;
},
onScroll() {
// 滚动时强制失焦
this.isFocused = false;
}
}
};
</script>
2. 使用 scroll-view 替代页面滚动
将页面内容包裹在 scroll-view 中,通过其事件控制:
<scroll-view scroll-y @scroll="handleScroll">
<input @blur="onInputBlur" />
<!-- 其他内容 -->
</scroll-view>
3. 动态调整输入框位置
在聚焦时调整布局,避免滚动干扰:
methods: {
onInputFocus() {
// 聚焦时可能需调整页面布局
},
onInputBlur() {
// 失焦后恢复布局
}
}
4. 使用定时器延迟处理(临时方案)
onScroll() {
setTimeout(() => {
// 强制失焦逻辑
}, 100);
}
推荐方案:
优先采用 方案1,结合 @blur 和手动焦点控制,兼容性较好。若问题持续,检查 UniApp 版本并考虑升级。
注意:不同平台(如 iOS/Android)可能存在差异,建议真机测试。

