如何将拖动用作 'function' 而不是 'var'?
How to use drag as a 'function' instead of a 'var'?
首先我用它来拖动屏幕上的对象:
var button_drag = d3.behavior.drag()
d3.behavior.drag()
.origin(function() {
var g = this;
return {x: d3.transform(g.getAttribute("transform")).translate[0],
y: d3.transform(g.getAttribute("transform")).translate[1]};
})
.on("drag", function(d) {
g = this;
translate = d3.transform(g.getAttribute("transform")).translate;
x = d3.event.dx + translate[0],
y = d3.event.dy + translate[1];
//boundaries
// if(x<10){x=10}
// if(x>100){x=100}
if(y<10){y=10}
if(y>200){y=200}
d3.select(g).attr("transform", "translate(" + x + "," + y + ")");
d3.event.sourceEvent.stopPropagation();
});
这样称呼它:
buttons.call(buttons_drag);
现在我想把它改成一个函数,这样我就可以通过它传递变量来为不同的对象设置不同的边界:
function button_drag(xLower,xhigher,yLower,yHigher){
d3.behavior.drag()
.origin(function() {
var g = this;
return {x: d3.transform(g.getAttribute("transform")).translate[0],
y: d3.transform(g.getAttribute("transform")).translate[1]};
})
.on("drag", function(d) {
g = this;
translate = d3.transform(g.getAttribute("transform")).translate;
x = d3.event.dx + translate[0],
y = d3.event.dy + translate[1];
//boundaries
if(x<xLower){x=xLower}
if(x>xHigher){x=xHigher}
if(y<yLower){y=-yLower}
if(y>yHigher){y=yHigher}
d3.select(g).attr("transform", "translate(" + x + "," + y + ")");
d3.event.sourceEvent.stopPropagation();
});
}
然后这样称呼它:
buttons.call(buttons_drag(xLower,xHigher,yLower,yHigher));
一旦我将其更改为函数,整个拖动功能似乎根本不起作用,我也不太清楚为什么。
我应该换一种方式吗?基本上我想做的就是对所有对象使用一个拖动函数,但是在我调用拖动函数时通过 'boundaries'。
就目前而言,您的 buttons.call()
函数永远不会收到拖动行为的处理程序。之前你给了它 d3.behavior.drag()
调用的 return 值,但你稍后的函数没有 return 那个引用。
所以只需添加一个 return
就可以了:
function button_drag(xLower,xhigher,yLower,yHigher){
return d3.behavior.drag()
// ...
}
首先我用它来拖动屏幕上的对象:
var button_drag = d3.behavior.drag()
d3.behavior.drag()
.origin(function() {
var g = this;
return {x: d3.transform(g.getAttribute("transform")).translate[0],
y: d3.transform(g.getAttribute("transform")).translate[1]};
})
.on("drag", function(d) {
g = this;
translate = d3.transform(g.getAttribute("transform")).translate;
x = d3.event.dx + translate[0],
y = d3.event.dy + translate[1];
//boundaries
// if(x<10){x=10}
// if(x>100){x=100}
if(y<10){y=10}
if(y>200){y=200}
d3.select(g).attr("transform", "translate(" + x + "," + y + ")");
d3.event.sourceEvent.stopPropagation();
});
这样称呼它:
buttons.call(buttons_drag);
现在我想把它改成一个函数,这样我就可以通过它传递变量来为不同的对象设置不同的边界:
function button_drag(xLower,xhigher,yLower,yHigher){
d3.behavior.drag()
.origin(function() {
var g = this;
return {x: d3.transform(g.getAttribute("transform")).translate[0],
y: d3.transform(g.getAttribute("transform")).translate[1]};
})
.on("drag", function(d) {
g = this;
translate = d3.transform(g.getAttribute("transform")).translate;
x = d3.event.dx + translate[0],
y = d3.event.dy + translate[1];
//boundaries
if(x<xLower){x=xLower}
if(x>xHigher){x=xHigher}
if(y<yLower){y=-yLower}
if(y>yHigher){y=yHigher}
d3.select(g).attr("transform", "translate(" + x + "," + y + ")");
d3.event.sourceEvent.stopPropagation();
});
}
然后这样称呼它:
buttons.call(buttons_drag(xLower,xHigher,yLower,yHigher));
一旦我将其更改为函数,整个拖动功能似乎根本不起作用,我也不太清楚为什么。
我应该换一种方式吗?基本上我想做的就是对所有对象使用一个拖动函数,但是在我调用拖动函数时通过 'boundaries'。
就目前而言,您的 buttons.call()
函数永远不会收到拖动行为的处理程序。之前你给了它 d3.behavior.drag()
调用的 return 值,但你稍后的函数没有 return 那个引用。
所以只需添加一个 return
就可以了:
function button_drag(xLower,xhigher,yLower,yHigher){
return d3.behavior.drag()
// ...
}