解决Vue中mounted钩子函数获取节点高度出错问题


Posted in Javascript onMay 18, 2018

遇到的问题

最近在开发一个Vue的项目,好几个页面都有用到一个 页面楼层滑动的组件,我就直接封装成了一个,但是遇到一个bug,就是我需要得到这个组件的offsetTop,然后页面滚动到这个位置的时候,就设置position属性为fixed,让他固定在屏幕上。问题是当我在mounted钩子函数中获取offsetTop的时候,在新开的页签中打开页面,会得到错误的offsetTop,但是在当前页面刷新,就不会有问题。

定位问题

后来查到问题,就是加载的问题,新窗口打开图片,默认是没有带缓存的,图片是GET请求,是异步的,js运行的肯定比图片GET要快,所以当执行mounted钩子函数的时候,图片还没有全部加载完,这时候就会得到一个错误的offsetTop。

解决方案

给图片加上ref属性,并在那个组件里的mounted钩子函数中写,

this.$refs.img.onload = ()=>{
Bus.$emit('loadImgSuccess')
}

这里的Bus是用的EventBus,两个组件中事件响应的办法,不懂或者感兴趣的可以点这里EventBus。
需要得到offsetTop的组件里面

Bus.$on('loadImgSuccess', () => {
var offsetTop = this.$refs.dom.offsetTop 
})

这时候就可以确认每次不管是页面新打开还是当前页刷新都可以得到正确的offsetTop。

Javascript 相关文章推荐
jQuery下通过$.browser来判断浏览器.
Apr 05 Javascript
extjs表格文本启用选择复制功能具体实现
Oct 11 Javascript
js获取域名的方法
Jan 27 Javascript
JS实现IE状态栏文字缩放效果代码
Oct 24 Javascript
基于JavaScript操作DOM常用的API小结
Dec 01 Javascript
基于javascript数组实现图片轮播
May 02 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
Feb 15 Javascript
快速使用node.js进行web开发详解
Apr 26 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
Oct 24 Javascript
了解JavaScript中let语句
May 30 Javascript
js微信分享接口调用详解
Jul 23 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
Feb 05 Javascript
Vue数据双向绑定原理及简单实现方法
May 18 #Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
May 17 #Javascript
Vue中对比scoped css和css module的区别
May 17 #Javascript
vue引用js文件的多种方式(推荐)
May 17 #Javascript
vue router+vuex实现首页登录验证判断逻辑
May 17 #Javascript
浅谈webpack-dev-server的配置和使用
May 17 #Javascript
Node.js模块全局安装路径配置方法
May 17 #Javascript
You might like
php保存任意网络图片到服务器的方法
2015/04/14 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
Vue 组件注册实例详解
2019/02/23 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
python连接字符串的方法小结
2015/07/13 Python
Python自动发邮件脚本
2017/03/31 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
python实现与redis交互操作详解
2020/04/21 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
HTML5计时器小例子
2013/10/15 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
服装设计专业自荐信
2014/06/17 职场文书