返回顶部
首页 > 资讯 > 精选 >javascript如何实现可拖动的树
  • 186
分享到

javascript如何实现可拖动的树

2023-07-06 10:07:46 186人浏览 薄情痞子
摘要

这篇文章主要介绍“javascript如何实现可拖动的树”,在日常操作中,相信很多人在javascript如何实现可拖动的树问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript如何实现可拖动的树

这篇文章主要介绍“javascript如何实现可拖动的树”,在日常操作中,相信很多人在javascript如何实现可拖动的树问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript如何实现可拖动的树”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、实现的目标

本文所描述的可拖动的树,是指网页上的一个结构,其中包含树形结构的节点,而我们可以通过拖拽来重新组织它们的层次关系。实现这样的树,需要完成以下两个关键方面。

  1. 实现树形结构

首先我们需要在页面中为树形结构创建节点,并确定节点之间的层次和关联。这些内容可以使用JSON来表示。例如,我们可以以下列jsON格式存储树的结构:

{    name: "节点A",    children: [{        name: "子节点A1",        children: []    }, {        name: "子节点A2",        children: [{            name: "子节点A2-1",            children: []        }]    }]}

将其呈现为树状结构时,应该是这样的:

- 节点A  |- 子节点A1  |- 子节点A2     |- 子节点A2-1
  1. 实现拖放功能

让节点可以拖放需要使用一些JavaScript技术。有关拖放的api,常规来说涉及到三种类:

  • 可拖动的元素

  • 放置目标元素

  • 拖动的数据

使用这些API,我们可以轻松实现节点的拖拽功能。

二、技术细节

了解了我们的目标后,现在我们来详细讨论实现细节。下面是实现的步骤:

  1. 构建树形结构

我们需要先创建节点元素,并添加它们到html中,通常使用ul和li元素层次来实现。对于每一个节点,都需要一个li元素,而且要在子节点ul中嵌套更多的li元素。为了将树形结构和JSON数据关联,可以使用data-*属性,将JSON数据存储在相应的li元素中。

<ul id="tree">    <li data-name="节点A">        <div class="node">节点A</div>        <ul>            <li data-name="子节点A1">                <div class="node">子节点A1</div>            </li>            <li data-name="子节点A2">                <div class="node">子节点A2</div>                <ul>                    <li data-name="子节点A2-1">                        <div class="node">子节点A2-1</div>                    </li>                </ul>            </li>        </ul>    </li></ul>
  1. 给节点添加拖拽事件

我们需要为每一个节点添加拖拽事件,包括mousedown、dragstart、draGover、dragleave、drop和dragend。其中,mousedown和dragstart事件需要在拖拽开始前处理,和后续处理分别依次为dragover、dragleave、drop和dragend。这些拖拽事件的处理函数可以通过事件监听器来完成。

// 获取所有节点并添加事件监听器const nodes = document.querySelectorAll('.node');nodes.forEach((node) => {    node.addEventListener('mousedown', onMouseDown);    node.addEventListener('dragstart', onDragStart);    node.addEventListener('dragover', onDragOver);    node.addEventListener('dragleave', onDragLeave);    node.addEventListener('drop', onDrop);    node.addEventListener('dragend', onDragEnd);});
  1. 实现拖拽事件的处理函数

拖拽事件的处理函数有些复杂,需要仔细设计每一个步骤的操作。以下是每一个步骤的说明:

  • mousedown:记录下拖拽开始的元素,并将isDragged设置为true。

  • dragstart:设置数据传输类型和需要传输的数据。另外,需要根据isDragged的状态,判定是否能进行拖拽操作。设置数据传输类型可以使用setData()方法。

function onDragStart(event) {    if (!isDragged) {        draggedItem = event.currentTarget.parentNode;        event.dataTransfer.setData('text/plain', event.currentTarget.dataset.name);        isDragged = true;    }}
  • dragover:阻止默认事件,并在当前元素上添加isOver的属性。这个属性表示当前元素被置于其他元素上方,可以执行放置操作。可以通过event.preventDefault()方法来阻止默认事件。

function onDragOver(event) {    event.preventDefault();    if (!event.currentTarget.dataset.isOver) {        event.currentTarget.parentNode.classList.add('over');        event.currentTarget.dataset.isOver = true;    }}
  • dragleave:移除当前元素的over属性,表示没有鼠标悬停在该元素上了。

