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的简单图片切换效果
Jan 06 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
Sep 23 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
Apr 04 Javascript
Angular 理解module和injector,即依赖注入
Sep 07 Javascript
JS解决移动web开发手机输入框弹出的问题
Mar 31 Javascript
移动前端图片压缩上传的实例
Dec 06 Javascript
vue2.0使用swiper组件实现轮播的示例代码
Mar 03 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
Mar 13 Javascript
postman自定义函数实现 时间函数的思路详解
Apr 17 Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 Javascript
原生js实现的移动端可拖动进度条插件功能详解
Aug 15 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
Nov 07 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
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
PHP的几个常用加密函数
2016/02/03 PHP
php简单截取字符串代码示例
2016/10/19 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
django接入新浪微博OAuth的方法
2015/06/29 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
岗位职责定义及内容
2013/11/08 职场文书
行政总监岗位职责
2013/12/05 职场文书
美食节策划方案
2014/05/26 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
捐资助学感谢信
2015/01/21 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
python入门之算法学习
2021/04/22 Python