首页 > 其他分享 >对一个列表内节点进行拖拽排序

对一个列表内节点进行拖拽排序

时间:2022-09-26 23:44:20浏览次数:56  
标签:index target 触发 拖动 元素 节点 li 排序 拖拽

HTML5属性 draggable可以让元素变成可拖动

<li draggable="true">1</li>

  

该属性有三个值可选:true | false | auto

  • true:表示可拖动
  • false: 表示不可拖动
  • auto: 表示浏览器默认行为

拖动事件:

拖动的元素上触发:事件皆由拖动元素监听

  • ondragstart: 用户开始拖拉元素的时候触发
  • ondrag: 元素拖动过程中触发
  • ondragend: 用户完成元素拖动后触发

释放所位于的元素(容器)上触发:事件皆由容器元素监听

  • ondragenter:当拖动元素进入容器中时触发
  • ondragover:当拖动元素在容器中拖动过程中触发
  • ondrop:在容器中,释放拖拉时触发

思路:
先设定ul里面元素可以拖动需要为其设置draggable属性
每一个li都可拖动,但不必为每个li绑定事件,直接使用ondragstart事件委托,直接给ul来触发
使用ondragover事件拖动li过程中触发,当前li的index大于容器li时就插入在容器的前面,反之插入在容器的后面,
ul元素有一个属性previousElementSibling,表示该元素前面的一个元素,在索引进行比较,然后根据结果处理元素

<ul id="ondragstart">
    <li draggable="true">1</li>
    <li draggable="true">2</li>
    <li draggable="true">3</li>
    <li draggable="true">4</li>
    <li draggable="true">5</li>
    <li draggable="true">6</li>
    <li draggable="true">7</li>
    <li draggable="true">8</li>
</ul>
 
<script>
    var node = document.getElementById("ondragstart");
    var draging = null;
    //使用事件委托,将li的事件委托给ul
    node.ondragstart = function(event) {
        // firefox设置了setData后元素才能拖动!!!!
        event.dataTransfer.setData("te", event.target.innerText); //不能使用text,firefox会打开新tab
        draging = event.target;
    }
    node.ondragover = function(event) {
        event.preventDefault();
        var target = event.target;
        //因为dragover会发生在ul上,所以要判断是不是li
        if (target.nodeName === "LI" && target !== draging) {
            //_index是实现的获取index              
            if (_index(draging) < _index(target)) {
                target.parentNode.insertBefore(draging, target.nextSibling);
            } else {
                target.parentNode.insertBefore(draging, target);
            }
        }
    }
    function _index(el) {
        var index = 0;
        if (!el || !el.parentNode) {
            return -1;
        }
        while (el && (el = el.previousElementSibling)) {
            index++;
        }
        return index;
    }
</script>

  转载自:https://blog.csdn.net/qq_33235582/article/details/122209285

标签:index,target,触发,拖动,元素,节点,li,排序,拖拽
From: https://www.cnblogs.com/fireicesion/p/16733003.html

相关文章

  • jQuery中有哪些方法可以遍历节点
    children():获取匹配元素的子元素集合,不考虑后代元素$(function(){$("div").children()})next()获取匹配元素后面紧邻的同级元素prev()获取匹配元素前紧邻的同级元素si......
  • jQuery中使用过哪些插入节点的方法?他们的区别是什么
    append(),appendTo(),prepend(),prependTo(),after(),insertAfter()before(),insertBefore() 大致可以分为内部追加和外部追加append()表式向每个元素内部追加内容。......
  • 冒泡算法排序
    for(vari=0;i<arr.length;i++){    for(varj=0;j<arr.length-i;j++){        if(arr[j]>arr[j+1]){//            vartemp=arr[j]; ......
  • 数组的随机排序
    functionshuffle(arr){varlen=arr.length;for(vari=0;i<len-1;i++){varidx=Math.floor(Math.random()*(len-i));vartemp=arr[idx];arr[idx]=......
  • DOM添加、移除、移动、复制、创建和查找节点
    获取子节点  父节点.children  父节点.childNodes获取父节点  子节点.parentNode  子节点.offsetParent创建  document.createElement(‘标签名’)  document.......
  • LeetCode[2418. 按身高排序]
    2418.按身高排序pair默认对first升序,当first相同时对second升序classSolution{public:vector<string>sortPeople(vector<string>&names,vector<int>&heig......
  • 字符串去重,并去除掉特殊字符按照数字在前字母在后的顺序排序字符串
    varstr="1233fddfd&3434fdsaff&454545&4545444rfdsfds&545gdsgs"; varn=""; vars="";for(vari=0;i<str.length;i++){    if((str[i]>=0&&str[i]<=9)&&n.inde......
  • 15 -- 排序算法之选择排序
    选择排序的思想:选择排序(selectsorting)也是一种简单的排序方法,它的基本思想是:第一次排序从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次排序从arr[1]~arr[n-1]中......
  • 【排序】217. 存在重复元素
    题目链接:https://leetcode.cn/problems/contains-duplicate/  分析:这题简单到不能再简单了。2个思路,1是先排序,排序之后如果有2个相邻元素相等,那就是True.那么时间......
  • 【排序】169. 多数元素
    题目链接:https://leetcode.cn/problems/majority-element/题目描述:  分析:这题,可以先排序,直接返回最中间的元素即可。但排序最快也是nlogn,显得自己比较lowB。所以就......