Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 与d3事件绑定_Javascript_Svg_D3.js - Fatal编程技术网

Javascript 与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)

在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)
        .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。我读过关于闭包/链接属性偏好的文章,但是
图形
对象是一个更大的代码库中的一小部分,它已经用函数原型进行了样式化