vue中解决拖拽改变存在iframe的div大小时卡顿问题


Posted in Javascript onJuly 22, 2020

写在最前

针对于在vue中实现拖拽改变两左右个div大小的方式,请查看上一篇文章《vue中实现拖动调整左右两侧div的宽度》。此文章主要针对于实际应用中需要拖拽改变大小的组件中使用iframe框架时存在明显卡顿的问题,比如这样,右侧div中使用了一个iframe组件,导致实际操作中出现两个问题,一个是拖不动,另外一个是无法根据鼠标移动,快速响应,甚至在监听鼠标的按下和松开事件上都有明显的卡顿问题。如果去除右侧iframe框架,则没有问题。

有iframe情况

vue中解决拖拽改变存在iframe的div大小时卡顿问题

无iframe情况

vue中解决拖拽改变存在iframe的div大小时卡顿问题

vue中解决拖拽改变存在iframe的div大小时卡顿问题

问题原因&解决思路

问题原因我不知道,不过这个博客给了我解决思路《解决jqueryUI的拖拽,如果元素中含有iframe,拖动卡的问题》,还有以下说法,他们的解决思路一样的。因此我猜想是鼠标的监听造成的影响,在我们拖拽的时候,因为拖拽过快,很容易出现鼠标移动超过拖拽范围的情况,此时的鼠标可能已经在iframe上方,从而会同时加载iframe中的内容,导致出现卡顿。

总之,解决的思路就是在拖动的时候,在iframe上方添加一个透明的遮罩层,然后在停止拖拽的时候让其消失。这样问题就可以完美解决了。

vue中解决拖拽改变存在iframe的div大小时卡顿问题

解决方式共有两节,一节包含我解决过程中遇到的问题,一节是直接的解决方式,如果想直接查看解决方式的,请直接跳转至解决方式那一节

解决方式(含解决过程中遇到的问题)

HTML组件部分源代码

这是实现拖拽的组件代码,如果不了解我原本使用的实现方式,请参考《vue中实现拖动调整左右两侧div的宽度》

<div class="box" ref="box">
   <div class="left" ref="left">

   </div>
   <div class="resize" ref="resize" title="收缩侧边栏">
    ⋮
   </div>
   <div class="mid" ref="mid">
    <!--在此处添加遮罩层-->
    <iframe id="iFrame1" name="iFrame1" width="100%" height="100%" frameborder="0" scrolling="auto"
      :src="iframeUrl">
    </iframe>
   </div>
  </div>

添加遮罩层

在以上标注的地方,添加如下代码

<div class="iframeDiv"></div>

再添加遮罩层的css样式即可,此时最好测试点击一下,是不是原来的ifame部分已经不能点击,而且拖拽起来已经不再卡顿了

/* 添加透明遮罩层 */ 
.iframeDiv {
  width: 100%;
  height: 100%;
  position: absolute;
  z-index: 1111;
  filter: alpha(opacity=0);
  opacity: 0;
  background: transparent;
  margin-top: 30px;
  /*display: none;*/
 }

实现遮罩层在拖拽时出现

我的解决办法是直接在拖拽区域添加监听鼠标的按下和松开事件,按下后遮罩层出现,松开后消失,因此修改resize部分,添加onmouseup&mousedown,分别传入参数,用于修改iframeDiv的css样式中的display属性值

<div class="resize" ref="resize" @mousedown="changeIframeDivStyle('')" @onmouseup="changeIframeDivStyle('none')" >
⋮
 </div>

然后添加changeIframeDivStyle方法,因为getElementByClassName返回的是个数组集合,但是我又确认自己页面只有一个iframeDiv,所以选择了iframe[0],如果想使用getElementById也可以

changeIframeDivStyle(display) {
    var iframeDiv = document.getElementsByClassName('iframeDiv');
    iframeDiv[0].style.display = display;
   },

到此基本就算完成大半了,mousedown为鼠标按下事件,按下后设置display为空,即遮罩层出现,onmouseup为鼠标松开事件,松开后遮罩层消失,达到不影响用户操作查看iframe中内容的目的

