jquery sortable 使用户能够在 `n` 秒后拖动元素

问题描述

我正在使用 jquery sortable 对图像列表进行排序。目前,用户只需点击并移动图像即可对其进行排序。但是,我想让它的工作方式有所不同。我希望用户应该点击并按住图像(此处位于 <li> 标签内)2 秒钟,然后激活带有边框的图像,然后用户才能拖动图像进行排序。这可能吗?

HTML

<ul id="sortable" class="reorder-gallery mt-5">
  <li class="ui-state-default mediaSort" id="1" data-name="1.png">
    <img src="images/1.jpg" alt="">
  </li>
  <li class="ui-state-default mediaSort" id="2" data-name="2.png">
    <img src="images/2.jpg" alt="">
  </li>
  <li class="ui-state-default mediaSort" id="3" data-name="3.png">
    <img src="images/3.jpg" alt="">
  </li>
  <li class="ui-state-default mediaSort" id="4" data-name="4.png">
    <img src="images/4.jpg" alt="">
  </li>
</ul>

JS

$("#sortable").sortable({
  axis: 'x,y',containment: "parent",tolerance:'pointer',update: function(event,ui) {
    $("#sortable").sortable( "option","distance",5 );
    var item_order = new Array();
    $('.reorder-gallery li').each(function() {
        item_order.push($(this).attr("id"));
    });
    $.ajax({
        type: "POST",url: "processes/sort.PHP",data: 'order='+item_order,cache: false,success: function(data){}
    });
    }
}).disableSelection();

解决方法

jQuery UI sortable 中的 delay option 可能会有所帮助:

定义何时开始排序的时间(以毫秒为单位)。添加延迟有助于防止在点击元素时出现不必要的拖拽。

请注意,该选项已弃用,仅在 1.12 之前的 jQuery UI 版本中可用。

另外还需要启用助手 (helper: 'clone') 和 styled (#sortable .ui-sortable-helper)。

P.S. 遗憾的是我没有找到在延迟时间过去后改变样式的方法。

$("#sortable").sortable({
  delay: 1000,// wait for 1 second before dragging
  helper: "clone",// allows styling of element when dragging
  axis: 'x,y',containment: "parent",tolerance:'pointer',update: function(event,ui) {
    $("#sortable").sortable( "option","distance",5 );
    var item_order = new Array();
    $('.reorder-gallery li').each(function() {
        item_order.push($(this).attr("id"));
    });
    $.ajax({
        type: "POST",url: "processes/sort.php",data: 'order='+item_order,cache: false,success: function(data){}
    });
    }
}).disableSelection();
#sortable .ui-sortable-helper {
  border: 1px solid red;
}
<link href = "https://code.jquery.com/ui/1.10.4/themes/ui-lightness/jquery-ui.css"
         rel = "stylesheet">
      <script src = "https://code.jquery.com/jquery-1.10.2.js"></script>
      <script src = "https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<ul id="sortable" class="reorder-gallery mt-5">
  <li class="ui-state-default mediaSort" id="1" data-name="1.png">
    <img src="images/1.jpg" alt="">
  </li>
  <li class="ui-state-default mediaSort" id="2" data-name="2.png">
    <img src="images/2.jpg" alt="">
  </li>
  <li class="ui-state-default mediaSort" id="3" data-name="3.png">
    <img src="images/3.jpg" alt="">
  </li>
  <li class="ui-state-default mediaSort" id="4" data-name="4.png">
    <img src="images/4.jpg" alt="">
  </li>
</ul>