Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.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 传递给侦听器的第三个参数是什么?_Javascript_D3.js - Fatal编程技术网

Javascript 传递给侦听器的第三个参数是什么?

Javascript 传递给侦听器的第三个参数是什么?,javascript,d3.js,Javascript,D3.js,我目前开始使用d3框架。我注意到,对于v3,有第三个参数传递给事件侦听器。它似乎总是0,但我找不到关于它应该代表什么的任何信息 从: 指定的侦听器以和其他操作符函数相同的方式被调用,被传递当前数据d和索引i,该上下文作为当前DOM元素 第三个参数的含义是什么 在本例中,您将看到,单击任意矩形后,3个参数将传递给f: var svg=d3.selectbody.appendsvg 函数fd、idx、whoami{ log'I是数据:\t'+d; log'I是索引:\t'+idx; console

我目前开始使用d3框架。我注意到,对于v3,有第三个参数传递给事件侦听器。它似乎总是0,但我找不到关于它应该代表什么的任何信息

从:

指定的侦听器以和其他操作符函数相同的方式被调用,被传递当前数据d和索引i,该上下文作为当前DOM元素

第三个参数的含义是什么

在本例中,您将看到,单击任意矩形后,3个参数将传递给f:

var svg=d3.selectbody.appendsvg 函数fd、idx、whoami{ log'I是数据:\t'+d; log'I是索引:\t'+idx; console.log'但我是谁?\t'+whoami; log'Length:'+arguments.Length; console.logarguments; } var数据=['A','B','C']; svg.selectAll'rect' .数据 进来 .append'rect' .attrx,0 .attry,functionel,i{return i*40;} .宽度,100 .身高40 .onclick,f; 直肠{ 填充:333; 不透明度:0.3; 笔画:白色; }
这实际上是一个未记录的特性。查看v3.5.17中selection.on的后面部分,您会注意到selection.each将侦听器绑定到当前选择的每个节点

return this.each(d3_selection_on(type, listener, capture));
从那里开始,内部函数将计算为,以添加侦听器,对onAdd函数的引用将作为回调传递给.each。因此,.each将实际为当前选择中的每个节点执行onAdd。另一方面,onAdd将关闭由传递给它的参数。每次调用都会在侦听器上下文中关闭这些参数:

function d3_selection_on(type, listener, capture) {

  /* ... */

  function onAdd() {
    var l = wrap(listener, d3_array(arguments));  // wrap points to d3_selection_onListener
    /* ... */
  }

  /* ... */

function d3_selection_onListener(listener, argumentz) {
  return function(e) {
    /* ... */
    argumentz[0] = this.__data__;                 // Set the latest datum as the first argument
    try {
      listener.apply(this, argumentz);            // Pass arguments from closure to the listener
    } finally {
      d3.event = o;
    }
  };
}
查看one的实现时,会注意到不仅仅是-中提到的两个参数被传递到回调,而是:

第三个参数j是组的索引。由于代码不使用分组,因此该参数的计算结果始终为0

修改演示可以轻松演示设置分组选择如何影响第三个参数的值。下面的代码片段复制了三个矩形,将每组矩形放在一个中,同时使用具有自己数据绑定的子选择建立分组

var svg=d3.selectbody.appendsvg 函数fd、idx、whoami{ log'I是数据:\t'+d; log'I是索引:\t'+idx; console.log'但我是谁?\t'+whoami; log'Length:'+arguments.Length; console.logarguments; } var数据=[[A]、[B]、[C']、[A]、[B]、[C']; svg.选择全部'g' .数据 .enter.append'g' .选择All'rect' .datad=>d .enter.append'rect' .attrx,functionel,i,j{返回j*110;} .attry,functionel,i{return i*40;} .宽度,100 .身高40 .onclick,f,true; 直肠{ 填充:333; 不透明度:0.3; 笔画:白色; }
表示“当前组节点”。它是选择中的节点,约定不是调用第三个参数的标准,但如果是节点,则在侦听器中:this==nodes[i]。@AndrewReid,但它是0。不可能是0[i]。@SebastianSimon嗯,我没想到d3v4/5和v3在这方面有所不同,需要仔细看看。有时我觉得D3文档太肤浅了。。。但后来我看到一些图书馆的所谓文档非常不足,我改变了主意,D3文档非常好。@GerardoFurtado。我总是很惊讶D3文档实际上有多好。至少,如果与其他人相比。老实说,我认为这是我见过的最好的自由软件文档之一。这并不完美,但大多数问题都可以通过阅读文档来回答。我同意你们两个的看法,当我看到这里的问题说医生回答同一个问题很糟糕时,我总是有点恼火。尤其是与其他大多数看起来更糟糕的库相比。如果你要将每个模块的文档合并成一个文档,那么文档就更令人印象深刻了,这是一项巨大的工作@altocumulus,很好地找到了答案。@Andrewerid Fil在一篇关于我在GitHub repo上打开的一个问题的文章中向我指出了一个有趣的发展:一些工作正在进行中,以使API.md文件可以机器读取!请参阅和上的演示应用程序。太棒了!所以它是组ID。然后它实际上间接地记录在中。
if (node = group[i]) callback(node, i, j);