Firefox 中的拖动事件没有 e.clientX 或 e.clientY

Posted

技术标签:

【中文标题】Firefox 中的拖动事件没有 e.clientX 或 e.clientY【英文标题】:No e.clientX or e.clientY on drag event in Firefox 【发布时间】:2014-07-22 10:14:32 【问题描述】:

我已经使用 Angular 中的指令实现了一个简单的拖放系统。它在 Chrome 中运行良好,但 Firefox 不会在拖动事件中公开 event.clientXevent.clientY 属性(他们只是拒绝修复它)。

所以我正在寻找一个很好的替代方法来在拖动事件中公开这些属性:拖动事件的视觉反馈需要 x,y 坐标。

代码是 here - 在 Chrome 和 Firefox 中查看问题。

在 Chrome 中,在文件夹中拖动一个项目,您将看到相同的项目显示为鼠标跟随的视觉反馈,而不是在 Firefox 中(因为 Firefox 不支持 e.clientX 和 @ 987654327@ 在拖动事件中)。

问题就在这里(从第 45 行开始):

.on('drag', function(e) 
    if (e.originalEvent.clientX) 
        el.css(
           'top': e.originalEvent.clientY + 10,
           'left': e.originalEvent.clientX + 10
        );
     else 
        el.css('display', 'none');
    
);

那么,在 Firefox 中,如何在拖动事件期间获取鼠标在屏幕上的位置(角度方式,我的意思是使用指令、没有全局变量或其他方式)?

【问题讨论】:

这能回答你的问题吗? Why is event.clientX incorrectly showing as 0 in firefox for dragend event? 【参考方案1】:

您可以在 document 上连接到 dragover -- clientXclientY 在那里暴露。 使用功能闭包不填充全局范围。这里更新了PLNKR(在 Chrome 和 FF 中测试)。

对js的改动:

.directive('mpDrag', function($timeout, $window, $document) 

    // keeping coordinates private and 
    // shared among all instances of the directive
    var mouseX, mouseY;

    $document.on("dragover", function(event)
      mouseX = event.originalEvent.clientX;
      mouseY = event.originalEvent.clientY;
    )

    return 
      ...
      link: function($scope, element, attrs) 
        ...
        $timeout(function() 

        ...
            .on('drag', function(e) 
              // just use mouseX, mouseY directely here
              // (btw. you should detect differently when to hide the element)
              console.log(mouseX, mouseY); 
              if (e.originalEvent.clientX) 
                el.css(
                  'top': mouseY,
                  'left': mouseX
                );
               else 
                el.css('display', 'none');
              
            );
        );
      
    ;
  )

【讨论】:

无论如何要在 Typescript 和 React 上执行此操作?【参考方案2】:

您必须从文档本身借用拖动坐标:

var dragX = 0,
    dragY = 0;

element.on('dragstart', function(e) 
    document.ondragover = function(event) 
        event = event || window.event;
        dragX = event.pageX,
        dragY = event.pageY;
    ;
);

element.on('drag', function(e) 
    el.css(
        'top': dragY + 10,
        'left': dragX + 10
    );
);

Updated plunker

【讨论】:

以上是关于Firefox 中的拖动事件没有 e.clientX 或 e.clientY的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTML5 拖放防止拖动事件干扰 Firefox 中的输入元素

在Firefox中拖动元素的问题

如何在Firefox上的“拖动”事件处理程序中使用clientX和clientY?

输入类型 = 范围上的 onchange 事件在拖动时未在 Firefox 中触发

Firefox 在 div 滚动条上移动时触发拖动事件

无法在 Firefox 中拖动按钮元素