前端js、javascript 鼠标 框选 文件 功能

2023-10-28

一、DEMO

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>selection</title>
  <style>
    * {
      padding: 0px;
      margin: 0px;
      list-style: none;
    }
    html,body { height: 100%; width: 100%; overflow: hidden; }
    #root {
      height: 100%;
      background: #000;
      overflow-y: auto;
      overflow-x: hidden;
    }
    ul li {
      margin: 10px;
      border: #ccc solid 1px;
      display: inline-block;
      width: 200px;
      height: 200px;
      text-align: center;
      line-height: 200px;
      color: #fff;
    }
    /* 框选盒子样式 */
    .tempDiv {
      border:1px dashed #fff;
      background:#fff;
      position:absolute;
      width:0;
      height:0;
      opacity:0.5;
      pointer-events: none;
    }
  </style>
  <script  src="selection.js"></script>
</head>
<body>
  <div id="root">
    <ul class="oul">
    </ul>
  </div>
  <script>
    // 创建 元素
    const oul = document.querySelector('.oul')
    const map = new Map()
    Array(50).fill().forEach((item, index) => {
      const oli = document.createElement('li')
      const key = index + 1
      oli.setAttribute('data-id', key)
      oli.classList.add('target-node')
      oli.innerText = key
      map.set(key + '', oli)
      oul.appendChild(oli)
    })
    // 调用函数
    selection({
      root: document.querySelector('#root'), // 盒子
      target: '.target-node', // 框选元素类名
      dataId: 'data-id', // 框选元素 data-xxx
      callBack: (ids) => { // 框选元素回调 优先 dataId || Element
        ids.forEach(id => {
          const oli = map.get(id)
          oli.style.borderColor = 'red'
        })
      }
    })
  </script>
</body>
</html>

二、selection.js

// 默认配置
const defaults = {
  root: document,
  target: '.target-node',
  dataId: 'data-id'
}

// 事件阻止
function clearEventBubble(evt) { 
  if (evt.stopPropagation) 
    evt.stopPropagation(); 
  else 
    evt.cancelBubble = true; 
  if (evt.preventDefault) 
    evt.preventDefault(); 
  else 
    evt.returnValue = false; 
}

// ---------------- 关键算法 ---------------------
function computed (pos, option) {
  const Rect = option.root.getBoundingClientRect()
  const targetList = Array.from(document.querySelectorAll(option.target))
  const {x,y,w,h} = pos
  let ids = []
  const scrollTop = option.root.scrollTop
  const scrollLeft = option.root.scrollLeft
  targetList.forEach(node => {
    const nodeRect = node.getBoundingClientRect()
    let sleft = nodeRect.left + scrollLeft - Rect.left + node.offsetWidth
    let sTop = nodeRect.top + scrollTop - Rect.top + node.offsetHeight
    let offsetLeft = nodeRect.left - Rect.left + scrollLeft
    let offsetTop = nodeRect.top - Rect.top + scrollTop
    if (sleft > x && sTop > y && offsetLeft < x + w && offsetTop < y + h) {
      ids.push(node.getAttribute(option.dataId) || node)
      return true
    } else {
      return false
    }
  })
  option.callBack && option.callBack(ids)
}
const selection = function (option = {}) {
  for (let key in defaults) {
    if (!option.hasOwnProperty(key)) {
      option[key] = defaults[key]
    }
  }
  const Root = option.root
  Root.onmousedown = function (e) {
    if (e.button !== 0) return false
    const Rect = Root.getBoundingClientRect()
    var posx = e.clientX - Rect.left + Root.scrollLeft
    var posy = e.clientY - Rect.top + Root.scrollTop
    var div = document.createElement('div')
    div.className = 'tempDiv'
    div.style.left = posx + 'px'
    div.style.top = posy + 'px'
    Root.style.position = 'relative'
    Root.appendChild(div);
    clearEventBubble(e)
    Root.onmousemove = function(ev){
      const clientX = ev.clientX - Rect.left
      const clientY = ev.clientY - Rect.top
      const left = Math.min(clientX + Root.scrollLeft, posx)
      const top = Math.min(posy, clientY + Root.scrollTop)
      const width =  Math.abs(posx - clientX + Root.scrollLeft)
      const height = Math.abs(posy - clientY - Root.scrollTop)
      div.style.left = left+ 'px'
      div.style.top = top + 'px'
      div.style.width = width + 'px'
      div.style.height = height + 'px'
      if (width < 5 && height < 5 ) return false
      computed({
        x: left,
        y: top,
        w: width,
        h: height
      }, option)
      clearEventBubble(ev)
    }
    document.onmouseup = function(){
      Array.from(document.querySelectorAll('.tempDiv')).forEach(node => {
        node.remove()
      })
      Root.style.position = ''
      Root.onmousemove = null
      document.onmouseup = null
    }
  }
}