页面初始化时遮罩层设置问题

按照实际来讲,初始化进入页面时,我们就不应该留有遮罩层,所以按照我的想法来讲,就是直接在css中修改样式,但是如上所见,我把它注释掉了,至于为什么,先卖个关子,大家修改后尝试一下,看看拖拽时卡顿不卡顿

display: none;

在我本以为这样就可以解决问题时,我发现,首次进入页面,直接进行拖拽,依旧会存在卡顿,但是拖拽过一次之后,就不会再有问题了。这个问题,,我又不知道为什么了,于是,既然它需要拖拽一次之后才不会卡顿,那我就直接注释掉了css中这个display样式,反而在 mounted中添加方法,这样反而成功了,虽然搞不明白两者的差距,但是问题总算是解决了,如果有知道原因的朋友,可以在评论中分享出来,供大家学习学习。

this.changeIframeDivStyle('none');

解决方式

在iframe上添加透明遮罩层样式

<div class="box" ref="box">
   <div class="left" ref="left">

   </div>
   <div class="resize" ref="resize" title="收缩侧边栏">
    ⋮
   </div>
   <div class="mid" ref="mid">
    <!--在此处添加遮罩层-->
   <div class="iframeDiv"></div>
    <iframe id="iFrame1" name="iFrame1" width="100%" height="100%" frameborder="0" scrolling="auto"
      :src="iframeUrl">
    </iframe>
   </div>
  </div>

添加CSS样式

.iframeDiv {
  width: 100%;
  height: 100%;
  position: absolute;
  z-index: 1111;
  filter: alpha(opacity=0);
  opacity: 0;
  background: transparent;
  margin-top: 30px;
  /*display: none;*/
 }

添加鼠标的监听事件

在拖拽区添加鼠标的按下事件和松开事件

<div class="resize" ref="resize" @mousedown="changeIframeDivStyle('')" @onmouseup="changeIframeDivStyle('none')" >
⋮
 </div>

添加方法

changeIframeDivStyle(display) {
    var iframeDiv = document.getElementsByClassName('iframeDiv');
    iframeDiv[0].style.display = display;
   },

设置页面初始化加载

this.changeIframeDivStyle('none');

到此这篇关于vue中解决拖拽改变存在iframe的div大小时卡顿问题的文章就介绍到这了,更多相关vue拖拽div卡顿内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery蒙版控件实现代码
Dec 08 Javascript
jQuery实现类似滑动门切换效果的层切换
Sep 23 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
浅谈JavaScript Math和Number对象
Jan 26 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
Feb 13 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
Jun 06 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
ASP.NET jquery ajax传递参数的实例
Nov 02 Javascript
VUE JS 使用组件实现双向绑定的示例代码
Jan 10 Javascript
浅谈Express异步进化史
Sep 09 Javascript
JavaScript实现简单轮播图效果
Dec 01 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
Jul 22 #Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 #Javascript
vue项目中使用多选框的实例代码
Jul 22 #Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 #Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
Jul 22 #Javascript
js实现查询商品案例
Jul 22 #Javascript
vue element 关闭当前tab 跳转到上一路由操作
Jul 22 #Javascript
You might like
thinkphp模板输出技巧汇总
2014/11/24 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
验证码按回车不变解决方法
2013/03/29 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
Python语言的12个基础知识点小结
2014/07/10 Python
Python模拟用户登录验证
2017/09/11 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
基于keras中的回调函数用法说明
2020/06/17 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
工商管理本科毕业生求职信范文
2013/10/05 职场文书
二年级语文教学反思
2014/02/02 职场文书
连带责任保证书
2014/04/29 职场文书
少先队活动总结
2014/08/29 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
董事长助理岗位职责
2015/02/11 职场文书
计生个人工作总结
2015/02/28 职场文书
中英文求职信范文
2015/03/19 职场文书
Redis 常见使用场景
2021/08/30 Redis