Кодом, у меня есть средства, чтобы принять обработчик событий элемента управления и перемещение этих обработчиков к другому элементу и удалять обработчик событий предыдущего элемента управления скрипкой http://jsfiddle.net/pydty4bq/подкачки обработчики событий между элементами DOM d3
var slider = d3.select('#slider1');
var slider1Config = {
element: slider,
drag:function(e){
if(d3.event.toElement)
console.log('has toElement',d3.event.toElement.valueAsNumber);
else
console.log(d3.event.sourceEvent.srcElement.valueAsNumber);
},
dragstart:function(){console.log('dragstart!');},
dragend: function(){ console.log('dragend!');}
}
var _drag = new Drag(slider1Config);
_drag.element(d3.select('#slider2'));
функцию _drag.element
следует удалить обработчики событий из слайдера1 и поместите их на слайдер2. В настоящее время оба элемента запускают обработчики событий.
// перетаскивание функциональность
var Drag = (function(){
var _opts,
_drag = d3.behavior.drag();
var eventList = ['drag','dragstart','dragend'];
function attachEvents(opts){
eventList.forEach(function(e,i){
if(opts[e]){
_drag.on(e,this[e]);
}
else{
_drag.on(e,null);
}
}.bind(this));
};
function detachEvents(){
eventList.forEach(function(e,i){
if(_opts[e]){
_drag.on(e,null);
}
}.bind(this));
}
function Drag(opts){
_opts = opts;
attachEvents.call(this,opts);
_opts.element = opts.element.call(_drag);
_opts.element.attr('isDraggable',true);
}
Drag.prototype.drag = function(args){
_opts.drag(args);
};
Drag.prototype.dragstart = function(args){
_opts.dragstart(args);
}
Drag.prototype.dragend = function(args){
_opts.dragend(args);
}
Drag.prototype.element = function(el){
if(el){
detachEvents.call(this)
_opts.element = el;
attachEvents.call(this,_opts);
_opts.element.call(_drag);
}
}
Drag.prototype.config = function(opts){
_opts = opts;
attachEvents.call(this,_opts);
}
return Drag;
})();
Что случилось с detachEvents
, что он не удаляет слушателей событий из предыдущего элемента?
, кстати, в настоящее время ваши объекты _opts и _drag будут перезаписаны каждый раз, когда вы выполняете «новое перетаскивание». –