// export default selection

三、CSS

.tempDiv {
      border:1px dashed #fff;
      background:#fff;
      position:absolute;
      width:0;
      height:0;
      opacity:0.5;
      pointer-events: none;
    }

四、使用 

selection({
      root: document.querySelector('#root'), // 盒子
      target: '.target-node', // 框选元素类名
      dataId: 'data-id', // 框选元素 data-xxx
      callBack: (ids) => { // 框选元素回调 优先 dataId || Element
        ids.forEach(id => {
          const oli = map.get(id)
          oli.style.borderColor = 'red'
        })
      }
    })

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端js、javascript 鼠标 框选 文件 功能 的相关文章

  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • Jquery从下拉列表中获取所选值的id

    我有一个下拉列表 可以从数据库获取值 如下所示 get getJobs function jobs seljobs jobs var i 0 jobs forEach function n alert job id n id 32 67 4
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 是否可以使用 javascript 测试用户的浏览器/操作系统是否支持给定类型的链接?

    是否可以使用 javascript 或其他任何东西 测试用户的操作系统 浏览器是否支持给定的 url 方案 例如 大多数仅使用网络邮件的用户计算机上未设置 mailto 是否有可能以某种方式捕获单击 mailto 链接的尝试并弹出比浏览器错
  • 如何更改 Bootstrap 3 div 列顺序

    正在做我的第一个响应式设计 在 Bootstrap 3 中可能会出现类似的情况 在 lg 上更改此设置 a b c sm 上的这个 a c b 您可以使用两个 div 一个用于第一类型的布置 另一个用于第二类型的布置 第一个仅在 lg 中显
  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • 未捕获的错误:找不到模块“jquery”

    我在用Electron https github com atom electron制作桌面应用程序 在我的应用程序中 我正在加载一个外部站点 Atom 应用程序之外 可以说http mydummysite index html http
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • 将数组排序为第一个最小值、第一个最大值、第二个最小值、第二个最大值等

    编写一个JS程序 返回一个数组 其中第一个元素是第一个最小值 第二个元素是第一个最大值 依此类推 该程序包含一个函数 该函数接受一个参数 一个数组 该函数根据要求返回数组 输入示例 array 2 4 7 1 3 8 9 预期输出 1 9
  • 单击关闭按钮后不显示 Google 一键登录 UI

    我正在尝试按照本指南使新的谷歌一键登录工作 https developers google com identity one tap web https developers google com identity one tap web
  • 我可以停止 :hover 应用于元素吗?

    假设我有一些 CSS button hover font weight bold 我怎样才能防止 hover随意应用样式 我的目标用例是当元素被禁用时 例如 使用这个 HTML
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 使用异步调用时如何从 javascript 更新元刷新?

    我有一个系统 它使用元刷新来注销页面 该系统会在空闲用户后进行清理 不用担心 服务器也会导致会话超时 我开始通过 ajax 进行一些操作 不是真正的 xml 但这不是重点 我可以运行从异步请求返回的javascript 所以我想知道是否可以
  • HTML 默认图像大小

    我在我的代码上显示 3 张图片 图片具有不同的尺寸 宽度和高度 div class row div class col lg 12 h2 class page header Gallery h2 div div class col md 4
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗

