js 多选框里的元素拖动排序

本文介绍了一个项目需求,即在多选框中实现已选择值的手动拖动排序。通过在生成的`
  • `元素中添加`draggable="true"`属性来启用拖动效果,并在初始化时监听拖动事件。拖动完成后需注意顺序更新及请求反馈的处理,确保显示顺序与下拉列表一致。此外,文章提供了Vue框架下的核心代码示例,实现了元素的拖动监听和处理逻辑。
  • 摘要由CSDN通过智能技术生成

    一、需求背景:

                   项目要求在多选的情况下对已选择的值进行手动拖动排序

    二、设计分析:

                   我们正常的js插件中没有此功能,需要拖动里面的元素,就需要添加在生成的已选择的li元素里添加h5属性(draggable="true"),这样我们才能有拖动元素的这个效果。然后我们在select初始化的页面再监听拖动事件。除了核心的拖动外,我们还需要注意两件事,一件事是拖动完毕后发送请求后的再次修改操作,这要求返回的值我们要按照顺序显示上去,因为使用过select相关插件的都知道,默认显示值得顺序跟下拉列表的顺序有关系,其次就是如果我们需要根据某些条件需要改变下拉框里的值,需要关注默认值是否在下拉框中,如果没有需要剔除。

    三、示意图

     

    四、核心代码

    1. 我们需要在插件中找到生成已选择值得HTML,加上draggable="true"的属性,让元素可以拖动(这个是我使用插件源代码,在里面添加此属性)
    2. 添加拖动事件的监控,并写好监控事件的处理逻辑(代码是vue框架,只参照
    • 1
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    好的,可以的。我可以为您解答这个问题。 首先,我们需要一个 HTML 表单元素和一个 JavaScript 函数来实现图片上传。以下是一个简单的示例: ```html <form id="upload-form"> <input type="file" id="file-input" name="image" accept="image/*" multiple> <button type="submit">上传图片</button> </form> ``` ```javascript const form = document.querySelector('#upload-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const formData = new FormData(event.target); const response = await fetch('/upload', { method: 'POST', body: formData, }); if (response.ok) { alert('上传成功!'); } else { alert('上传失败!'); } }); ``` 上述代码的作用是,当用户选择一张或多张图片并点击“上传图片”按钮时,会将所选图片文件打包成一个 FormData 对象,并通过 fetch API 发送到服务器上的 '/upload' 路径。如果上传成功,会弹出一个提示框;如果上传失败,也会弹出一个提示框。 接下来,我们需要实现图片拖拽排序功能。这个功能需要用到 HTML5 的拖放 API。以下是一个示例: ```html <ul id="sortable-list"> <li><img src="image1.jpg"></li> <li><img src="image2.jpg"></li> <li><img src="image3.jpg"></li> </ul> ``` ```javascript const sortableList = document.querySelector('#sortable-list'); sortableList.addEventListener('dragstart', (event) => { event.dataTransfer.setData('text/plain', event.target.dataset.index); }); sortableList.addEventListener('dragover', (event) => { event.preventDefault(); const target = event.target.closest('li'); if (target) { target.classList.add('dragover'); } }); sortableList.addEventListener('dragleave', (event) => { const target = event.target.closest('li'); if (target) { target.classList.remove('dragover'); } }); sortableList.addEventListener('drop', (event) => { event.preventDefault(); const sourceIndex = event.dataTransfer.getData('text/plain'); const source = sortableList.querySelector(`li[data-index="${sourceIndex}"]`); const target = event.target.closest('li'); if (target && target !== source) { const targetIndex = target.dataset.index; if (sourceIndex < targetIndex) { target.insertAdjacentElement('afterend', source); } else { target.insertAdjacentElement('beforebegin', source); } } }); ``` 上述代码的作用是,当用户将列表中的某一项拖拽到其他位置时,会触发相应的事件。拖拽开始时,会将被拖拽项的索引存入 dataTransfer 对象中;拖拽过程中,会高亮鼠标经过的目标项;拖拽结束时,会将被拖拽项插入到目标项的前面或后面。 最后,我们需要处理网络传输异常情况和限制文件大小。这些问题可以在服务器端进行处理。以下是一个示例: ```javascript const multer = require('multer'); const upload = multer({ limits: { fileSize: 1024 * 1024 }, // 限制文件大小为 1MB fileFilter: (req, file, cb) => { if (!file.mimetype.startsWith('image/')) { // 只接受图片文件 return cb(new Error('文件类型错误!')); } cb(null, true); }, }).single('image'); app.post('/upload', (req, res) => { upload(req, res, (error) => { if (error) { console.error(error); res.status(400).send(error.message); } else { console.log(req.file); res.send('上传成功!'); } }); }); ``` 上述代码的作用是,使用 multer 中间件处理文件上传请求,并限制文件大小为 1MB,只接受图片文件。如果上传失败,会返回 400 错误码和错误信息;如果上传成功,会在控制台输出文件信息,并返回上传成功的提示信息。 对于已上传的文件进行归类,可以在上传成功后进行处理。以下是一个示例: ```javascript const fs = require('fs'); const path = require('path'); app.post('/upload', (req, res) => { upload(req, res, async (error) => { if (error) { console.error(error); res.status(400).send(error.message); } else { console.log(req.file); const { filename } = req.file; const extname = path.extname(filename); const dirname = path.join(__dirname, 'uploads', extname.slice(1)); if (!fs.existsSync(dirname)) { fs.mkdirSync(dirname, { recursive: true }); } const destname = path.join(dirname, filename); fs.renameSync(req.file.path, destname); res.send('上传成功!'); } }); }); ``` 上述代码的作用是,在上传成功后,将文件移动到以文件类型为名的子目录中,并重命名为原始文件名。例如,如果上传的是一张名为 'image.jpg' 的图片,会将它移动到 'uploads/jpg/image.jpg' 目录中。如果目录不存在,则会自动创建。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值