当前位置: 首页 > 知识库问答 >
问题:

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

澹台景辉
2023-03-14

我正在使用本机超文本标记语言在我的角度应用程序中拖放,我发现这个事件闪烁问题

这个答案没有解决我的问题,因为他们是手动移动元素。我将它留在本机实现上。

我的简化代码:

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>

共有2个答案

丁淇
2023-03-14

最符合我需求的解决方案:

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

      el.addEventListener('dragenter', function dragEnter(e) {
        if (e.target === el && !counter) {
          console.log($scope.$id, 'dragEnter');
        }
        counter++;
      }, false);
      el.addEventListener('dragleave', function dragLeave(e) {
        counter--;
        if (e.target === el && !counter) {
          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 id='id1'>
    <p>DRAG ME</p>
  </div>
  <div am-dnd id='id2'>
    <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>
姬俊远
2023-03-14

我有一种感觉,“闪烁”问题的根源是第二个am-dnd指令的每个子元素都发生了dragenter/draglet事件。这里有一个Stack Overflow问题讨论了对此的修复。

您也许可以像这样声明一个CSS规则:

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

...并在事件触发器期间使用jqLite将此类应用于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');
            });
        }
    };
});
 类似资料:
  • 本文向大家介绍对于HTML5拖放事件,dragLeave事件在放置之前触发,包括了对于HTML5拖放事件,dragLeave事件在放置之前触发的使用技巧和注意事项,需要的朋友参考一下 要解决拖放事件的这一问题,有时在拖动之前将dragLeave触发: 在下拉菜单中,您可以设置以下内容:

  • 本文向大家介绍HTML5的触屏事件有哪些?相关面试题,主要包含被问及HTML5的触屏事件有哪些?时的应答技巧和注意事项,需要的朋友参考一下 touchstart 触摸开始 touchmove 接触点移动(手指不离开屏幕) touchend 触摸结束 touchcancel 触摸被取消

  • 问题内容: 有人知道像使用jQuery的触发函数一样可以触发Prototype中的事件的方法吗? 我已经使用watch方法绑定了一个事件监听器,但是我也希望能够以编程方式触发该事件。 提前致谢 问题答案: 符合您的需求。 我已经使用了几次,它就像一个魅力。它允许您 手动触发本机事件 ,例如单击或悬停,如下所示: 这样做的好处是,所有附加的事件处理程序仍将执行,就像您自己单击该元素一样。 对于 自定

  • 我有一个表单,其中有一条错误消息,如下例所示: http://codepen.io/anon/pen/dYWyEM?editors=101 重现问题的步骤如下: 打开coDepen链接后, 1)专注于输入领域 2) 按提交按钮 3) 由于首先触发模糊事件,因此首先隐藏错误消息,从而更改提交按钮的位置。因此,点击事件根本没有注册,我需要再次点击以提交表单。 有没有办法先发送提交事件? 我需要检测触发

  • 我正在尝试捕获提交按钮click事件,并将页面滚动到顶部,如果它还没有在那里。 由于某些原因,该事件不会第一次触发,即如果滚动大于0,则不会发生滑到页面顶部的情况。只有第二次才会激活。 有什么想法或建议吗?我是不是漏掉了什么?谢谢.

  • DOM 规范没有涵盖所有浏览器支持的所有事件。很多浏览器出于不同的目的——满足用户需求或解决特殊问题,还实现了一些自定义的事件。HTML5 详尽列出了浏览器应该支持的所有事件。本节只讨论其中得到浏览器完善支持的事件,但并非全部事件。(其他事件会在本书其他章节讨论。) 1. contextmenu 事件 Windows 95 在PC 中引入了上下文菜单的概念,即通过单击鼠标右键可以调出上下文菜单。不