随机推荐

  • 2022全国大学生数学建模竞赛C题思路模型

    1 比赛报名与思路解析 持续更新750967193 2 比赛时间 2022年9月15日18点到2022年9月18日20点 如下为C题思路 C 题 古代玻璃制品的成分分析与鉴别 丝绸之路是古代中西方文化交流的通道 其中玻璃是早期贸易往来的宝贵
  • Java异常, 性能有多差

    在 Java 中 异常通常被认为是成本昂贵的 不应该用于控制控制 本文将证明这个观点的正确性 并验证导致性能问题的原因 Java微基准测试框架 在编写代码评估Java异常的性能成本之前 我们需要搭建一个基准测试环境 测量异常的成本开销 并不
  • 04C++11多线程编程之创建多个线程和数据共享问题分析

    04C 11多线程编程之创建多个线程和数据共享问题分析 1 thread循环创建多个子线程 思想就是使用容器创建多个线程 推荐 以后工作中会使用到 具有实际意义 方便统一管理线程 include
  • Staple 跟踪: Complementary Learners for Real-Time Tracking

    目标跟踪算法 Staple Complementary Learners for Real Time Tracking 小小菜鸟一只 2017 03 25 09 26 42 15110 收藏 14 分类专栏 目标跟踪 版权 文章下载链接 文
  • 辨析Java与Javascript

    首先 它们是两个公司开发的不同的两个产品 Java是SUN公司推出的新一代面向对象的程序设计语言 特别适合于Internet应用程序开发 而JavaScript是Netscape公司的产品 其目的是为了扩展Netscape Navigato
  • 人才供应链(17年12月)

    库克来中国访问时说 高质量的人才是Apple公司最需要的 而苹果商店的开发者中 中国有200万开发者在支持应用商店 其中大部分是在广州 苹果的供应链也在中国 配套的零部件 面对高要求和近似到极限的品质要求 只有在中国才能满足 IT行业的人才
  • 压缩/减小VirtualBox虚拟硬盘文件占用空间

    文章目录 网上的做法 导出虚拟电脑 再导入 网上的做法 网上有两种压缩空间的做法 1 在虚拟机中 使用 SDelete 例如 sdelete c z 经本人实测 不仅不能压缩 因为SDelete 扫描了整个c 盘 而 VirtualBox
  • 【多模态】7、DINO

    文章目录 一 背景 二 方法 2 1 Contrastive DeNoising Training 2 3 Mixed Query Selection 2 4 Look Forward Twice 三 效果 论文 DINO DETR wit
  • 联想E450c下vmware安装ubuntu " Intel VT-x 处于禁用状态"

    实验环境 lenovo E450c 报错信息 解决办法 按F12进入BIOS 选择Security下的Virtualization 在Intel R 的行 设置Enabled 按F10保存 重新打开虚拟机 参考链接 vmware安装ubun
  • linux 挂载以及初始化硬盘

    linux 挂载以及初始化硬盘 简述 过多的赘述就不说了 一般使用linux完成一些像iscsi服务存储配置啥的 都需要用到硬盘的挂载来扩充服务器的存储空间 这里就简简单单给大家讲一下linux如何挂载初始化新的硬盘 我这里使用的是linu
  • CRC编码计算方法及C语言实现

    CRC编码计算方法及C语言实现 CRC Cyclic Redundancy Check 是一种常用的错误校验码 用于检测和纠正传输过程中的错误 在数据通信和存储中 CRC编码被广泛应用 因为它能够高效地检测错误 并且实现简便 CRC编码计算
  • V神·以太坊上的分片

    译者序 本文是我应以太坊中文社区 Ethfans org 之邀做的翻译稿 原文取自以太坊社区的Github https github com ethereum sharding blob develop docs doc md 原文最后更新
  • Flamingo

    基于已有的图像模型和文本模型构建多模态模型 最终模型的输入是图像 视频和文本 输出是文本 Vision encoder来自预训练的NormalizerFree ResNet NFNet 之后经过图文对比损失进一步学习 图片经过Vision
  • antd中Tabs切换控制其他地方的标签显隐(react)

    antd中Tabs切换控制其他地方的标签的显示与隐藏 过程如下 tab的回调函数 拿到key值之后就离成功不远了 然后在右边的标签下还有内容 也需要根据tab切换去控制显隐 和上面是一个道理 可以直接给里面的每个div类名 根据key值 去
  • Java写一个excel工具类_Java操作Excel工具类(poi)

    1 importorg apache commons lang3 exception ExceptionUtils 2 importorg apache poi hssf usermodel HSSFDataFormat 3 importo
  • STM32传感器外设集 -- 蓝牙(HC-05)+超声波(hc-sr04)

    前言 前言 蓝牙外设还没有给大家安排上 今天我就给大家安排上使用蓝牙传输超声波距离的例程 会给大家附带蓝牙的上位机的测试APP 一 模块介绍 1 连接图 蓝牙模块 引脚 超声波传感器 引脚 GND GND GND GND VCC 3 3 V
  • 基础IO(文件输入输出、标准IO接口、文件描述符和文件流指针)

    目录 基础IO 文件的输入输出操作 FILE fopen char filename char mode 文件名称 打开方式 size t fread char buf size t block size size t block coun
  • leetcode 1833 雪糕的最大数量 第一眼想到的是dp,其实只能排序加贪心

    夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪糕的现金价格 Tony 一共有 coins 现金可以用于消费 他想要买尽可能多的
  • ioctl()函数

    include
  • 前端js、javascript 鼠标 框选 文件 功能

    一 DEMO