首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Js穿梭框 实现

JS穿梭框(Transfer)是一种常见的UI组件,主要用于在两个列表之间移动数据项。以下是关于JS穿梭框的一些基础概念、优势、类型、应用场景以及常见问题及其解决方法。

基础概念

穿梭框通常由两个列表(源列表和目标列表)和一个操作区域组成。用户可以选择源列表中的某些项,并通过点击“添加”按钮将它们移动到目标列表中,反之亦然。

优势

  1. 直观易用:用户可以直观地看到数据项在不同列表之间的移动。
  2. 高效:快速完成数据的分类和转移。
  3. 灵活性:适用于多种场景,如权限管理、数据分类等。

类型

  1. 基础穿梭框:简单的两个列表之间的数据移动。
  2. 带搜索功能的穿梭框:可以在列表中进行搜索,提高查找效率。
  3. 带分组功能的穿梭框:数据项可以按组分类,便于管理。

应用场景

  1. 权限管理:将用户分配到不同的权限组。
  2. 数据分类:将数据项从一个类别移动到另一个类别。
  3. 商品选择:在电商平台上,用户可以从多个商品列表中选择心仪的商品。

常见问题及解决方法

问题1:穿梭框数据不同步

原因:可能是由于数据更新后没有及时同步到另一个列表。 解决方法:确保在数据移动后,及时更新两个列表的数据源。

代码语言:txt
复制
function moveItem(sourceList, targetList, item) {
    const index = sourceList.indexOf(item);
    if (index > -1) {
        sourceList.splice(index, 1);
        targetList.push(item);
    }
}

问题2:穿梭框在选择项时出现重复

原因:可能是由于数据源中没有去重处理。 解决方法:在添加到目标列表前,检查目标列表中是否已存在该项。

代码语言:txt
复制
function addItem(sourceList, targetList, item) {
    if (!targetList.includes(item)) {
        targetList.push(item);
        const index = sourceList.indexOf(item);
        if (index > -1) {
            sourceList.splice(index, 1);
        }
    }
}

问题3:穿梭框在大数据量时性能较差

原因:大量的DOM操作导致性能下降。 解决方法:使用虚拟列表技术,只渲染可见区域的数据项,减少DOM操作。

代码语言:txt
复制
// 示例代码略,可以使用第三方库如react-virtualized或vue-virtual-scroller

示例代码

以下是一个简单的穿梭框实现示例:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JS穿梭框示例</title>
    <style>
        .list {
            display: inline-block;
            width: 200px;
            height: 300px;
            border: 1px solid #ccc;
            overflow-y: auto;
            margin-right: 10px;
        }
        .item {
            padding: 5px;
            border-bottom: 1px solid #eee;
        }
    </style>
</head>
<body>
    <div class="list" id="sourceList">
        <div class="item" onclick="selectItem(this)">Item 1</div>
        <div class="item" onclick="selectItem(this)">Item 2</div>
        <!-- 更多项 -->
    </div>
    <div>
        <button onclick="moveToTarget()">添加</button>
        <button onclick="moveToSource()">移除</button>
    </div>
    <div class="list" id="targetList">
        <!-- 目标列表项 -->
    </div>

    <script>
        let selectedItems = [];

        function selectItem(item) {
            item.style.backgroundColor = '#f0f0f0';
            selectedItems.push(item.textContent);
        }

        function moveToTarget() {
            const sourceList = document.getElementById('sourceList');
            const targetList = document.getElementById('targetList');
            selectedItems.forEach(item => {
                if (!targetList.textContent.includes(item)) {
                    const div = document.createElement('div');
                    div.className = 'item';
                    div.textContent = item;
                    targetList.appendChild(div);
                    sourceList.removeChild(sourceList.querySelector(`.item:nth-child(${Array.from(sourceList.children).indexOf(item) + 1})`));
                }
            });
            selectedItems = [];
        }

        function moveToSource() {
            // 类似逻辑,移除目标列表项并添加到源列表
        }
    </script>
</body>
</html>

这个示例展示了如何实现一个简单的穿梭框,包括基本的添加和移除功能。实际应用中,可以根据需求进行扩展和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数据量庞大的分页穿梭框实现

