利用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 特殊字符
Apr 05 Javascript
JavaScript调用Activex控件的事件的实现方法
Apr 11 Javascript
google 搜索框添加关键字实现代码
Apr 24 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
Apr 05 Javascript
给ListBox添加双击事件示例代码
Dec 02 Javascript
Grunt入门教程(自动任务运行器)
Aug 06 Javascript
NODE.JS跨域问题的完美解决方案
Oct 20 Javascript
简单实现JavaScript图片切换效果
Nov 28 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
从零学习node.js之express入门(六)
Feb 25 Javascript
webpack配置之后端渲染详解
Oct 26 Javascript
vue实现element表格里表头信息提示功能(推荐)
Nov 20 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php cli 小技巧
2013/06/03 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
深入理解python对json的操作总结
2017/01/05 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
法国珠宝店:CLEOR
2017/01/29 全球购物
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
环保专业大学生职业规划设计
2014/01/10 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
晚会闭幕词
2015/01/28 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis