jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案


Posted in Javascript onDecember 19, 2016

前些日子不是在做使用Jquery-UI实现一次拖拽多个选中的元素操作嘛,在持续完善这个组件时遇到了一个关于拖放排序的bug。今天就着图片和代码重现一下,也顺便告诉大家如何解决这个问题。

首先先上图描述一下问题:

先来张正常的图:

jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案

如上图,整个div层被我设置了固定高度和滚动条。页面如上所示,在可排序区域(黄色列表区域)可见情况下,从左面向右边拖拽时,可以成功触发排序的操作。

接着再来张bug图

jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案

上图为bug触发说明图,将滚动条拖拽到底部(保证右侧可排序的黄色区域在div中不可见就行),此时是看不见黄色的排序列表的。在这个情况下,拖拽需要排序的元素,然后鼠标一直拖拽向上移动到可排序的列表区域时,会发现排序操作没有任何作用。无法触发排序功能。

几经查找,终于发现了一个方法。来看一下:

jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案

猜测是,鼠标在红色边框区域内拖拽移动到排序位置时,没有计算涉及到滚动条的距离等信息。看到了上面的方法说明,本人就尝试了一下,定义了div的滚动事件机制,在滚动事件触发时,加载refresh方法来刷新位置信息。方法定义好后,再次重复试验上面的两种情况,okay,都可以搞定了。

下面给出demo的代码,大家在遇到这种情况下就可以将整个小bug灭掉了。

<!doctype html>
<html lang="en">
<head>  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Sortable - Connect lists</title>
  <link rel="stylesheet" href="js/jquery-ui-1.12.1.dropable/jquery-ui.css" />
  <style>
    #sortable1, #sortable2 {
      border: 1px solid #eee;
      width: 142px;
      min-height: 20px;
      list-style-type: none;
      margin: 0;
      padding: 5px 0 0 0;
      float: left;
      margin-right: 10px;
    }
    #sortable1 li, #sortable2 li {
      margin: 0 5px 5px 5px;
      padding: 5px;
      font-size: 1.2em;
      width: 120px;
    }
  </style>
  <script src="js/jquery-1.11.2.js"></script>
  <script src="js/jquery-ui-1.12.1.dropable/jquery-ui.js"></script>
  <script>
    $( function() {
      $("#sortable1>li").draggable({
        containment: "#cc",
        cursor: "default",
        cancel: "span,input",
        distance: 10,
        zIndex: 9,
        opacity: 0.5,
        cursorAt: {
          right: 20,
          top: 20
        },
        connectToSortable: "#sortable2"
      });
      $("#cc>div").scroll(function(e) {
        $( "#sortable2").sortable( "refresh" ); //触发滚动时刷新位置信息
        //$( "#sortable2").sortable( "refreshPositions" ); //同上,使用其中一个即可
      });
      $( "#sortable2" ).sortable({
        containment:"#cc",
        connectWith:"#sortable1",
        zIndex:9
      });
    } );
  </script>
</head>
<body>
<div id="cc" style="width:500px;height:200px;border:1px solid red;margin-left:50px;margin-top:80px">
  <div style="width:100%;height:100%;overflow-y:auto;position:relative">
    <ul id="sortable1" class="connectedSortable">
      <li class="ui-state-default">Item 1</li>
      <li class="ui-state-default">Item 2</li>
      <li class="ui-state-default">Item 3</li>
      <li class="ui-state-default">Item 4</li>
      <li class="ui-state-default">Item 5</li>
      <li class="ui-state-default">Item 6</li>
      <li class="ui-state-default">Item 7</li>
      <li class="ui-state-default">Item 8</li>
      <li class="ui-state-default">Item 9</li>
      <li class="ui-state-default">Item 0</li>
    </ul>
    <ul id="sortable2" class="connectedSortable">
      <li class="ui-state-highlight">Item 1</li>
      <li class="ui-state-highlight">Item 2</li>
      <li class="ui-state-highlight">Item 3</li>
    </ul>
  </div>
</div>
</body>
</html>

以上,就是记录jqueryui使用过程中遇到的一个问题。遇到同样问题的小伙伴可以试一试~~

结尾还遗留了一个类似问题,但不能使用上面的方式解决,如果有遇到下面这种情况的小伙伴,求告知。再此也描述一下问题:

其实,在实际的使用过程中,关于在有滚动条时使用jqueryui的交互事件,依然会有一些问题。也尝试看一下jqueryui的源码,对比一下,发现确实在draggable中设置connectToSortable时,它的拖拽排序方法记录位置信息时并不准确,应该说缓存的位置信息不能及时更新,一次计算错误后,导致后续的位置越来越偏移。如下图:

jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案

可以看到中间部分,我拖拽了一个元素,此时我的鼠标在在中间的黄色区域,但是拖拽元素(淡蓝色方框)却距离鼠标位置很远。这个情况的发生情况是这样的,在左侧拖拽元素后,一直在中间面板拖动,中间面板有很多个小容器,它们都可以盛放拖拽的元素。鼠标在这些容器上来回移动几次后就会出现鼠标位置和元素位置偏移问题。

这个问题不是前面提及的在滚动条事件中加上refresh方法就可以解决了。目前这个问题看jqueryui源码应该是临时记录的位置信息问题,也没有计算滚动条距离等。想尝试一下改动jqueryui源码,改了半天,未见成效啊。

遗留下了这个问题。如果有知道该问题的解决方案的小伙伴, 求告知解决方案啊~~~

Javascript 相关文章推荐
JSON取值前判断
Dec 23 Javascript
AngularJS基础学习笔记之简单介绍
May 10 Javascript
Angularjs整合微信UI(weui)
Mar 15 Javascript
JQuery 的跨域方法推荐_可跨任何网站
May 18 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
Feb 28 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
Apr 02 jQuery
浅谈Webpack自动化构建实践指南
Dec 18 Javascript
浅析从vue源码看观察者模式
Jan 29 Javascript
node之本地服务器图片上传的方法示例
Mar 26 Javascript
vue Element左侧无限级菜单实现
Jun 10 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 Vue.js
jQuery Easyui datagrid editor为combobox时指定数据源实例
Dec 19 #Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
Dec 19 #Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
Dec 19 #Javascript
Jquery Easyui表单组件Form使用详解(30)
Dec 19 #Javascript
基于JavaScript实现自动更新倒计时效果
Dec 19 #Javascript
Bootstrap的基本应用要点浅析
Dec 19 #Javascript
详解javascript获取url信息的常见方法
Dec 19 #Javascript
You might like
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
php的扩展写法总结
2019/05/14 PHP
用js解决数字不能换行问题
2010/08/10 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python实现股市信息下载的方法
2015/06/15 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
python中partial()基础用法说明
2018/12/30 Python
Python坐标线性插值应用实现
2019/11/13 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
python time.strptime格式化实例详解
2021/02/03 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
加拿大租车网站:Enterprise Rent-A-Car
2018/07/26 全球购物
Prototype如何更新局部页面
2013/03/03 面试题
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
幼儿园春季开学通知
2015/07/16 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
golang中的并发和并行
2021/05/08 Golang
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
vue 实现上传组件
2021/05/31 Vue.js
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript