为什么 event.clientX 在 Firefox 中的 Dragend 事件中错误地显示为 0?

2023-12-24

警报来自dragend正在显示mouseX无论当前在哪里,都为零。这在 Chrome 中运行良好,所以不确定我做错了什么。

function move(e,obj,but){
    if(typeof(obj) === 'string'){
        obj = document.getElementById(obj) ;
    }
    
    if(typeof(but) === 'string'){
        but = document.getElementById(but) ;
    }

    //elementCoord(but) ;//get the current coords of the button &
    elementCoord(obj) ;//the container
    
    e = e || window.event ;
    var mouseX = e.clientX ;
    var mouseY = e.clientY ;
            
    //alert('mouseX='+mouseX+', but.XCoord '+but.XCoord) ;
    var diffX = Math.abs(obj.XCoord - mouseX) ;
    var diffY = Math.abs(obj.YCoord - mouseY) ;
    
    but.addEventListener("dragend",function(evt){
        evt = evt || window.event ;
        mouseX = evt.clientX ;
        mouseY = evt.clientY ;
        obj.style.left = mouseX - diffX + 'px';
        obj.style.top = mouseY - diffY + 'px';
        alert('mouseX='+mouseX+' diffX='+diffX) ;
        }
    ,false) ;
    
}

忘记说了,elementCoord只是获取将其添加为属性的对象的偏移量。它在所有浏览器中都能正常工作。


这是 Firefox 的官方问题——Bugzilla:Bug #505521,在 HTML5 拖动事件期间设置屏幕坐标 https://bugzilla.mozilla.org/show_bug.cgi?id=505521#c80。我将引用 jbmj 进行总结,并且我将粗体显示他们引用的原始开发人员......

我简直不敢相信这个评论
"请注意,虽然它没有指定属性应该设置为什么,只是应该设置它们,而我们目前将它们设置为 0。"
11年前的版本仍然是最先进的。

我受到杰伊评论的启发,使用了“drop”事件。但这只是一个评论,所以让我把它整理成一个答案。

我们的问题:dragend事件有e.clientY and e.clientX设置为 0。

我们将如何解决它:document's drop event 也火了与我们拖动的元素同时发生dragend事件。和:drop 将有正确的值e.clientY and e.clientX.

两个工作演示,100% 仅 JavaScript 解决方案:SO代码片段和JSBin https://jsbin.com/hiyabib/edit?html,css,js,console,output。 SO 代码片段控制台有时会吞噬控制台中拖动的元素,而 JSBin 给了我更一致的结果。

var startx = 0;
var starty = 0;
dragStartHandler = function(e) {
  startx = e.clientX;
  starty = e.clientY;
}

dragOverHandler = function(e) {
  e.preventDefault();
  return false;
}

dragEndHandler = function(e) {
  if(!startx || !starty) {
    return false;
  }
  
  var diffx = e.clientX - startx;
  var diffy = e.clientY - starty;
  
  var rect = e.target.getBoundingClientRect();

var offset = { 
                top: rect.top + window.scrollY, 
                left: rect.left + window.scrollX, 
            };
  
  var newleft = offset.left + diffx;
  var newtop = offset.top + diffy;
  
  e.target.style.position = 'absolute';
  e.target.style.left = newleft + 'px';
  e.target.style.top = newtop + 'px';
  
  startx = 0;
  starty = 0;
}

document.getElementsByClassName("draggable")[0].addEventListener('dragstart', dragStartHandler);

document.addEventListener('dragover', dragOverHandler);
document.addEventListener('drop', dragEndHandler);
.draggable {
  border: 1px solid black;
  cursor: move;
  width:250px;
};
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <BR><BR><BR>

  <div id="draggable1" class="draggable" draggable="true">
    Hey, try to drag this element!
  </div>
  
</body>
</html>

