JQuery + AngularJS: mousedown 事件被多次调用
JQuery + AngularJS: mousedown event is being called multiple times
我在 angular 中有一个单页应用程序。
我不能使用jQuery可拖动的方法所以我自己写了一个-
// here I am setting the drag event to a div
var enableDrag = function(id){
$('#'+id).on('mousedown',handleMousedown);
}
var handleMousedown =function (e){
window.my_dragging = {};
my_dragging.pageX0 = e.pageX;
my_dragging.pageY0 = e.pageY;
my_dragging.elem = this;
my_dragging.offset0 = $(this).offset();
var isDragAction=false;
function handle_dragging(e){
isDragAction=true;
var left = my_dragging.offset0.left + (e.pageX - my_dragging.pageX0);
var top = my_dragging.offset0.top + (e.pageY - my_dragging.pageY0);
$(my_dragging.elem)
.offset({top: top, left: left});
}
function handle_mouseup(e){
$('body')
.off('mousemove', handle_dragging)
.off('mouseup', handle_mouseup);
if(isDragAction){
console.log("drag was done!!");
}
else{
console.log("click was done!!");
}
}
$('body')
.on('mouseup', handle_mouseup)
.on('mousemove', handle_dragging);
}
在我的方法中,我是这样调用的:
//set off the last mousedwon to the div
$("someDiv").off('mousedown',handleMousedown);
//set the mousedwon to the div
enableDrag("someDiv");
由于我的 angular 应用程序的工作方式,我需要在每次调用该方法时调用它,而不是只调用一次。
拖动效果很好。
问题是每次调用该方法时 - 除了以前的事件之外还会添加一个新事件..
含义:
正在调用第一个方法 - 拖动将打印到控制台:
"drag was done!!"
正在调用第二种方法,一次拖动:
"drag was done!!"
"drag was done!!"
正在调用时间方法,一次拖动:
"drag was done!!"
"drag was done!!"
.
.
.
"drag was done!!"
是什么在累积事件或导致多次打印?
我真的认为这种操作应该在工厂或服务中进行,因为两者都是单例,每次应用程序执行时初始化一次,而控制器可以初始化多次。另一个解决方案是放入 controller
$scope.$on('$destroy', function(){
//unbind event
$('#someDiv').unbind('mousedown', handleMousedown);
});
控制器销毁时需要解绑点击事件
Angular 1.4
scope.$on(
"$destroy",
function handleDestroy() {
$('#someDiv').unbind('mousedown', handleMousedown);
}
);
Angular 1.5
this.$onDestroy = function () {
$('#someDiv').unbind('mousedown', handleMousedown);
};
Angular 2
ngOnDestroy() {
$('#someDiv').unbind('mousedown', handleMousedown);
}
尝试确保只设置一次事件,方法是在设置之前将其删除,而不是单独进行。不确定这是不是问题所在,因为我没有在您的示例中对其进行测试。
var enableDrag = function(id) {
$('#'+id).off('mousedown').on('mousedown', handleMousedown);
}
我在 angular 中有一个单页应用程序。
我不能使用jQuery可拖动的方法所以我自己写了一个-
// here I am setting the drag event to a div
var enableDrag = function(id){
$('#'+id).on('mousedown',handleMousedown);
}
var handleMousedown =function (e){
window.my_dragging = {};
my_dragging.pageX0 = e.pageX;
my_dragging.pageY0 = e.pageY;
my_dragging.elem = this;
my_dragging.offset0 = $(this).offset();
var isDragAction=false;
function handle_dragging(e){
isDragAction=true;
var left = my_dragging.offset0.left + (e.pageX - my_dragging.pageX0);
var top = my_dragging.offset0.top + (e.pageY - my_dragging.pageY0);
$(my_dragging.elem)
.offset({top: top, left: left});
}
function handle_mouseup(e){
$('body')
.off('mousemove', handle_dragging)
.off('mouseup', handle_mouseup);
if(isDragAction){
console.log("drag was done!!");
}
else{
console.log("click was done!!");
}
}
$('body')
.on('mouseup', handle_mouseup)
.on('mousemove', handle_dragging);
}
在我的方法中,我是这样调用的:
//set off the last mousedwon to the div
$("someDiv").off('mousedown',handleMousedown);
//set the mousedwon to the div
enableDrag("someDiv");
由于我的 angular 应用程序的工作方式,我需要在每次调用该方法时调用它,而不是只调用一次。
拖动效果很好。
问题是每次调用该方法时 - 除了以前的事件之外还会添加一个新事件..
含义:
正在调用第一个方法 - 拖动将打印到控制台:
"drag was done!!"
正在调用第二种方法,一次拖动:
"drag was done!!"
"drag was done!!"
正在调用时间方法,一次拖动:
"drag was done!!"
"drag was done!!"
.
.
.
"drag was done!!"
是什么在累积事件或导致多次打印?
我真的认为这种操作应该在工厂或服务中进行,因为两者都是单例,每次应用程序执行时初始化一次,而控制器可以初始化多次。另一个解决方案是放入 controller
$scope.$on('$destroy', function(){
//unbind event
$('#someDiv').unbind('mousedown', handleMousedown);
});
控制器销毁时需要解绑点击事件
Angular 1.4
scope.$on(
"$destroy",
function handleDestroy() {
$('#someDiv').unbind('mousedown', handleMousedown);
}
);
Angular 1.5
this.$onDestroy = function () {
$('#someDiv').unbind('mousedown', handleMousedown);
};
Angular 2
ngOnDestroy() {
$('#someDiv').unbind('mousedown', handleMousedown);
}
尝试确保只设置一次事件,方法是在设置之前将其删除,而不是单独进行。不确定这是不是问题所在,因为我没有在您的示例中对其进行测试。
var enableDrag = function(id) {
$('#'+id).off('mousedown').on('mousedown', handleMousedown);
}