前言:

最近运营反馈了一个问题:谷歌浏览器打开第三方储值平台,使用谷歌浏览器自带的翻译功能后,选择商品没有计算总额。

首先可以肯定的是这不是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双向数据绑定失效了?相关推荐

  1. [Vue源码分析]谷歌翻译后,Vue双向数据绑定失效了?

    前言: 最近运营反馈了一个问题:谷歌浏览器打开第三方储值平台,使用谷歌浏览器自带的翻译功能后,选择商品没有计算总额. 首先可以肯定的是这不是bug,这个平台已经兼容了13种语言,只是运营没有通过语言栏 ...

  2. VUE源码解析-1- 初始篇:vue定义路径查找

    从这里开始,记录VUE源码分析. 1. 将 vue 源码拉到本地,方便分析 vue 源码地址来自 全球最大同性交流网站-- gitHub:https://github.com/vuejs/vue 我们 ...

  3. [Vue源码分析] v-model实现原理

    最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: 我们都知道使用v-model可以实现数据的双向绑定,及实现数据的变化驱动dom的更新,dom的更新影响数据的变化.那么v-model是怎 ...

  4. [Vue源码分析] 模板的编译

    最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: Vue有两个版本:Runtime + Compiler . Runtime only ,前者是包含编译代码的版本,后者不包含编译代码,编 ...

  5. [Vue源码分析]自定义事件原理及事件总线的实现

    最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: 我们都知道Vue中父组件可以通过 props 向下传数据给子组件:子组件可以通过向$emit触发一个事件,在父组件中执行回调函数,从而实 ...

  6. vue源码分析系列二:$mount()和new Watcher()的执行过程

    续vue源码分析系列一:new Vue的初始化过程 在initMixin()里面调用了$mount() if (vm.$options.el) {vm.$mount(vm.$options.el);/ ...

  7. Vue源码分析——第三章

    Vue源码分析--第一章 Vue源码分析--第二章 // only used in dev mode//检测 val必需是数字function checkDuration(val, name, vno ...

  8. Vue源码分析--Vue.component

    Vue源码分析–Vue.component 我将非 Vue.component 的部分去掉了 export function initAssetRegisters (Vue: GlobalAPI) { ...

  9. 大前端-Vue源码分析

    Vue源码解析-响应式原理 以下内容来自 拉勾教育大前端训练营 笔者在学习过程中对笔记进行的一个整理 心得体会 嘿嘿嘿~~~ 首先说说拉勾教育大前端训练营的课程视频吧,课程的质量是真的很好哦,并且已经 ...

  10. vue源码分析:渲染篇

    这篇文章是2017年5月份作者大大写的,快一年了,写得很好,多看看.我们现在用的也是vue2.0,可以从源码中深入理解一下vue是如何渲染页面和渲染过程以及原理. 转载于https://blog.cs ...

最新文章

  1. 国外创意网站设计欣赏的200佳网站推荐(系列十)
  2. ML:MLOps系列讲解之《MLOps的定义与发展—你为什么可能想使用机器学习》解读
  3. 图片底下配的文字叫什么_38岁孙俪越来越有女人味!穿短裙配性感黑丝美腿撩人,短发超美...
  4. veth-pair技术在docker中的应用(docker网络通信)及tomcat Dockerfile示例
  5. xman的思维导图快捷键_这个良心好用的思维导图软件,居然不用氪金充钱
  6. 使用C#体验函数式编程之——Partial application(局部应用)
  7. 【 .NET Core 3.0 】框架之十 || AOP 切面思想
  8. 【Data Cluster】真机环境下MySQL数据库集群搭建
  9. 《R语言机器学习:实用案例分析》——1.2节R的数据结构
  10. 微信支付之获取code
  11. matlab学习技巧
  12. CDLinux破解各种无线网络
  13. HTML5页面如何在手机端浏览器调用相机、相册功能
  14. [C++杂谈]:MFC中使用excel2007读写excel表格
  15. Android API统计
  16. 使用HbuilderX 的UNIapp开发app, 打包后定位不能使用的解决方式
  17. 自定义皮肤进服务器不显示,我的世界自定义皮肤为什么不能显示 我的世界自定义皮肤如何显示...
  18. 读PPK谈javascript
  19. 如何在小程序的wxml中书写函数逻辑,wxs的使用
  20. 劫持outlook与IE浏览器实现权限维持

热门文章

  1. Java excel添加水印
  2. Linux | 如何通过Xshell上传文件到Linux
  3. 应用安全测试技术DAST、SAST、IAST对比分析-持续更新
  4. pandas datetime数据类型
  5. Flutter:视频全屏切换
  6. 图像的灰度化和二值化
  7. 【安装教程】python3.6安装Tensorflow-GPU路上的那些坑(WIN10)
  8. 树莓派 USB摄像头 实现网络监控( MJPG-Streamer)
  9. 非计算机专业考研软件工程,#考研报名#计算机类、软件工程类考生报名前必看...
  10. 迅雷手机版苹果版_2020最新迅雷苹果版如何下载?