el-select 在iOS手机上,无法唤起软键盘以及二次点击问题

news/2024/7/20 22:12:56 标签: elementui, el-select, ios, vue

问题

element UI 中有一个el-select组件。我们经常用它来实现下拉框功能。 但是在手机上使用时,发现iOS手机上,该组件无法唤起软键盘。

主要是因为 组件中,input上有一个readonly 属性,而该属性规定输入字段为只读。阻止了用户对值进行修改,直到满足某些条件才行。

方案

// 本案例只为处理兼容问题,不包含其他复杂逻辑
<template>
    <el-select
        ref="select"
        @focus="clear"
        @hook:mounted="clear"
        @visible-change="clear"
    >
    </el-select>
</template>
<script>
    export default {
        methods: {
            clear(async) {
                this.$nextTick(() => {
			        if (!async) {
			          // ios 手机有延迟问题
			          setTimeout(() => {
			            const { select } = this.$refs
			            const input = select.$el.querySelector('.el-input__inner')
			            input.removeAttribute('readonly')
			          }, 200)
			        }
			     })
            }
        }
    }
</script>

二次点击问题

el-select下拉选项在ios上,需要点击2次才能选中(通过css解决,需确保css样式全局作用域)

// App.vue
<style lang="scss">
 // to fix 在ios设备中,el-select组件下拉框,点击2次才能选中问题。
 .el-scrollbar .el-scrollbar__bar {
    opacity: 1 !important;
 }
</style

完成以上操作就可以正常使用了。

clearable 清空问题

如果el-select 还增加了clearable清空功能,会发现当你点击选中时,首先会出现清空按钮,二次点击才能弹出软键盘。

// 我们增加一个 showClose,用来控制 clearable 显示隐藏。

<template>
    <el-select
        ref="select"
        @focus="clear"
        :clearable="showClose"
        @hook:mounted="clear"
        @visible-change="clear"
        @blur.native.capture="onblur"
    >
    </el-select>
</template>
<script>
    export default {
    	data(){
    		return{
    			showfalse:false,
    		}
    	},
        methods: {
            clear(onOff) {
            	if (onOff) { // 打开下拉框 显示可清空按钮
					this.showClose = true
				}
				this.$nextTick(() => {
			        if (!async) {
			          // ios 手机有延迟问题
			          setTimeout(() => {
			            const { select } = this.$refs
			            const input = select.$el.querySelector('.el-input__inner')
			            input.removeAttribute('readonly')
			          }, 200)
			        }
			     })
                
            },
            // 失去焦点时,需要把软键盘收起
			onblur() {
				setTimeout(() => {
					if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { //判断iPhone|iPad|iPod|iOS
						this.$refs.select.blur();
					}
					this.showClose = false
			}
        }
    }
</script>


这种办法

其实我个人觉得,在移动端也不太需要clearable功能,因此我做了一个判断。在移动端的情况下,clearable 值设为 false

 mounted () {
    if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { // 判断iPhone|iPad|iPod|iOS
      this.showClose = false
    }
  }

http://www.niftyadmin.cn/n/1558047.html

相关文章

webpack4 学习第一天

第一步&#xff1a; 安装npm 第二步&#xff1a; 新建文件夹webpackDemo文件夹&#xff0c;通过cmd进入到这个项目文件夹下&#xff0c;输入npm init 初始化。 第三步&#xff1a; 安装webpack (非全局),webpack-cli(非全局) npm install --save-dev webpack npm install --sav…

Vue3 中使用组合式API替换mixins,实现代码复用并解决隐患

我们在vue mixin混入–基础中聊过mixins可以使我们的代码进行复用&#xff0c;非常的灵活方便。 但是在vue3中却不推荐使用了&#xff0c;因为它存在一些问题。 mixins问题 不清晰的数据来源&#xff1a;当使用了多个 mixin 时&#xff0c;实例上的数据属性来自哪个 mixin 变…

三剑客”之Swarm探索应用集群服务发布

1.前言 在前两篇文章中&#xff0c;大家了解了swarm集群的管理、数据的持久化等技术点。大家可能会问&#xff0c;我会了这些有啥用&#xff1f;公司的业务大多数是跑在nginx、tomcat、php等这些集群应用中&#xff0c;技术是死的&#xff0c;思路是活的。在本文中我们来通过相…

Charles 通过Breakpoints拦截接口,替换接口返回参数

Charles 下载地址 首先确保电脑和手机连接到同一个热点上 进入Charles 利用Charles拦截app端发送的请求,并修改返回的数据.(请求的数据也可以修改) 以百度接口为例&#xff0c;找到某个接口&#xff0c;右键----对目标接口添加断点(Breakpoints) 拦截修改 发起请求后,会首…

Archlinux安装Teamviewer13

Archlinux安装Teamviewer13 1.直接到www.teamviewer.com 下载tar包 下载的文件是teamviewer_amd64.tar.xz 解压xz文件&#xff1a; $xz -d teamviewer_amd64.tar.xz 解压出来teamviewer_amd64.tar 解压tar文件&#xff1a; $tar xvf teamviewer_amd64.tar 2.检查依赖 $cd teamv…

linux 内核的链表操作(好文不得不转)

以下全部来自于http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 无任何个人意见。 本文详细分析了 2.6.x 内核中链表结构的实现&#xff0c;并通过实例对每个链表操作接口进行了详尽的讲解。 一、 链表数据结构简介 链表是一种常用的组织有序数据的数据…

浏览器event loop和node.js event loop解析

1、为什么要异步&#xff1f; JavaScript 是单线程的&#xff0c;也就是说同一时刻只可以处理一个任务。通过异步才可以高效率处理各种并发情况。细想&#xff0c;假如浏览器是同步的&#xff0c;那么用户体验肯定极差。比如你打开一个视频网站&#xff0c;假如不是异步请求视频…

在 Swift 中调用 OC 代码

前言 在 Swift 语言中&#xff0c;我们可以使用 Objective-C、C 语言编写代码&#xff0c;我们可以导入任意用 Objective-C 写的 Cocoa 平台框架、Objective-C 框架或 C 类库。1、在 Swift 项目中使用 Objective-C、C 代码 1&#xff09;在 Swift 项目中创建 OC/C 的 .h 和 .m …