vue中@change兼容问题详解


Posted in Javascript onOctober 25, 2019

@change问题

1. 需求描述

需求:选择日期,当日期改变,则页面相应该日期的某些事件渲染

条件:

  • 移动端
  • vue框架

2. 问题产生及描述

问题: 兼容性差距,由于@change触发方式不同,导致时间加载不够统一,时间触发出现问题。

描述如下:

使用vue做移动端时,由于需求需要,需要在页面某处添加一个日期选择的控件。由于不是面向用户,内部使用,因此本着不浪费资源的原则,直接使用h5自带的input:

<input type="date">

emm...CSS样式不再赘述。然后绑定数据,绑定change事件监听值变化:

<input type="date" v-model="date" @change="selectDate">
selecrDate () {
  // do something...
}

当基本流程敲定后,在pc端没问题。但注意,我们此时讨论的是移动端效果,那么用pc端打开调试工具来模拟移动端机型显然是不足以代表移动端真实场景的,因此需要在真机测试。ok,接下来,差异化出现。
由于@change的特性是当监听到数据发生变化时则执行,因此差异便是暴露出来:

  • 安卓:选择完年月日,点击确定后,数据变化,监听事件起作用;
  • iOS: 点击选择日期,选择年,监听到数据变化一次,执行一次selectDate,选择月,监听到数据变化,再次执行,选择日,监听到数据变化,再执行……选择不停,执行不停。

由于此不同端所存在的差异化,导致了我们必须“兼容”这个问题。那么重点问题出现,如何兼容?

3. 解决方案

讨论到此,我们必须想办法先解决一个问题:如何在iOS端,阻止掉每一次选择都自动执行selectDate的问题。此时,经过一番探寻查找,发现@blur方法可以替代iOS中的@change,说干就干,盘他:

<input type="date" v-model="date" @blur="selectDate">

ok,找个苹果机试一下,完美,选择年月日莫的问题,只有点击确定之后才触发该事件。但,所谓小人得志不可取,兴高采烈的时候发现在安卓机上挂掉了。原因是在安卓机上选完以后,@blur事件并不会触发,除非选择完成之后,点击别的区域来触发此事件。因此,我们又面临一个兼容问题,怎么同时保证在安卓和iOS系统上都能流畅运行呢?

有办法——js辨别系统是安卓还是iOS:

const u = navigator.userAgent, app = navigator.appVersion;
// Android 判断
const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
// iOS 判断
const isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); 

if (isAndroid) {
  // 这个是安卓操作系统
  // do something
}

if (isIOS) {
  // 这个是iOS操作系统
  // do something
}

有了此步骤,那接下来的事儿就简单多了:

  • 如果是安卓系统,则用@change;
  • 如果是iOS系统,则用@blur;
  • 由于是移动端,所以不考虑pc~;

完成~.~!

总结

总结以上,步骤如下:

  • 进入页面,执行js脚本,判断当前设备型号;
  • 如果是安卓设备,执行@change;
  • 如果是iOS设备,执行@blur。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript对象链式操作代码(jquery)
Jul 04 Javascript
prettify 代码高亮着色器google出品
Dec 28 Javascript
用js获取电脑信息(是使用与IE浏览器)
Jan 15 Javascript
JavaScript将相对地址转换为绝对地址示例代码
Jul 19 Javascript
js实现局部页面打印预览原理及示例代码
Jul 03 Javascript
png在IE6 下无法透明的解决方法汇总
May 21 Javascript
js判断图片加载完成后获取图片实际宽高的方法
Feb 25 Javascript
jstl中判断list中是否包含某个值的简单方法
Oct 14 Javascript
在 Angular 中实现搜索关键字高亮示例
Mar 21 Javascript
Node.js系列之连接DB的方法(3)
Aug 30 Javascript
Vue中函数防抖节流的理解及应用实现
Apr 24 Javascript
javascript+Canvas实现画板功能
Jun 23 Javascript
vue下的@change事件的实现
Oct 25 #Javascript
微信小程序(订阅消息)功能
Oct 25 #Javascript
layui 解决form表单点击无反应的问题
Oct 25 #Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
Oct 25 #Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
Oct 25 #Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
Oct 25 #Javascript
vue实现评论列表功能
Oct 25 #Javascript
You might like
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
探讨如何在PHP开启gzip页面压缩实例
2013/06/09 PHP
php制作动态随机验证码
2015/02/12 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
JavaScript 事件系统
2010/07/22 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
Python求导数的方法
2015/05/09 Python
Python读写unicode文件的方法
2015/07/10 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
深入理解python中的select模块
2017/04/23 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
Python简单生成随机数的方法示例
2018/03/31 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
python中的测试框架
2020/11/13 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
美国温暖商店:The Warming Store
2018/12/15 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
酒吧创业计划书
2014/01/18 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
2014年检验员工作总结
2014/11/19 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript