angularjs - HTML5 原生 DragEnter/DragLeave 事件交替触发

标签 angularjs html drag-and-drop

我在我的 Angular 应用程序中使用原生 HTML 拖放,我发现了这个事件闪烁的问题

This答案并不能解决我的问题,因为他们正在手动移动元素。我将其保留在 native 实现中。

我的简化代码:

var app = angular.module('app', []);
app.directive('amDnd', function() {
  return {
    scope: true,
    link: function($scope, $element, $attr) {
      var el = $element[0];
      el.draggable = true;

      el.addEventListener('dragenter', function dragEnter(e) {
        console.log($scope.$id, 'dragEnter');
      }, false);
      el.addEventListener('dragleave', function dragEnter(e) {
        console.log($scope.$id, 'dragleave');
      }, false);

    }
  };
});
div[am-dnd] {
  border: 2px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div am-dnd>
    <p>DRAG ME</p>
  </div>
  <div am-dnd>
    <h3>DRAG OVER THIS AREA</h3>
    <p>See the console, drag enter and leave are fired again and again while draging over
    </p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi quisquam, eaque, iure mollitia similique magnam voluptatem blanditiis distinctio nemo! Laboriosam porro iste maiores sequi magnam similique ad, in at. Omnis.</p>
  </div>

</div>

最佳答案

我感觉“闪烁”问题的根源是 dragenter/dragleave 事件正在为第二个 的每个子元素发生am-dnd 指令。有一个 Stack Overflow 问题讨论了此 here 的修复.

您可以像这样声明 CSS 规则:

.child-elements {
   pointer-events: none;
}

...并在事件触发期间使用 jqLit​​e 将此类应用于 am-dnd 指令的所有子元素:

element.children().addClass("child-elements");

我做了一个JSFiddle当第一个指令被拖到第二个指令上时,“闪烁”事件被最小化,但是第二个指令被拖到第一个指令上仍然存在一些问题。不过,我希望这能为您指明正确的方向。

var app = angular.module('app', []);
app.directive('amDnd', function () {
    return {
        scope: true,
        link: function (scope, element, attrs) {
            element.attr('draggable', 'true');

            element.on('dragenter', function () {
                element.children().addClass("child-elements");
                console.log('dragEnter');
            });
            element.on('dragleave', function () {
                element.children().removeClass("child-elements");
                console.log('dragleave');
            });
        }
    };
});

关于angularjs - HTML5 原生 DragEnter/DragLeave 事件交替触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28819811/

相关文章:

javascript - Chartjs - 图形值类型 float

angularjs - 如果用户已经登录 ionic ,如何跳过登录页面

javascript - 修复导航栏缩小时的导航栏元素大小

java - Android 从 HTML/PHP 获取字符串

javascript - 如何找到 native 光标的中心并将自定义光标与其对齐?

javascript - jQuery-UI 可拖放跳转

javascript - Angular ui-select 多个 ng-model 不会绑定(bind)?

angularjs - 在 AngularJS 表单中添加复选框

javascript - 使拖放功能遍及所有网站,而不仅仅是特定的 div 部分

objective-c - 将文件拖放到 NSTableView 上?