我正在使用本机超文本标记语言在我的角度应用程序中拖放,我发现这个事件闪烁问题
这个答案没有解决我的问题,因为他们是手动移动元素。我将它留在本机实现上。
我的简化代码:
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>
最符合我需求的解决方案:
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>
我有一种感觉,“闪烁”问题的根源是第二个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 中引入了上下文菜单的概念,即通过单击鼠标右键可以调出上下文菜单。不