Javascript 与d3事件绑定
在d3中编写事件处理程序时,是否有直接使用等效程序的方法?我没有看到文档中任何地方实现或讨论了Javascript 与d3事件绑定,javascript,svg,d3.js,Javascript,Svg,D3.js,在d3中编写事件处理程序时,是否有直接使用等效程序的方法?我没有看到文档中任何地方实现或讨论了bind 目前我正在这样做: graph = function () { var self = this; this.svg = d3.select('body').append('svg'); this.svg.append('svg:rect') .style('fill', '#f00') .attr('width', 300)
bind
目前我正在这样做:
graph = function () {
var self = this;
this.svg = d3.select('body').append('svg');
this.svg.append('svg:rect')
.style('fill', '#f00')
.attr('width', 300)
.attr('height', 300);
this.svg.on('mousedown', function(){return self.mouseDown.call(this, self);})
}
graph.prototype.mouseDown = function (self) {
/* 'self' is the instance of graph */
alert(self.svg);
/* 'this' is the event */
alert(d3.mouse(this));
}
var g = new graph();
这个很好用。然而,在这里使用匿名函数调用似乎是一种糟糕的做法,因为bind
本来可以在常规DOM元素上实现这一点(如果我没有使用d3选择)。我更喜欢使用d3选择,而不是针对底层DOM元素(为了一致性,并且因为this.svg
已经附加到graph
对象)
由于d3的位于
方法上,在这里传递数据还有其他选项吗?这一切都源于这样一个事实,即d3依赖This
关键字来指向DOM元素-使用This
几乎就像传递给处理函数的另一个参数一样。这与this
作为类实例引用的典型用法“冲突”
由于Function.prototype.bind()
只是显式设置函数调用的this
关键字的一种方法,因此它不能解决您的问题。换句话说,如果需要同时访问DOM元素和类实例,则必须设置一个辅助变量,如self
,以指向这两个变量之一
这至少部分地解释了为什么d3自己的类(例如,d3.svg.axis
)不使用原型
的类声明方式,而是依赖闭包(如前所述)。因此,要么切换到这种类型的类声明,要么必须按照示例中显示的方式继续执行。您的示例还有一个更为惯用的变体,但它与您的示例基本相同:
graph = function () {
this.svg = d3.select('body').append('svg');
this.svg.on('mousedown', this.mouseDownHandler())
}
graph.prototype.mouseDownHandler = function () {
/* 'self' is the instance of graph */
var self = this;
return function(d, i) {
/* 'this' is the DOM element */
alert(d3.mouse(this));
/* now you can work with both "self" and "this" */
}
}
var g = new graph();
你所说的绑定是什么意思:它是一种众所周知的功能吗?一些概念?好的,我已经编辑了你的问题。看看你是否喜欢。你在找吗?为什么不使用this.mouseDown.bind(this)
?这也是我最初的想法。我知道我必须传递这两个对象,但我希望我可以避免这样做var self=this代码>。我读过关于闭包/链接属性偏好的文章,但是图形
对象是一个更大的代码库中的一小部分,它已经用函数原型进行了样式化