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 相关文章推荐
jQuery弹出层插件简化版代码下载
Oct 16 Javascript
JavaScript中的集合及效率
Jan 08 Javascript
再论Javascript下字符串连接的性能
Mar 05 Javascript
用jquery等比例控制图片宽高的具体实现
Jan 28 Javascript
jquery通过visible来判断标签是否显示或隐藏
May 08 Javascript
js实现选中复选框文字变色的方法
Aug 14 Javascript
关于JavaScript作用域你想知道的一切
Feb 04 Javascript
JS锚点的设置与使用方法
Sep 05 Javascript
jQuery Dialog 取消右上角删除按钮事件
Sep 07 Javascript
node.js 利用流实现读写同步,边读边写的方法
Sep 11 Javascript
Nuxt.js 数据双向绑定的实现
Feb 17 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 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
10条PHP高级技巧[修正版]
2011/08/02 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
js切换光标示例代码
2013/10/10 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
python实现给字典添加条目的方法
2014/09/25 Python
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python使用PyQt5的简单方法
2019/02/27 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
自荐信包含哪些内容
2013/10/30 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
学校端午节活动总结
2015/02/11 职场文书
大学新生入学感想
2015/08/07 职场文书
2019求职信大礼包
2019/05/15 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python
MongoDB支持的数据类型
2022/04/11 MongoDB
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python