利用JS响应式修改vue实现页面的input值


Posted in Javascript onSeptember 02, 2019

前言

大部分人在看到这篇文章的标题时第一时间可能有点懵,我先简单介绍一下背景:

公司有一个基于Vue实现的登录中心是我负责维护的,页面上是一个常规的登录界面,用户名输入框、密码输入框和登录按钮各一个

今天有个同事(之后简称A)过来找我问到这么一个问题:

他负责的应用将登录中心集成到了APP端,他接到的需求是希望在APP端拉起登录页面时,自动将用户帐号和密码填入,然后自动点击登录。

开始正题

我们把登录页面简化成以下代码

<template>
 <div>
 <input name="username" type="text" v-model="account.username">
 <input name="password" type="password" v-model="account.password">
 <button class="login-button" @click="login">LOGIN</button>
 </div>
</template>

<script>
export default {
 name: 'app',
 components: {
 },
 data () {
 return {
  account: {
  username: '',
  password: ''
  }
 }
 },
 methods: {
 login () {
  $ajax({
  method: 'POST',
  url: '/api/login',
  data: this.account
  })
 }
 }
}
</script>

APP端在拉起登录页面时,可以传入js代码并在当前页面执行,抛开MVVM框架Vue的影响,在前端的远古时代这其实是个很简单的问题

const usernameInput = document.querySelector('input[name=username]')
const passwordInput = document.querySelector('input[name=password]')
const button = document.querySelector('.login-button')

usernameInput.value = 'test@dji.com' // 修改用户名输入框的值
passwordInput.value = 'xxxxxxxx' // 修改密码输入框的值

button.click() // 触发按钮点击事件

上面也正是同事A所尝试的方法,然而他在实际测试中发现,运行js后,虽然页面上的input框正确变更为修改后的值,但发起的ajax请求中 username 和 password 均为空字符串,于是将问题反馈到了我这边

原理

其实如果对Vue的响应式数据原理有一定理解的话,就可以很快的想到这个问题的原因。问题的根源就在 v-model 的原理上:

v-model 其实是vue为了方便使用提供的一个语法糖,实际展开来是这样子

<input name="username" type="text" :value="account.username" @input="account.username = $event.target.value">

当用户在输入框输入时会触发input事件,从而更新 account.username 值

而上一步中使用 document.querySelector('input[name=username]').value = 'test@dji.com' 模拟的输入行为实际上并不能触发 oninput 事件,那么模拟 button 的点击事件后发起的 ajax 请求拿到的数据自然也就是未修改前的值(即空字符串)

解决方案

弄明白了问题的原理之后,解决方案自然也就很容易想到。既然js模拟输入无法触发 oninput 事件,那我们就再进一步,在修改完值后用js手动触发 oninput 事件

实现代码如下:

const usernameInput = document.querySelector('input[name=username]')
const passwordInput = document.querySelector('input[name=password]')
const button = document.querySelector('.login-button')

const event = document.createEvent('HTMLEvents')
event.initEvent('input', false, true)

usernameInput.value = 'test@dji.com' // 修改用户名输入框的值
usernameInput.dispatchEvent(event) // 手动触发输入框的input事件

passwordInput.value = 'xxxxxxxx' // 修改密码输入框的值
passwordInput.dispatchEvent(event) // 手动触发输入框的input事件

button.click() // 触发按钮点击事件

以上代码未考虑兼容性、代码封装等问题,仅提供解决思路的参考

写在最后

其实问题说不上多难,但是对于很多学习知识时只是浅尝辄止的同学,很可能会是个不小的麻烦。平时经常能听到一些 框架会用就行了,原理什么的也就应付一下面试,工作压根用不到 之类的言论,希望大家可以在日趋浮躁的大环境下,守住极客精神,认真钻研技术,做一个真正的程序员,而不仅仅只是个搬砖的。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
根据分辨率不同,调用不同的css文件
Jul 07 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
在JS数组特定索引处指定位置插入元素
Jul 27 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
Jul 25 Javascript
jQuery实现图片滑动效果
Mar 08 Javascript
jQuery remove()过滤被删除的元素(推荐)
Jul 18 jQuery
webpack之引入图片的实现及问题
Oct 08 Javascript
微信小程序实现登录遮罩效果
Nov 01 Javascript
jQuery实现简单的Ajax调用功能示例
Feb 15 jQuery
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 Vue.js
vue递归实现树形组件
Jul 15 Vue.js
layui 弹出层回调获取弹出层数据的例子
Sep 02 #Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
Sep 01 #Javascript
Vue使用mixin分发组件的可复用功能
Sep 01 #Javascript
JavaScript页面加载事件实例讲解
Sep 01 #Javascript
Node.js安装详细步骤教程(Windows版)详解
Sep 01 #Javascript
vue组件命名和props命名代码详解
Sep 01 #Javascript
Vue-CLI项目中路由传参的方式详解
Sep 01 #Javascript
You might like
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
javascript实用方法总结
2015/02/06 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
python实现排序算法
2014/02/14 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
python生成器表达式和列表解析
2016/03/10 Python
python装饰器实例大详解
2017/10/25 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
工程造价与管理专业应届生求职信
2013/11/23 职场文书
乔迁宴答谢词
2014/01/21 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
海上钢琴师观后感
2015/06/03 职场文书
会议简讯范文
2015/07/20 职场文书