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中字符串拼接详解
Sep 26 Javascript
Bootstrap每天必学之按钮
Nov 26 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
利用jquery实现瀑布流3种案例
Sep 18 Javascript
深入浅析JavaScript中的RegExp对象
Sep 18 Javascript
浅谈webpack下的AOP式无侵入注入
Nov 12 Javascript
浅谈vue项目如何打包扔向服务器
May 08 Javascript
vue源码学习之Object.defineProperty 对数组监听
May 30 Javascript
Vue绑定内联样式问题
Oct 17 Javascript
Vue如何循环提取对象数组中的值
Nov 18 Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
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
咖啡与牛奶
2021/03/03 冲泡冲煮
模仿OSO的论坛(二)
2006/10/09 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
php URL编码解码函数代码
2009/03/10 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
PHP文件上传类实例详解
2016/04/08 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
Python日期操作学习笔记
2008/10/07 Python
python调用shell的方法
2013/11/20 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
python线程里哪种模块比较适合
2020/08/02 Python
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
工业自动化毕业生自荐信范文
2014/01/04 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
内勤岗位职责
2015/02/10 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android