解释:

  • dragStartHandler():这绑定到可拖动元素。在这里,我们所做的就是在开始时记录当前的 x/y 坐标。
  • dragOverHandler():这与文档绑定,以便我们可以覆盖默认的拖动行为。这是进行任何类型的拖放操作所必需的。
  • dragEndHandler(): 这与document's drop。通常,我们希望将其绑定到element's dragend, 但是由于clientY and clientX缺少,我们将其绑定到文档上。这正是您在调用 Dragend 时想要发生的事情,除非您有 x/y 坐标。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 event.clientX 在 Firefox 中的 Dragend 事件中错误地显示为 0? 的相关文章

  • 在占位符中添加 HTML

    我喜欢使用 HTML 占位符 因为它有助于向用户描述他们需要输入的内容类型 但是 有时您需要为用户提供更多信息 而不仅仅是简单的句子 基本上我希望能够在我的文本区域占位符中添加换行符 制表符等 我听说过使用特殊编码来做到这一点 并且已经使用
  • JQuery:如何自动完成“城市,州”?

    Question 怎么用啊JQuery 自动完成插件 http docs jquery com Plugins Autocomplete建议地点 City State 用于输入字段 意思是 有人想输入 伊利诺伊州芝加哥 所以他们开始打字 C
  • 在 HTML TextArea 中设置(或读取)光标/插入符的值

    我正在尝试 但失败了 在 HTML 文本区域中实现拖放机制 使用 jQuery 或 Scriptaculous 我们都使用 拖放机制相对容易 因此我愿意接受使用这两者之一的答案 问题是 我似乎找不到读取或设置插入点的方法 我最终想要做的是确
  • 使用过渡添加子项时 div 的平滑增长

    尽管使用了以下代码 但其行为并不符合我的预期transition所以可能有些事情我不明白 理想情况下 单击该按钮会将一个子项添加到id2div 并制作id1分区增长smoothly因此 function id1 button click g
  • 调整大小后获取实际图像大小

    我有一个充满缩略图的页面 用 css 调整大小150x150 当我单击缩略图时 页面变暗 并且图像以其真实尺寸显示 目前 我必须手动创建一个包含所有图像的实际高度的数组 为了解决设计问题 减少画廊的手动操作 我需要在调整图像大小 CSS 后
  • 我应该选择哪个 redux 中间件?

    按照指南 我发现了一些用于 redux 应用程序的中间件 Redux 重击 https github com gaearon redux thunk Redux 承诺 https github com acdlite redux promi
  • 0x800a1391 - JavaScript 运行时错误:“阶段”未定义

    我正在尝试做这个教程 http www sitepoint com creating a simple windows 8 game with javascript game basics createjsaseljs http www s
  • 如何使单词中的每个字母在悬停时发生变化

    假设我的网站上某个段落中有一个单词 IamGreat 我希望它在悬停时更改为 Good4you 但是 我不想更改整个单词 而是希望每个字母单独更改 因此 如果我将鼠标悬停在字母 I 上 它将变成字母 G 字母 r 将变成数字 4 等 这两个
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • jQuery 或 JavaScript 中的“$”符号是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 中 符号的含义是什么 https stackoverflow com questions 1150381 what is the meaning of sign in javas
  • 更改 Angular 模型以更新 Kendo

    我一直在一个项目中使用 Angular 最近才发现 Kendo Angular 项目位于http kendo labs github io angular kendo http kendo labs github io angular ke
  • 如何使用ckeditore通过ajax发送数据?

    我在 django 中有一个表格 这是 撰写邮件 形式 我将此表单从视图发送到我的模板 然后应用 ckeditor 来更改正文样式 我希望通过 ajax 发布此表单 当使用 ckeditor 时 body 字段的值不会随 request P
  • AngularJS Youtube 播放器嵌入非常大的播放列表

    我目前正在构建一个 AngularJS 应用程序 我知道它有点过时 但我对它很有信心 我的应用程序需要嵌入一个 YouTube 播放器 其中包含一个非常大的播放列表 大约 1500 个项目 但我无法对其进行编码 以便它实际上可以嵌入超过 2
  • 谷歌地图API v3如何获取所有形状的坐标

    我有这个谷歌脚本 可以创建形状和删除形状 但没有太多关于保存形状的信息 我查了一下互联网 知道我可以通过 overlaycomplete 中的 getpaths 访问路径坐标 而且我还可以将坐标推入一个收集所有形状的数组中 但是 如果用户删
  • 每次页面重新加载时都会出现新的 Google 登录库提示

    在我的项目中 我使用常规弹出客户端 JS 身份验证 平台客户端 https developers google com identity sign in web sign in 我从旧版 Google Sign 迁移到新版 Google I
  • iOS 11 getUserMedia 不起作用?

    苹果公司发表声明称getUserMedia将在 iOS 11 上完全正常运行 安装 iOS 11 Beta 版本 5 后 我确实收到一条消息 表明我的网站请求访问我的相机和麦克风 但似乎是这样的 video src window URL c
  • 在窗口调整大小和窗口加载时动态调整 pixi 舞台及其内容的大小

    我正在尝试在窗口调整大小时动态调整 pixi 舞台 画布和内容 的大小 并且最初以浏览器窗口的大小加载 而不改变比例 我使用以下内容将初始大小基本上设置为window innerWidth window innerHeight 但它做了一些
  • 使用带有箭头的 MaterializeCSS 轮播 - 如何使用普通 javascript 进行初始化

    我正在尝试使用 MaterializeCSS 创建带有箭头的轮播 我正在尝试使用这个代码笔 https codepen io Paco Cervantes pen ZLxKpj取得有限的成功 我想使用普通的 javascript 而不是 j
  • 在两个片段之间拖放视图

    我目前正在尝试在两个片段之间实现拖放 我已经将它们添加到我的活动中 如下所示 FragmentManager fm getFragmentManager FragmentTransaction ft fm beginTransaction
  • 查看元素的所有 dom 事件

    我有一个 jQuery UI 日期选择器 当您单击日期时 它会清除我的 URL 哈希值 并且不会更改文本框中的日期 我假设某个地方还有其他一些 JavaScript 实用程序 它也正在调用某种委托事件 抛出错误并终止 jquery 处理程序

