利用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 相关文章推荐
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
Apr 12 Javascript
jquery的$(document).ready()和onload的加载顺序
May 26 Javascript
基于jquery的放大镜效果
May 30 Javascript
js获得地址栏?问号后参数的方法
Aug 08 Javascript
利用jQuery实现可输入搜索文字的下拉框
Oct 23 Javascript
jquery实现的伪分页效果代码
Oct 29 Javascript
Bootstrap基本布局实现方法详解
Nov 25 Javascript
Vue中的Props(不可变状态)
Sep 29 Javascript
JavaScript禁用右键单击优缺点分析
Jan 20 Javascript
vue生命周期与钩子函数简单示例
Mar 13 Javascript
微信小程序 确认框的实现(附代码)
Jul 23 Javascript
layui表格设计以及数据初始化详解
Oct 26 Javascript
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
PHP中for循环语句的几种变型
2007/03/16 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
python发送arp欺骗攻击代码分析
2014/01/16 Python
八大排序算法的Python实现
2021/01/28 Python
Python如何快速实现分布式任务
2017/07/06 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
解决Python安装cryptography报错问题
2020/09/03 Python
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
物业管理专业个人的自我评价
2013/11/19 职场文书
成品仓管员岗位职责
2013/12/11 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
小学优秀班主任材料
2014/12/17 职场文书
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers