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 StringBuilder类实现
Dec 22 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
Apr 02 Javascript
深入理解JavaScript高级之词法作用域和作用域链
Dec 10 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
Aug 06 Javascript
JS获取当前脚本文件的绝对路径
Mar 02 Javascript
基于jQuery实现收缩展开功能
Mar 18 Javascript
全面了解addEventListener和on的区别
Jul 14 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
vue中的 $slot 获取插槽的节点实例
Nov 12 Javascript
微信小程序跨页面传递data数据方法解析
Dec 13 Javascript
vue接通后端api以及部署到服务器操作
Aug 13 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
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
validator验证控件使用代码
2010/11/23 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
大学生收银员求职信分享
2014/01/02 职场文书
八年级美术教学反思
2014/02/02 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
代收款委托书范本
2014/10/01 职场文书
行为习惯主题班会
2015/08/14 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python
js作用域及作用域链工作引擎
2022/07/07 Javascript