[8v38d5pes7.png] 写个分页的穿梭框,从而解决数据量庞大的问题 我之前写过一篇博客:关于 Element 组件的穿梭框的重构 介绍并实现的方法 但是第二个分页的 demo 没有,在上一家公司匆匆解决后...问题 Element 官方组件目前(==18年==)明显对于多选==三级联动的穿梭框==没有解决方案,也对==数据量庞大的穿梭框==没有结局方案(各位看官可以试一下,放入几千条数据到穿梭框,卡到爆.....,遂只能自己重写组件,完成业务需求 功能 实现分页 搜索,做成在所有数据里搜索,不是在当前分页的数据里搜索,这样就不用在每个分页都搜索一次了。搜索后的结果也会自动分页。...(全部数据和仅作展示的数据存都是存放在不同变量) 全选只在当前页里的全选 穿梭框左右两个框的联动 关键点 每个框作为一个子组件(组件化思想) 分页关键判断临界点 搜索,监听 keyword 的变化,传递到父组件搜索...(考虑到是在搜索过后点击的) 中间的左右箭头(加入已选和移除已选)放在父组件控制数据流动 数据流动:子备选框 -> 父组件 -> 子已选框 (移除已选相反) 源码 Districts.vue(包裹两个穿梭框的父组件

3.4K20
  • 基于ztree树的穿梭框

    前面的话:zTree 是一个依靠 jQuery 实现的多功能 “树插件”。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点。专门适合项目开发,尤其是 树状菜单、树状数据。...ztree官方文档:http://www.treejs.cn/v3/api.php 在项目开发中,基于ztree树,可以实现很多不同的效果,比如仿windows文件,对树文件进行新建和拖拽效果,比如对树文件子菜单进行转移到另外一个...div里面的穿梭框。...今天要说一个功能:基于ztree树的穿梭框,主要实现: 1:点击选中树的子菜单,点击按钮,移动到右侧的div框里面 2:移动到右侧之后的元素,进行可以删除和选中等操作 3:将移动到右侧的内容设为组长或者取消组长...zTree"), setting, data); zTreeObj.expandAll(true); }); } //穿梭框左侧选中

    2.5K20

    多选穿梭框总结 (vue + element)

    博客地址:https://ainyi.com/23 示例 介绍 实现省市区三级多选联动,可任选一个省级、市级、区级,加入已选框,也可以在已选框中删除对应的区域。...广东省广州市 最后显示:广东省广州市 广州市已被选择,对应市级的区将不显示,只显示对应的市 同理:选择广东省,也将下面已选择的所有的市或区合并成一个省级,只显示这个省级 设计 拆分组件:仓库和省市区框作为父组件...三个区域框和一个已选框相似,复用一个组件 transfer,放在省市区框父组件中。...保存着省市的 id 和名称(以-分割,如:{id:"10001-100145815", text:"广东省-河源市"}) 省市区都分别设置一个过滤数组,用来过滤已选的区域 区域搜索 监听搜索框的值

    4.8K41

    关于 Element 组件的穿梭框的重构

    Element 官方组件目前(==18年==)明显对于这个需求没有响应的解决方案,遂只能自己重写组件 实现效果图: [qbke7fi3ib.jpeg] 同时点击分仓能联动下面的区域数据 介绍 实现省市区三级多选联动...备选框自动过滤已选) 选择对应仓库,自动勾选仓库对应的省,取消就反选 选择同样地区,选择省级或市级,若该对象下面的子级(市级或区级)已有选择,就自动合并为一个父级(省级或市级) 设计 应用 Element 组件穿梭框的...公司业务中数据量太大,由于测试环境只有 400+ 条数据,而线上环境达到 3000+ 数据量,不是一个级别,这么多数据放在 Element 的穿梭框组件,响应起来十分慢,没办法,只能重写 实现效果图...[asop77ro04.jpeg] 重写穿梭框组件,使其变成分页形式加载,具体改变的点有: 从接口获取的 3000+ 的数据,放在临时变量,以分页形式展示 渠道的搜索,做成在所有数据里搜索,不是在当前分页的数据里搜索...(全部数据和仅作展示的数据存放在不同变量) 为了优化全选的速度,全选只在当前页里的全选 穿梭框左右两个框的联动 关键点 分页形式,关键点判断临界点 搜索数据,监听 keyword 的变化,从全局数据搜索

    7.6K40

    星星穿梭动画简单实现

    本文作者:IMWeb 刘志龙 原文出处:IMWeb社区 未经同意,禁止转载 最近做一个动画 demo,其中有一个场景是要做星星穿梭动画。类似下图这样。 ?...动画效果比较简单,简单说下实现吧。 首先,我们把动画简单化,实现一个星星往外飞的效果。...星星是从中间往外飞的,怎么实现一个往外飞的轨迹呢。毫无疑问,我们现在的重点就是找到一个数学公式,来表示随着时间x, y 两个值的变化。...从一个星星到多个星星的实现很简单,一个循环 + 随机位置 就搞定了。这里就不细说了,直接看代码吧。...pixelX, pixelY, pixelRadius, pixelRadius); c.fillStyle = `rgba(255, 255, 255, ${star.o})`; } 这样,就简单实现我们想要的星星穿梭效果啦

    89120

    ThinkPHP5 集成使用 Layui 穿梭框(transfer)控件

    背景 最近在做后台业务处理时,接触到了 Layui 中的一个穿梭框 transfer 控件的使用; 个人觉得效果还是挺满意的; 但是毕竟是在 ThinkPHP5 框架下进行的集成,不能不适合部分同行理解哦...不过,还是在此进行整理一番,欢迎指摘 … Layui-穿梭框官方文档 框架: ThinkPHP5.1.2 系统: Nginx/centOS 浏览器:Google ①....设计思路理解 > 通过提供的作者列表,点击后,发送 ajax 请求; > 获取返回的 json 数据 —— 作者的文章; > 然后,动态调用 transfer.reload()方法,赋值穿梭框数据...Javascript 代码 此处提过核心的 js 代码,主要都是根据自己的数据各种转化操作 参见注释信息,应该可以理解我的操作过程 layui.use(['form','transfer'],...var arrSel = seled_videos.split(','); //console.log('arrSel:',arrSel); //显示搜索框

    2.2K20

    【如果你要学JS XII】——使用js实现模态框拖动

    这篇文章来实现一下js中的放大镜效果,以及如何实现模态框拖动效果 先来了解一下offset,client和scroll系列属性1.offset系列属性使用offset系列相关属性可以动态的得到该元素的位置...下面在代码中实现一下更为直观实现一个简单的鼠标跟随效果。...2.如何实现js模态框思维整理:1.点击弹出层,模态框和遮挡层就会显示出来display:block;2.点击关闭按钮,模态框和遮挡层就会隐藏起来display:none;3.在页面中拖拽的原理:鼠标按下并且移动...,之后松开鼠标4.触发事件是鼠标按下mousedown, 鼠标移动mousemove鼠标松开mouseup5.拖拽过程:鼠标移动过程中,获得最新的值赋值给模态框的left和top值, 这样模态框可以跟着鼠标走了

    14910

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券