如何在使用jQuery拖动时处理停止事件
How to handle the stop event when dragging with jQuery?
我有一个处理拖动鼠标(而不是内容)的插件,在开始拖动处理程序中,我正在创建另一个触发拖动并停止父级的元素,但它不起作用(父级仍在调用dragHandler):
(原因是我可以在拖动鼠标时缩放/平移。)
start在mousedown上调用,它还为mousemove等注册侦听器。
在mouseup上调用end,这也会删除侦听器。
http://jsfiddle.net/62XZU/7/
<svg></svg>
插件:
(function($) {
$.fn.ondrag = function(opt) {
//console.log("set drag");
var obj = this;
opt = $.extend({start:null,drag:null,end:null,leave:null,dropElement:document}, opt);
this.data('ondrag',opt);
opt.dragHandler = function(e){ if (opt.drag) opt.drag.call(obj); e.stopPropagation(); };
opt.leaveHandler = function(e){ if (opt.leave) opt.leave.call(obj); e.stopPropagation(); };
opt.startHandler = function(e){
if (opt.start) opt.start.call(obj);
$(document).on("mousemove",opt.dragHandler);
$(document.body).on("mouseleave",opt.leaveHandler);
$(document).on("mouseup",opt.endHandler); e.stopPropagation(); };
opt.endHandler = function(e){
if (opt.end) opt.end.call(obj);
$(document).off("mousemove",opt.dragHandler);
$(document.body).off("mouseleave",opt.leaveHandler);
$(document).off("mouseup",opt.endHandler); e.stopPropagation(); };
this.on("mousedown",opt.startHandler);
opt.stopdrag = function(){ //this should remove the svg listeners to stop dragging
console.log("stop dragging", opt.drag);
if (opt.end) opt.end.call(obj);
$(document).off("mousemove",opt.dragHandler);
$(document.body).off("mouseleave",opt.leaveHandler);
$(document).off("mouseup",opt.endHandler);
};
return this;
};
})(jQuery);
实施:
$('svg').ondrag({
start: function(){
if (event.which==1) {//pan on left click
} else { //create new element with drag and svg stop dragging
console.log("started dragging on svg");
$(document).trigger("mouseup"); //not working (svg is still dragging)
this.data('ondrag').stopdrag(); //not working
$(document.createElementNS('http://www.w3.org/2000/svg', 'circle'))
.attr({r:50,fill:"lightgray",cx:"50%",cy:"50%"})
.ondrag({
start:function(){ console.log("started dragging circle"); },
drag:function(){ console.log("dragging circle"); }
}).appendTo(this).trigger("mousedown");
}
}, drag: function(){ console.log("dragging on svg"); }
});
问题是,在绑定鼠标处理程序之前,先调用启动函数,所以停止函数无法解除绑定。
http://jsfiddle.net/62XZU/6/
(function($) {
$.fn.ondrag = function(opt) {
//console.log("set drag");
var obj = this;
opt = $.extend({start:null,drag:null,end:null,leave:null,dropElement:document}, opt);
this.data('ondrag',opt);
opt.dragHandler = function(e){ if (opt.drag) opt.drag.call(obj); e.stopPropagation(); };
opt.leaveHandler = function(e){ if (opt.leave) opt.leave.call(obj); e.stopPropagation(); };
opt.startHandler = function(e){
$(document).on("mousemove",opt.dragHandler);
$(document.body).on("mouseleave",opt.leaveHandler);
$(document).on("mouseup",opt.endHandler);
if (opt.start) opt.start.call(obj);
e.stopPropagation();
};
opt.endHandler = function(e){
opt.stopdrag();
e.stopPropagation();
};
this.on("mousedown",opt.startHandler);
opt.stopdrag = function(){
console.log("stop dragging", opt.drag);
$(document).off("mousemove",opt.dragHandler);
$(document.body).off("mouseleave",opt.leaveHandler);
$(document).off("mouseup",opt.endHandler);
if (opt.end) opt.end.call(obj);
};
return this;
};
})(jQuery);
您所需要做的就是将回调移动到开/关调用下方的开始/结束位置。
相关文章:
- 如何通过bxSlider回调api处理事件
- 在Kinetic.js中通过多层处理事件
- 使用自定义数据属性或将数据绑定到处理程序来处理事件
- HTML5拖放;Drop-使用jQuery处理事件
- 如何查找触发或处理事件的 Javascript
- 在 Web 应用中处理事件跟踪的最佳(高性能)方法
- Dojo表单处理事件
- CSS Javascript在1 onClick上处理2事件
- 如何在父视图中绑定子视图处理事件的上下文
- 通过更改HTML元素上的动态类名来处理事件列表器
- 如何在三星智能电视中使用按钮处理事件
- 如何获取表单处理事件
- 如何使用 Web 应用处理事件
- JQuery 处理事件,但不执行函数
- 如何在 jsdoc 中使用@fires处理事件名称中的点
- jqGrid如何处理事件在编辑列后输入键,这要归功于editRow
- 尝试在状态“root.loaded.saved”中处理事件“成为无效”
- 用于处理事件的 Jquery UI 滑块
- 在处理事件时,如何定位具有特定类的元素
- 如何在加载音频源文件时使用 js/jquery 来处理事件