js datalist H5拖拽功能排序

原生js实现H5拖拽功能排序,借助jq实现点击效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>easyUI 拖动效果</title>
    <script type="text/javascript" ></script>
    <script type="text/javascript" src="jQuery3.4.js"></script>
    <style type="text/css">
        ul{
            padding: 0px;
            margin: 0px;
        }
        li{
            padding: 0px;
            margin: 0px;
        }
        .columns{
            width: 300px;
            height: 600px;
            border: 1px solid #95b8e7;
        }
        .column{
            width: auto;
            height:30px;
            padding: 2px 4px;
            line-height: 30px;
            position: relative;
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
        }
        .column-selected{
            background-color: #e7f4ff;
        }
    </style>
</head>
<body>
   <ul id="columns" class="columns">
       <li value="AL" class="column column-selected" id="A">数学课</li>
       <li value="AK" class="column" id="B">语文课</li>
       <li value="AZ" class="column" id="C">英语课</li>
       <li value="AR" class="column" id="E">体育课</li>
       <li value="CA" class="column" id="F">专业课</li>
       <li value="CO" class="column" id="G">美术课</li>
       <li class="column"></li>
   </ul>
</body>
<script type="text/javascript">
    $(function () {
        // 给所有的子类添加点击事件,点击时添加点击效果,并移除别的效果
        $('#columns .column').bind('click',function (i) {
            $(this).addClass('column-selected').siblings().removeClass('column-selected')
        })
    })
    function sortable(rootEl, onUpdate) {
        var dragEl;

        // rootEl.children
        // 将所有的子类元素设置为可拖动的  draggable = true
        [].slice.call(rootEl.children).forEach(function (itemEl) {
            itemEl.draggable = true;
        });

        // 该函数负责进行排序
        function _onDragOver(evt) {
            evt.preventDefault();
            evt.dataTransfer.dropEffect = 'move';
            var target = evt.target;
            if (target && target !== dragEl && target.nodeName == 'LI') {
                // Sorting
                rootEl.insertBefore(dragEl, target||target.nextSibling );
            }
        }
        // 排序结束后的钩子函数
        function _onDragEnd(evt){
            evt.preventDefault();
            dragEl.classList.remove('ghost');
            rootEl.removeEventListener('dragover', _onDragOver, false);
            rootEl.removeEventListener('dragend', _onDragEnd, false);

            // 拖动结束的时候,保留一份当前数据的id的排序,如果需要保存到后台,
            let arr = []
            $('#columns .column').each(function (col) {

               if(col == $('#columns .column').length-1){
                   return
               }
                arr.push($(this).attr('id'))
            })
            onUpdate(arr);

        }

        // 开始排序  监听父元素的dragstart 事件
        rootEl.addEventListener('dragstart', function (evt){
            // 保存当前被拖动的子元素
            dragEl = evt.target;
            // $(this).addClass('column-selected').siblings().removeClass('column-selected')
            // 设置移动的类型
            evt.dataTransfer.effectAllowed = 'move';
            // 设置要移动的数据
            evt.dataTransfer.setData('Text', dragEl.textContent);
            // 监听元素的dragover dragend 事件
            rootEl.addEventListener('dragover', _onDragOver, false);
            rootEl.addEventListener('dragend', _onDragEnd, false);

            //这里如果不添加setTimeout拖出去的元素也会添加上该类名
            setTimeout(function () {
                dragEl.classList.add('ghost');
            }, 0)
        }, false);
    }

    // Using 调用的时候传入要控制的元素的最顶层,和回调函数
    sortable(document.getElementById('columns'), function (item) {
        console.log('拖动的组件:')
        console.log(item);
    });
</script>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章