谷歌翻译影响vue_[Vue源码分析]谷歌翻译后,Vue双向数据绑定失效了?
前言:
最近运营反馈了一个问题:谷歌浏览器打开第三方储值平台,使用谷歌浏览器自带的翻译功能后,选择商品没有计算总额。
首先可以肯定的是这不是bug,这个平台已经兼容了13种语言,只是运营没有通过语言栏切换语言,而是通过谷歌翻译。
当初想到的方法禁止谷歌浏览器翻译当前页面,如下:(已采用)
但站在技术的角度来说,看看为什么还是有必要的,储值平台基于Vue,计算总额应用了双向数据绑定;为什么谷歌翻译后,Vue双向数据绑定失效?真的是失效了吗?接下来我们以最简单的例子还原案发现场,顺便解读一下这部分相关Vue源码。
问题重现
如下图,实现简单的双向数据绑定,name初始化为test:
刷新浏览器,将当前页面翻译成中文,如下图:
翻译后再次输入,下边没有更新输入的内容。
源码分析
首先自信地排除这是业务代码的bug,然后我们自信地看看框架相关部分的源码。
浏览器翻译前
可以看到,浏览器翻译前,当输入新的数据,这个文本节点的新旧虚拟DOM会进行对比;text不一样时会执行setTextContent方法,如下如所示。
setTextContent负责在值有变化时,把对应的值赋值给对应dom节点的textContent
执行完这步后,此时节点的textContent就变成了Your name is test1
浏览器翻译后
刷新浏览器恢复初始化数据,右击翻译后开始调试。
1)翻译后,DOM结构有什么变化?
可以看到谷歌翻译后,dom节点自动添加了标签,如图:
2)setTextContent是否还有执行?
经调试发现此方法仍有执行,并且text是正常的。
结论:问题出在传进来的node,node是旧虚拟DOM对应的真实DOM,由于翻译导致DOM结构发生了变化,在执行node.textContent = text前,这个node已经不存在了。
验证
如果结论正确,那么到node.textContent = text前,结果都还是符合预期的,我们给vue源码增加一句代码,把这个找不到了的DOM节点重新挂载到文档中,如下箭头所示:
运行结果:
输入test1,虽然谷歌翻译的那段没变化,但document.body.appendChild(node)得到了想要的结果,控制台访问一下data中的name,也是有更新的。
再试试数据驱动,也还可行:
快速地敲一敲,也行得通:
从这个角度来说,谷歌浏览器翻译后,Vue双向数据绑定其实并没有失效,只是翻译导致DOM结构发生了变更,Vue找不到原来的节点去更新数据了。
谷歌翻译影响vue_[Vue源码分析]谷歌翻译后,Vue双向数据绑定失效了?相关推荐
- [Vue源码分析]谷歌翻译后,Vue双向数据绑定失效了?
前言: 最近运营反馈了一个问题:谷歌浏览器打开第三方储值平台,使用谷歌浏览器自带的翻译功能后,选择商品没有计算总额. 首先可以肯定的是这不是bug,这个平台已经兼容了13种语言,只是运营没有通过语言栏 ...
- VUE源码解析-1- 初始篇:vue定义路径查找
从这里开始,记录VUE源码分析. 1. 将 vue 源码拉到本地,方便分析 vue 源码地址来自 全球最大同性交流网站-- gitHub:https://github.com/vuejs/vue 我们 ...
- [Vue源码分析] v-model实现原理
最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: 我们都知道使用v-model可以实现数据的双向绑定,及实现数据的变化驱动dom的更新,dom的更新影响数据的变化.那么v-model是怎 ...
- [Vue源码分析] 模板的编译
最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: Vue有两个版本:Runtime + Compiler . Runtime only ,前者是包含编译代码的版本,后者不包含编译代码,编 ...
- [Vue源码分析]自定义事件原理及事件总线的实现
最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: 我们都知道Vue中父组件可以通过 props 向下传数据给子组件:子组件可以通过向$emit触发一个事件,在父组件中执行回调函数,从而实 ...
- vue源码分析系列二:$mount()和new Watcher()的执行过程
续vue源码分析系列一:new Vue的初始化过程 在initMixin()里面调用了$mount() if (vm.$options.el) {vm.$mount(vm.$options.el);/ ...
- Vue源码分析——第三章
Vue源码分析--第一章 Vue源码分析--第二章 // only used in dev mode//检测 val必需是数字function checkDuration(val, name, vno ...
- Vue源码分析--Vue.component
Vue源码分析–Vue.component 我将非 Vue.component 的部分去掉了 export function initAssetRegisters (Vue: GlobalAPI) { ...
- 大前端-Vue源码分析
Vue源码解析-响应式原理 以下内容来自 拉勾教育大前端训练营 笔者在学习过程中对笔记进行的一个整理 心得体会 嘿嘿嘿~~~ 首先说说拉勾教育大前端训练营的课程视频吧,课程的质量是真的很好哦,并且已经 ...
- vue源码分析:渲染篇
这篇文章是2017年5月份作者大大写的,快一年了,写得很好,多看看.我们现在用的也是vue2.0,可以从源码中深入理解一下vue是如何渲染页面和渲染过程以及原理. 转载于https://blog.cs ...
最新文章
- 国外创意网站设计欣赏的200佳网站推荐(系列十)
- ML:MLOps系列讲解之《MLOps的定义与发展—你为什么可能想使用机器学习》解读
- 图片底下配的文字叫什么_38岁孙俪越来越有女人味!穿短裙配性感黑丝美腿撩人,短发超美...
- veth-pair技术在docker中的应用(docker网络通信)及tomcat Dockerfile示例
- xman的思维导图快捷键_这个良心好用的思维导图软件,居然不用氪金充钱
- 使用C#体验函数式编程之——Partial application(局部应用)
- 【 .NET Core 3.0 】框架之十 || AOP 切面思想
- 【Data Cluster】真机环境下MySQL数据库集群搭建
- 《R语言机器学习:实用案例分析》——1.2节R的数据结构
- 微信支付之获取code
- matlab学习技巧
- CDLinux破解各种无线网络
- HTML5页面如何在手机端浏览器调用相机、相册功能
- [C++杂谈]:MFC中使用excel2007读写excel表格
- Android API统计
- 使用HbuilderX 的UNIapp开发app, 打包后定位不能使用的解决方式
- 自定义皮肤进服务器不显示,我的世界自定义皮肤为什么不能显示 我的世界自定义皮肤如何显示...
- 读PPK谈javascript
- 如何在小程序的wxml中书写函数逻辑,wxs的使用
- 劫持outlook与IE浏览器实现权限维持
热门文章
- Java excel添加水印
- Linux | 如何通过Xshell上传文件到Linux
- 应用安全测试技术DAST、SAST、IAST对比分析-持续更新
- pandas datetime数据类型
- Flutter:视频全屏切换
- 图像的灰度化和二值化
- 【安装教程】python3.6安装Tensorflow-GPU路上的那些坑(WIN10)
- 树莓派 USB摄像头 实现网络监控( MJPG-Streamer)
- 非计算机专业考研软件工程,#考研报名#计算机类、软件工程类考生报名前必看...
- 迅雷手机版苹果版_2020最新迅雷苹果版如何下载?