利用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 相关文章推荐
Javascript解决常见浏览器兼容问题的12种方法
Jan 04 Javascript
javascript+mapbar实现地图定位
Apr 09 Javascript
javascript 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
javascript中的return和闭包函数浅析
Jun 06 Javascript
ECMAScript 5中的属性描述符详解
Mar 02 Javascript
javascript常用经典算法实例详解
Nov 25 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
Oct 10 Javascript
require.js+vue开发微信上传图片组件
Oct 27 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
Aug 16 Javascript
vue-devtools的安装步骤
Apr 23 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
ES6新增的数组知识实例小结
May 23 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
php下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
php实现水仙花数示例分享
2014/04/03 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
Python中itertools模块用法详解
2014/09/25 Python
python optparse模块使用实例
2015/04/09 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
Python读取多列数据以及用matplotlib制作图表方法实例
2020/09/23 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
大学生全国两会报告感想
2014/03/17 职场文书
党员创先争优活动总结
2014/05/04 职场文书
社区先进事迹材料
2014/05/19 职场文书
云冈石窟导游词
2015/02/04 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers