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字符串对象的常用方法简明版
Jun 26 Javascript
JavaScript利用正则表达式去除日期中的“-”
Jul 01 Javascript
javascript中eval和with用法实例总结
Nov 30 Javascript
基于JavaScript的操作系统你听说过吗?
Jan 28 Javascript
DeviceOne 让你一见钟情的App快速开发平台
Feb 17 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
js仿网易表单及时验证功能
Mar 07 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 Javascript
JavaScript实现百度搜索框效果
Mar 26 Javascript
微信小程序实现预览图片功能
Oct 22 Javascript
详解小程序设置缓存并且不覆盖原有数据
Apr 15 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 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
PHP5 安装方法
2006/10/09 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
Python实现简单多线程任务队列
2016/02/27 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
如何用Python破解wifi密码过程详解
2019/07/12 Python
简单了解Python3里的一些新特性
2019/07/13 Python
Python Pandas 箱线图的实现
2019/07/23 Python
python 爬取疫情数据的源码
2020/02/09 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
应聘自荐信
2013/12/14 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
中央空调节能方案
2014/06/15 职场文书
歌剧魅影观后感
2015/06/05 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python