function onDragLeave(event) {    if (event.currentTarget.dataset.isOver) {        event.currentTarget.parentNode.classList.remove('over');        event.currentTarget.dataset.isOver = false;    }}
  • drop:根据当前元素是否有over属性,判定是否可以进行放置操作。如果不行,直接退出;如果可以,则进行放置操作,调整树的结构。

function onDrop(event) {    event.preventDefault();    if (event.currentTarget.dataset.isOver) {        const droppedItem = event.currentTarget.parentNode;        const parent = draggedItem.parentNode;        parent.removeChild(draggedItem);        event.currentTarget.parentNode.insertBefore(draggedItem, droppedItem.nextSibling);    }}
  • dragend:实现拖拽操作的终止事件。在该事件中,重置isDragged的值,并移除所有的over属性。

function onDragEnd(event) {    event.currentTarget.parentNode.classList.remove('over');    event.currentTarget.dataset.isOver = false;    isDragged = false;}

三、完整代码

最后,我们将以上的Javascript代码整合在一起,展示一个完整的可拖动的树。可以直接使用该代码,将其复制到文本编辑器中,保存为html文件即可在浏览器中运行。

<!DOCTYPE html><html><head>    <meta charset="utf-8">    <title>可拖动的树</title>    <style>        .over {            border-top: 5px solid blue !important;        }    </style></head><body><ul id="tree">    <li data-name="节点A">        <div class="node">节点A</div>        <ul>            <li data-name="子节点A1">                <div class="node">子节点A1</div>            </li>            <li data-name="子节点A2">                <div class="node">子节点A2</div>                <ul>                    <li data-name="子节点A2-1">                        <div class="node">子节点A2-1</div>                    </li>                </ul>            </li>        </ul>    </li></ul><script>    let draggedItem = null;    let isDragged = false;    const nodes = document.querySelectorAll('.node');    nodes.forEach((node) => {        node.addEventListener('mousedown', onMouseDown);        node.addEventListener('dragstart', onDragStart);        node.addEventListener('dragover', onDragOver);        node.addEventListener('dragleave', onDragLeave);        node.addEventListener('drop', onDrop);        node.addEventListener('dragend', onDragEnd);    });    function onMouseDown(event) {        event.preventDefault();    }    function onDragStart(event) {        if (!isDragged) {            draggedItem = event.currentTarget.parentNode;            event.dataTransfer.setData('text/plain', event.currentTarget.dataset.name);            isDragged = true;        }    }    function onDragOver(event) {        event.preventDefault();        if (!event.currentTarget.dataset.isOver) {            event.currentTarget.parentNode.classList.add('over');            event.currentTarget.dataset.isOver = true;        }    }    function onDragLeave(event) {        if (event.currentTarget.dataset.isOver) {            event.currentTarget.parentNode.classList.remove('over');            event.currentTarget.dataset.isOver = false;        }    }    function onDrop(event) {        event.preventDefault();        if (event.currentTarget.dataset.isOver) {            const droppedItem = event.currentTarget.parentNode;            const parent = draggedItem.parentNode;            parent.removeChild(draggedItem);            event.currentTarget.parentNode.insertBefore(draggedItem, droppedItem.nextSibling);        }    }    function onDragEnd(event) {        event.currentTarget.parentNode.classList.remove('over');        event.currentTarget.dataset.isOver = false;        isDragged = false;    }</script></body></html>

到此,关于“javascript如何实现可拖动的树”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: javascript如何实现可拖动的树

