纯javascript可拖动元素

2023-11-26

我知道网上有这样做的示例,但每个示例都不同,我自己的实现也是如此。我试图找出我的实现出了什么问题,因为它没有按预期工作。

代码片段:

var mousePressX = -1;
var mousePressY = -1;

document.getElementById("contextMenu").addEventListener("mousedown", function(event) {
    mousePressX = event.clientX;
    mousePressY = event.clientY;
}, false);

document.getElementById("contextMenu").addEventListener("mouseup", function(event) {
    mousePressX = -1;
    mousePressY = -1;
}, false);

document.getElementById("contextMenu").addEventListener("mousemove", function(event) {
    if (mousePressX != -1 && mousePressY != -1) {
        repositionElement(event.target, event.clientX, event.clientY);
    }
}, false);

function repositionElement(element, currentMouseX, currentMouseY) {
    element.style.left = element.offsetLeft + (currentMouseX - mousePressX) + 'px';
    element.style.top = element.offsetTop + (currentMouseY - mousePressY) + 'px';
}

jsfiddle:http://jsfiddle.net/4rLctko8/

无法真正弄清楚出了什么问题,但我注意到如果我更改以下行:

element.style.left = element.offsetLeft + (currentMouseX - mousePressX) + 'px';
element.style.top = element.offsetTop + (currentMouseY - mousePressY) + 'px';

to :

element.style.left = currentMouseX - mousePressX + 'px';
element.style.top = currentMouseY - mousePressY + 'px';

仅当元素被拖向正 x 轴(向右)和正 y 轴(向下)时,元素才会被正确拖动,并且当触发 mouseup 时,它将位于靠近左侧的某个位置 -最顶角区域(0,0 左右)


非常有趣,到目前为止只用 jQuery 完成过。稍微重写一下,并确保每个 mousemove 的事件侦听器都被删除 - 这将是一个内存泄漏,否则您可能会开始注意到:

http://jsfiddle.net/8wtq17L8/

var contextmenu = document.getElementById('contextMenu');
var initX, initY, mousePressX, mousePressY;

contextmenu.addEventListener('mousedown', function(event) {

    initX = this.offsetLeft;
    initY = this.offsetTop;
    mousePressX = event.clientX;
    mousePressY = event.clientY;

    this.addEventListener('mousemove', repositionElement, false);

    window.addEventListener('mouseup', function() {
      contextmenu.removeEventListener('mousemove', repositionElement, false);
    }, false);

}, false);

function repositionElement(event) {
    this.style.left = initX + event.clientX - mousePressX + 'px';
    this.style.top = initY + event.clientY - mousePressY + 'px';
}

似乎运作良好。 :-)

++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++

编辑 - 我想我也会添加一个支持触摸的版本(尽管较新的设备似乎模拟鼠标事件)。与 Jquery 不同,您可以选择多个事件侦听器,因此它主要是重复,只是触摸事件:

http://codepen.io/Shikkediel/pen/VLZKor?editors=011

var object = document.getElementById('element'),
initX, initY, firstX, firstY;

object.addEventListener('mousedown', function(e) {

    e.preventDefault();
    initX = this.offsetLeft;
    initY = this.offsetTop;
    firstX = e.pageX;
    firstY = e.pageY;

    this.addEventListener('mousemove', dragIt, false);

    window.addEventListener('mouseup', function() {
        object.removeEventListener('mousemove', dragIt, false);
    }, false);

}, false);

object.addEventListener('touchstart', function(e) {

    e.preventDefault();
    initX = this.offsetLeft;
    initY = this.offsetTop;
    var touch = e.touches;
    firstX = touch[0].pageX;
    firstY = touch[0].pageY;

    this.addEventListener('touchmove', swipeIt, false);

    window.addEventListener('touchend', function(e) {
        e.preventDefault();
        object.removeEventListener('touchmove', swipeIt, false);
    }, false);

}, false);

function dragIt(e) {
    this.style.left = initX+e.pageX-firstX + 'px';
    this.style.top = initY+e.pageY-firstY + 'px';
}