随机推荐

  • iPad:分割视图不旋转

    我有以下设置 的一个子类UISplitViewController在构造函数中创建主视图控制器和详细视图控制器 均覆盖的主视图控制器和详细视图控制器shouldAutorotateToInterfaceOrientation回来YES 详细
  • 连接到外部 MYSQL docker 容器

    我有两个正在运行的虚拟机 其中一个 A 在 docker 网络内有 MYSQL 数据库 另一个 B VM 具有我的前端应用程序 docker 容器 我运行我的 MYSQL docker 容器 A 如下所示 docker run name d
  • 当我编辑文件时,Visual Studio 不会跟踪更改或从源代码管理中检出文件

    我是 TFS 的新手 在我的工作中 我将 TFS 项目映射到本地目录 执行获取 一切都按我的预期进行 当我在本地副本上编辑文件时 源代码管理会自动将它们签出以进行编辑 并通过挂起的更改窗口跟踪带有挂起的更改的文件 然后我就用那个窗口全天检查
  • C# 中的模拟文件 IO 静态类

    我是单元测试的新手 我需要模拟 System IO 命名空间中的 File 静态类 我正在使用 Rhinomock 实现此目的的最佳方法是什么 可以说我需要模拟 File Exists File Delete 您无法使用 Rhino 模拟来
  • Hibernate 验证@ManyToOne 至少有一个

    我将 Spring 4 1 与 Hibernate 一起使用 并使用 OneToMany ManyToOne 等注释实体 对于某种情况 A 类 有很多 B 类 如果 A 类没有至少一个与之关联的 B 类 则 A 类无效 有没有一种简单的方法
  • 使用 pyparsing 解析数学表达式

    我正在尝试使用 pyparsing 来解析数学表达式 我知道我可以从 pyparsing 网站复制示例计算器 但我想理解它 以便稍后添加 我来这里是因为我试图理解这个例子 但我做不到 所以我尽力了 我得到了这个 symbol pp Lite
  • 如何找到域名的权威名称服务器?

    如何找到冲突的 DNS 记录的来源 您需要给定域名的 SOA 授权起始 记录 这就是您使用通用可用的nslookup命令行工具 command line gt nslookup gt set querytype soa gt stackov
  • 扩展店件模型

    我需要扩展 Shopware 变体模型 以便添加一些自定义属性 例如金属类型 石头宝石类型 这是基础文章 这些属性将在后端和前端使用 我怎样才能做到这一点 谢谢 扩展 Shopware 核心模型本身根本不可能 根据您尝试扩展的具体模型 有两
  • Maven Surefire 默认情况下顺序执行测试用例吗?

    这是此内容的后续内容question https stackoverflow com questions 7267790 does junit execute test cases sequentially当我深入研究我的研究时我意识到 假
  • iPhone / iPad / iPod 滑动事件 javascript

    我正在寻找 如果可能的话 JavaScript 库 插件来提供滑动事件 然而 我并不追求简单的滑动检测 例如 jqTouch 提供的 我希望创建类似于 iPod 设备上的图像查看器的行为 例如 您向左或向右拖动即可转到下一张图像 您必须将图
  • 在带有边框的画布中的当前剪辑上绘制位图(绘画)

    我正在通过编写游戏来学习 Android 并且在图形 API 方面遇到问题 我想将图像绘制成路径的形状 然后在路径上添加边框 我能够使用路径剪辑图像 但找不到在其上添加边框的方法 我认为这很简单 因为 API 支持 Canvas draw
  • MOV x86 指令是否实现 C++11 memory_order_release 原子存储?

    根据这个https www cl cam ac uk pes20 cpp cpp0xmappings html https www cl cam ac uk pes20 cpp cpp0xmappings html 已发布的商店实现为MOV
  • 如何将多级对象映射到indexedDB以获得最佳效率

    我的问题涉及在indexedDB 中布置数据结构 我开始构建一个小型网页功能 该功能逐渐发展成为一种网络学习工具 现在更接近于独立的渐进式网络应用程序 使用 localStorage 效果很好 但随着该工具的发展 5MB 限制可能会成为某些
  • AdMob 同意书未显示?

    我不明白为什么 Google 提供的同意书没有显示 说加载成功 但是却没有显示 我在欧洲 所以我的位置不是问题 我在模拟器和真实设备上都尝试过 我只手动选择了 12 个广告提供商 这是有问题的代码 PACConsentInformation
  • 如何调试在启动时启动的进程?

    我正在尝试在启动时启动的 Windows 服务中设置断点 由于我犯了一个不幸的错误 该服务迫使机器进入重新启动循环 这意味着我无法达到可以部署修复程序的稳定状态 而且显然我无法尝试调试该服务在更方便的时间 我可以在内核模式下使用windbg
  • 在 Android Studio 的依赖项中显示没有 OpenCV 模块

    我尝试了很多教程和博客在 Android Studio 上设置 OpenCV Android 库他们中的一些人在这里 在 Android Studio 上设置 OpenCV Android 库的初学者指南 https android jle
  • 如何直接从字节数组显示 JPEG 图像(保存图像之前)?

    我从客户端套接字接收 jpeg 图像 图像大小 50KB 并保存在模拟器 SD 卡中 从那里我在 Imageview 中显示 jpg 图像 但我想在将图像保存到SD卡上之前显示图像 因为我们的android应用程序将从套接字接收连续图像 如
  • 基于HADOOP_HOME自动加载HDFS配置?

    我正在开发一个 Java 程序来与已经运行的 hadoop 集群交互 该计划有HADOOP HOME作为环境变量传递给它 根据这个值 我需要在开始与 HDFS MapReduce 交互之前加载所有必要的配置资源 我认为我需要的文件基于阿帕奇
  • 从函数 PostgreSQL 返回多列和行而不是记录

    我正在网上阅读关于 PostgreSQL 上的函数并返回结果 在这个链接中 SQL 函数返回类型 TABLE 与 SETOF 记录 https stackoverflow com questions 22423958 sql functio
  • 为什么 event.clientX 在 Firefox 中的 Dragend 事件中错误地显示为 0?

    警报来自dragend正在显示mouseX无论当前在哪里 都为零 这在 Chrome 中运行良好 所以不确定我做错了什么 function move e obj but if typeof obj string obj document g