本文链接: https://lsjlt.com/news/357873.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • javascript如何实现可拖动的树
    这篇文章主要介绍“javascript如何实现可拖动的树”,在日常操作中,相信很多人在javascript如何实现可拖动的树问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript如何实现可拖动的树...
    99+
    2023-07-06
  • JavaScript实现可拖动模态框
    本文实例为大家分享了JavaScript实现可拖动模态框的具体代码,供大家参考,具体内容如下 代码: HTML代码部分: <style> * { ...
    99+
    2024-04-02
  • JavaScript如何实现可拖拽的进度条
    这篇文章给大家分享的是有关JavaScript如何实现可拖拽的进度条的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.进度条实现<html><head>  <me...
    99+
    2023-06-15
  • JavaScript实现弹出式可拖动登录框
    本文实例为大家分享了JavaScript实现弹出式可拖动登录框的具体代码,供大家参考,具体内容如下 效果图展示: 总体来说实现起来比较简单,老规矩,先搭建html框架,代码如下: ...
    99+
    2024-04-02
  • vue 实现可拖曳的树状结构图
    目录Vue递归组件drag事件最近用vue做了一个小项目--可拖曳的树状结构图。 Vue递归组件 结构通过Vue的递归组件实现 布局使用flex,结构线由CSS伪类实现 需要注意...
    99+
    2024-04-02
  • android实现可拖动的浮动view
    本文实例为大家分享了android实现可拖动的浮动view,供大家参考,具体内容如下 业务来源 页面最小化后,需要出现一个浮动 view 告知用户,防止遮挡视线,需要对 view 做...
    99+
    2024-04-02
  • JavaScript实现可拖拽的进度条
    本文实例为大家分享了JavaScript实现可拖拽的进度条的具体代码,供大家参考,具体内容如下 一.进度条实现 <html> <head> <m...
    99+
    2024-04-02
  • JS如何实现简单可拖动的模态框
    这篇文章主要讲解了“JS如何实现简单可拖动的模态框”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS如何实现简单可拖动的模态框”吧!简单版本效果图:实现思路:给可拖动部分添加点击事件,触发时...
    99+
    2023-07-02
  • iOS实现可拖动的浮动菜单
    本文实例为大家分享了iOS实现可拖动的浮动菜单的具体代码,供大家参考,具体内容如下 实现一个可拖动的浮动菜单,效果如下: 这个设置图标是可以全屏拖动的,点击一下,可以出现一排设置按...
    99+
    2022-11-13
    iOS拖动浮动菜单 iOS浮动菜单 iOS拖动菜单
  • JavaScript实现拖动模态框
    本文实例为大家分享了JavaScript实现拖动模态框的具体代码,供大家参考,具体内容如下 案例:模态框拖拽 弹出框,我们也称为模态框。 1.点击弹出层,会弹出模态框,并且显示灰色半...
    99+
    2024-04-02
  • android怎么实现可拖动的浮动view
    本篇内容主要讲解“android怎么实现可拖动的浮动view”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“android怎么实现可拖动的浮动view”吧!业务来源页面最小化后,需要出现一个浮动 ...
    99+
    2023-06-30
  • Android如何实现单页面浮层可拖动view
    这篇文章主要介绍Android如何实现单页面浮层可拖动view,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!需求是需要在一个已经存在的页面添加一个可拖动的浮层广告。使用到的技术:ViewDragHelper效果如图:...
    99+
    2023-05-30
    android view
  • HTML+CSS+JavaScript实现可拖拽模态框
    前言 模态框是指覆盖在父窗口上的子窗口,但在HTML网页中,并没有父窗口和子窗口的概念。这里是通过可隐藏的遮罩层和一个可隐藏的盒子来实现模态框的效果。 效果演示: 下面开始详细介绍...
    99+
    2024-04-02
  • jquery如何实现拖动效果
    这篇文章主要介绍jquery如何实现拖动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码如下:<!DOCTYPE html> <html ...
    99+
    2024-04-02
  • css如何实现禁止拖动
    这篇文章将为大家详细讲解有关css如何实现禁止拖动,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。css的基本语法是什么css的基本语法是:1、css规则由选择器和一条或多条声明两个部分构成;2、选择器通常...
    99+
    2023-06-14
  • vue如何实现可拖拽的dialog弹框
    这篇文章主要介绍了vue如何实现可拖拽的dialog弹框,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:element的dialog弹框在项目中挺常用的。但有时候嵌套...
    99+
    2023-06-15
  • JS实现简单可拖动的模态框
    本文实例为大家分享了JS实现简单可拖动的模态框的具体代码,供大家参考,具体内容如下 这篇博文有 简单实现 和 带样式且稍微复杂一点 的两个版本 简单版本 效果图: 实现思路: 给可...
    99+
    2024-04-02
  • 如何使用Android实现单页面浮层可拖动view
    这篇文章将为大家详细讲解有关如何使用Android实现单页面浮层可拖动view,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在DragframeLayout中的onTouchEvent一直接收不到触摸消息...
    99+
    2023-05-30
    android view
  • JavaScript怎么实现全屏幻灯片切换动画可拖拽
    这篇文章主要讲解了“JavaScript怎么实现全屏幻灯片切换动画可拖拽”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么实现全屏幻灯片...
    99+
    2024-04-02
  • 如何使用JavaScript实现拖拽效果
    这篇文章主要介绍如何使用JavaScript实现拖拽效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!拖拽在前端开发中是很常见的功能,也是基本功之一,本文是不限制范围的拖拽也就是最简...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作