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>

 

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