function swipeIt(e) {
    var contact = e.touches;
    this.style.left = initX+contact[0].pageX-firstX + 'px';
    this.style.top = initY+contact[0].pageY-firstY + 'px';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

纯javascript可拖动元素 的相关文章

  • Javascript:如何检查异步操作是否仍在挂起/正在进行中?

    我想知道是否可以以某种方式检查 Javascript 中的异步操作是否仍处于待处理状态 因为我正在执行调用特定 URL 的数据库请求 虽然 db 调用仍在进行中 但我想停止任何其他传入的 db 调用 这意味着 停止对该 URL 的任何进一步
  • 在数组/对象中查找项目的最快方法

    在 Javascript AS3 中查找列表或对象中项目的索引的最快方法是什么 我对这两种语言都提出这个要求 因为这两种语言的语法相似 假设 myArray one two three myObject one 1 two 2 three
  • 根据嵌套值使用数组过滤对象数组

    我正在尝试根据某些嵌套对象过滤数组 我准备了一些Fiddle http jsfiddle net NZnN2 249 输入数组如下所示 let arrayOfElements name a subElements surname 1 sur
  • 最小的 ExtJS 包是什么?

    有谁知道 Ext JS 2 2 所需的最少文件吗 我知道 ExtJS 网站有一个功能 build http extjs com products extjs build ExtJS ext js 的小版本 作为 ext all js 的替代
  • 记录jQuery中调用的方法和参数

    假设我有 jQuery 并且加载了几个插件 我运行一些这样的代码 someSelector someMethod someParam someOtherParam someOtherSelector someOtherMethod anot
  • 如何在 Chrome 中实现抓取光标图标?

    我知道可以在 Chrome 中使用抓取光标图标 当然是在 Gmail 中 但我不知道如何在我的代码中实现它 我已经尝试过 在CSS中 body cursor grab body cursor webkit grab body cursor
  • 一个 Next.js 路由中的两个不同子域

    我想使用构建一个新平台Next js https nextjs org React js https reactjs org and 反应路由器 https reacttraining com react router web guides
  • 代码点火器 JSON

    你好 我使用 codeigniter 然后我从控制器中的数据库中回显输出 然后在我的视图文件中执行以下操作 但它没有显示任何内容 S 我的模型文件 function forumList this gt db gt select oversk
  • 为什么我的 onclick 事件自动触发

    加载页面时最初显示 Hello World 我希望它仅在单击按钮后显示 我知道我可以通过向按钮添加内联事件侦听器来做到这一点 我可以只用脚本编写所有这些代码吗
  • Angular-Datatables + Angular-xeditable:取消可编辑行

    当组合 Angular DataTables 和 Angular XEditable 时 添加新行时会取消可编辑行 这是jsfiddle https jsfiddle net faj61h5d 10 示例操作如下 1 这是初始状态 2 将第
  • 有没有办法在 TypeScript 2+ 中全局添加类型定义?

    我有一堆简单的 ts files 不是项目 即独立的 ts 脚本 他们使用一些 Node js 功能 TypeScript 和节点类型定义通过安装 npm install g typescript npm install g types n
  • Relay 中的嵌套片段数据始终相同

    我是 Relay 新手 并且遇到了片段上嵌套数据的问题 当我在 graphiql 中进行测试时 以下查询返回正确的数据 因此我确信我的架构是正确的 viewer customers name billing address city 但是
  • 对数字和字母元素的数组进行排序(自然排序)

    假设我有一个数组 var arr 1 5 ahsldk 10 55 3 2 7 8 1 2 75 abc huds 我尝试对其进行排序 我得到了类似的东西 1 1 10 2 2 3 5 55 7 75 8 abc ahsldk huds 注
  • CryptoJS 和 Pycrypto 一起工作

    我正在使用 CryptoJS v 2 3 加密 Web 应用程序中的字符串 并且需要在服务器上使用 Python 对其进行解密 因此我使用 PyCrypto 我觉得我错过了一些东西 因为我无法让它工作 这是JS Crypto AES enc
  • 如何在 OpenLayers 3 中删除监听器

    我做了一个copy https gis stackexchange com questions 178222 how to delete a listener in openlayers 3我在 stackoverflow 上提出的问题 因
  • 如何为 ng-repeat orderBy 创建回调?

    寻找一种方法让 AngularJS 的 ng repeat orderBy 过滤器在完成渲染后执行回调 Markup div table thead tr th Name th th Age th tr thead tbody tr tr
  • while 循环元素状态 cypress

    我有一个问题 我想单击一个按钮直到它消失 但次数可能会有所不同 所以我想检查可见性状态 当可见 true时单击按钮 当可见 false时结束测试 但问题是我不知道如何循环从获取元素到末尾的所有链 单击按钮一次 由于中断而停止 如果我删除中断
  • Javascript - 如何计算数字的平方?

    使用 JavaScript 函数 function squareIt number return number number 当给定数字 4294967296 时 函数返回 18446744073709552000 每个人都知道真正的答案是
  • 如何仅在第一次访问时弹出模态窗口

    我有一个模式窗口 当您访问某个页面时会弹出 访客必须选择我同意或我不同意 我需要一个漂亮的小 jquery 脚本 它会记住谁之前访问过该页面并同意 这样他们每次访问该页面时就不会弹出模式 有人可以推荐一个好的脚本来使用吗 这是代码 div
  • 我可以防止将 Leaflet 地图平移到世界边缘之外吗?

    有没有办法限制平移到世界边缘之外 在这幅画中 棕色是世界 灰色是虚空 我想让它不可能像这样平移 Leaflet 允许您控制地图抵抗被拖出边界的程度maxBoundsViscosity选项 值 0 到 1 将其设置为最大值会完全禁用拖动出界

随机推荐

  • 如何制作模块向量?

    我想实例化一个一维元素数组 并且元素扩展模块 我该怎么做 如果我说我最好的猜测 那就是 val elements Vec 64 new element 我收到以下错误消息 error Users mykland work chisel ar
  • 如何从 PHP 调用 Perl 脚本?

    我有兴趣了解如何在 PHP 中调用 运行 Perl 脚本 您可以在 Php 代码中使用简单的 Php Perl 扩展 这将允许您执行代码和 Perl 变量 函数以及实例化对象 perl new Perl perl gt require te
  • 如何在启动repl时默认加载ns

    我用的是lein2 我想在 repl 启动时默认加载一些 ns 当为该项目执行 lein2 repl 时 是否可以在 project clj 中指定应加载的 ns 你会在其中找到很多答案示例项目 Options to change the
  • Bootstrap:在标签内输入

    为了避免表单上的每个输入元素都有一个 ID 我想将表单输入放在label 引导程序 3 我的问题是 这导致行之间有额外的垂直间距 输入没有填充其父级的整个宽度 并且输入未对齐
  • 使用UINT64_C的目的?

    我在 boost 源中找到了这一行 const boost uint64 t m UINT64 C 0xc6a4a7935bd1e995 我想知道这里使用宏的目的是什么 这一切所做的就是添加ULL到提供的常数 我认为它可能会被用来让人们更难
  • 剃须刀要求;当使用(Html.BeginForm())时

    using Html BeginForm Name Html TextBoxFor o gt o Name
  • C# 中的拍手声检测

    我希望能够检测到拍手声 对于任何形式的声音识别都很陌生 有什么简单的方法可以做到这一点吗 如果没有 有什么好的 C 声音识别 检测资源吗 我的目标是通过一些基本的基于拍手的控制来实现客户媒体中心的自动化 以前也有人问过类似的问题 给定音频流
  • NoSuchMethodException: springframework.boot.autoconfigure.http.HttpMessageConverters

    我想将 Java 9 与 Spring 一起使用 但我得到例外 Caused by org springframework aop framework AopConfigException Unable to instantiate pro
  • 使用 Gradle 从现有 pom.xml 文件中读取信息?

    在蚂蚁金服中Maven Ant 任务可用于读取 Maven 属性 如下所示
  • 减慢音频文件的播放速度而不改变其音调?

    我正在申请大学音乐专业 我正在考虑的一个功能是减慢音乐播放速度而不改变其音调 我已经在商业软件中看到了这一点 但找不到任何库或开源应用程序可以执行类似的操作 那里有图书馆吗 如何从头开始从各种文件格式完成此操作 注意 我正在使用java工作
  • 自定义日志记录以在运行时收集消息

    有没有办法在运行时创建一个 log4j Logger 将日志消息收集到缓冲区中 我目前有一个记录许多事件的类 对于需要监视记录的事件的远程应用程序 我想只交换记录到缓冲区的记录器 然后检索缓冲区 而不是重构该类 例如 给定类似的东西 Cla
  • 如何使用谓词过滤子实体集合?

    我有一个实体服务 需要根据 id 列表过滤子实体的集合 我的服务有一个公共方法 它接收父实体的 id 和他的一些子实体的 id 列表 默认情况下 我知道 JPA 将获取所有相关实体 这是他的实际行为 但我们需要努力提高服务的性能 因此 我只
  • 检索方法或构造函数的调用者实例(不是类)

    是否可以检索方法 构造函数的调用者实例 这个问题已经发布 但每次答案都在谈论调用者类 使用堆栈跟踪 而不是调用者实例 如果存在解决方案 那么构建对象图 具有公共超类型 并使用默认构造函数处理父子导航会非常方便 public class Te
  • Phonegap 混合音频文件

    我正在使用 Phonegap for Ios 构建一个卡拉 OK 应用程序 我在 www assets 文件夹中有音频文件 可以使用 media play 函数播放它们 这允许用户收听背景音乐 当媒体正在播放时 另一个媒体实例正在录制 录音
  • 如何找到OTP流程的主管?

    是否有函数允许 OTP 进程找到其主管的 pid 数据隐藏在进程字典中 任何使用以下命令生成的进程的字典中 proc lib 在条目下 ancestors 1 gt proc lib spawn fun gt timer sleep inf
  • onClick 事件在表单标签内不起作用

  • C 可以使用多种浮点格式进行计算吗?

    C 2011 N1570 5 2 4 2 2 9 说 除了赋值和强制类型转换之外 具有浮点操作数的运算符产生的值 经过通常算术转换的值以及浮点常量的计算格式的范围和精度可能大于类型所需的范围和精度 意思是不是all实现中的浮点运算可以用以下
  • 如何使用 setFieldValue 并将值作为组件之间的 props 传递

    我试图在示例注册表单中使用 ant design 表单 当我尝试使用 setFieldsValue 时 它 会抛出错误 除非使用 getFieldDecorator 否则无法使用 setFieldsValue 但我已经在代码中使用了 get
  • 如何将阴影背景白色更改为其他颜色

    我正在努力改变UIPageViewController做翻转动画时的阴影颜色 但它始终只显示白色 如何将反面背景颜色白色更改为其他颜色 例如黑色或棕褐色 iBook 也在做同样的事情 我提到下面的图片有白色背景 我想改变它的颜色 Scree
  • 纯javascript可拖动元素

    我知道网上有这样做的示例 但每个示例都不同 我自己的实现也是如此 我试图找出我的实现出了什么问题 因为它没有按预期工作 代码片段 var mousePressX 1 var mousePressY 1 document getElement