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学习基础知识小结
Nov 25 Javascript
使图片旋转的3种解决方案
Nov 21 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
Sep 21 Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 Javascript
简单介绍jsonp 使用小结
Jan 27 Javascript
简单实现jQuery级联菜单
Jan 09 Javascript
JSON创建键值对(key是中文或者数字)方式详解
Aug 24 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 Javascript
说说Vue.js中的functional函数化组件的使用
Feb 12 Javascript
ES6入门教程之Array.from()方法
Mar 23 Javascript
Vue性能优化的方法
Jul 30 Javascript
小程序实现密码输入框
Nov 16 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下通过POST还是GET来传值
2008/06/05 PHP
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
JS变量及其作用域
2017/03/29 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
py2exe 编译ico图标的代码
2013/03/08 Python
python超简单解决约瑟夫环问题
2015/05/12 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
浅谈django orm 优化
2018/08/18 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
主要的Ajax框架都有什么
2013/11/14 面试题
金融行业务员的自我评价
2013/12/13 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
生态养殖创业计划书
2014/05/06 职场文书
求职信名称怎么写
2014/05/26 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
党性修养心得体会2016
2016/01/21 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers