js 拖拽效果实现数据交换(多个元素、可接口请求)

简介: js 拖拽效果实现数据交换(多个元素、可接口请求)

今天老师给我们布置一个动态拖拽效果,并且实现数据交互的功能纯js写出来的(全程用的是本地存储因为用绘画存储的话刷新浏览器会根据数据默认排序),效果如下:

image.png

拖拽实现数据交换

这里面用到了html5新增的属性:draggable:true; 默认为false 当为true时,会有一个默认事件(禁用)

image.png

html5新增draggable:true默认事件


这时候需要阻止draggable事件的默认事件代码如下:


document.body.addEventListener('dragover', function (e) {


     e.preventDefault();


});


ondragstart事件//开始拖拽一个元素或者选中一个元素时触发(鼠标只是点了一下是不会触发的,鼠标点一下不松开然后在滑动鼠标就是触发该事件)


ondrop//当元素或选中的元素释放到一个目标上释放时触发(只有触发了ondragstart事件之后鼠标在一个可被选中的元素上松手就会触发该事件)


更多的关于draggable事件如下:


d6778a5bed634bf4ae9a031a22569969.png

话不多说上代码!

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script src="./js/jquery-3.6.1.js"></script>
    <style>
      div div{
        border: 1px solid #b9b9b9;
        margin-top: 10px;
        background-color: aqua;
      }
    </style>
  </head>
  <body>
    <!-- 渲染容器 -->
    <div style="transition: all 1s;"></div>
    <button>重置</button>
    <script>
      //重新排序
      $('button').click(function(){
        // 初始值
        let data = [
          {
            'name1':'你好嘿1',
            'name2':'你好嘿1',
            'name3':'你好嘿1'
          },
          {
            'name1':'你好呀2',
            'name2':'你好呀2',
            'name3':'你好呀2'
          },
          {
            'name1':'你好啊3',
            'name2':'你好啊3',
            'name3':'你好啊3'
          },
          {
            'name1':'你好哈4',
            'name2':'你好哈4',
            'name3':'你好哈4'
          }
        ];
        // 存入初始值
        localStorage.setItem('data', JSON.stringify(data))
        box()
      })
      //存入拖动的下标的值的容器
      let data2 = [];
      //存入松手的下标的值的容器
      let data3 = [];
      //存入改变后的值的容器
      let data4 = [];
      function box() {
        let data1 = JSON.parse(localStorage.getItem('data'));
        let str = '';
        for (let i in data1) {          //ondragstart开始拖拽一个元素或者选中一个元素时触发
                            //ondrop当元素或选中的元素释放到一个目标上释放时触发
          str +=`<div draggable="true" ondragstart='anxia(${i})' ondrop='songkai(${i})'>
                <span>${data1[i].name1}</span>
                <span>${data1[i].name2}</span>
                <span>${data1[i].name3}</span>
              </div>`
        }
        $('div').html(str);
      }
      box()
      //阻止draggable事件的默认事件
      document.body.addEventListener('dragover', function (e) {
        e.preventDefault();
      });
      //按下时的事件
      function anxia(i) {
        console.log(i);
        //获取本地存储的数据
        let data1 = JSON.parse(localStorage.getItem('data'));
        //每点击一下清空数组
        data4 = [];
        data2 = [];
        //创造一个数组进行操作
        data4 = data1;
        //点击存入的值
        data2.push(data4[i]);
        //松手存入的值
        sessionStorage.setItem('index',i);
      }
      //松开时的事件
      function songkai(i){
        console.log(i);
        //获取本地存储的数据
        let data1 = JSON.parse(localStorage.getItem('data'));
        let s = sessionStorage.getItem('index');
        //每点击一下清空数组
        data4 = [];
        data4 = data1;
        data3 = [];
        data3.push(data4[i]);
        //点击的值等于松手的值
        data4[s] = data3[0];
        //松手的值等于点击的值
        data4[i] = data2[0];
        //存入发生改变的数组
        localStorage.setItem('data', JSON.stringify(data4));
        //重新渲染
        box()
      }
    </script>
  </body>
</html>


相关文章
|
JavaScript 算法 开发者
如何用JS实现在网页上通过鼠标移动批量选择元素的效果?
本文介绍了类似电脑桌面通过鼠标选择多个图标的实现原理。主要通过监听mousedown、mousemove和mouseup事件,动态调整选择框大小并计算与元素的重叠情况。提供了角重叠和相交重叠的检测方法,并附有示例代码和在线演示链接,方便开发者参考与测试。
537 56
|
12月前
|
JavaScript 前端开发 开发者
Nest.js控制器深度解析:路由与请求处理的高级特性
以上就是对 NestJS 控制层高级特性深度解析:从基本概念到异步支持再到更复杂场景下拦截其与管道等功能性组件运用都有所涉及,希望能够帮助开发者更好地理解和运用 NestJS 进行高效开发工作。
549 15
|
JavaScript 前端开发 API
Node.js中发起HTTP请求的五种方式
以上五种方式,尽管只是冰山一角,但已经足以让编写Node.js HTTP请求的你,在连接世界的舞台上演奏出华丽的乐章。从原生的 `http`到现代的 `fetch`,每种方式都有独特的风格和表现力,让你的代码随着项目的节奏自由地舞动。
1052 65
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
810 1
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript
Node.js GET/POST请求
10月更文挑战第6天
310 2
Node.js GET/POST请求
|
JavaScript 前端开发 异构计算
兼容移动手机的js拖拽插件Draggin.js
兼容移动手机的js拖拽插件Draggin.js
491 1
|
JavaScript 前端开发 开发者
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。