javascript - 从 d3 中的函数内部调用函数

标签 javascript d3.js

我怀疑这是一个关于 d3 如何工作的相当基本的问题。我从这段代码开始,该代码运行良好并触发 nodeClick 操作...

var nodeEnter = node.enter()
                        .append("g")
                        .attr("class", "node")
                        .on("click", nodeClick)

但后来我将其更改为使用单击函数来确定是使用单击还是双击...

.on("click", function(d) {
                            if some logic ()  {
                               console.log("double click");
                            } else {
                                console.log("single click only");
                                nodeClick;
                            }
                        })

这在输出正确的控制台消息方面完美地工作,但似乎我对 nodeClick 的调用在嵌入函数中时无法正常工作(即未触发节点单击行为)。我尝试更改为 nodeClick() 和 nodeClick(d) 但这只会导致错误。

我是否遗漏了一些可以解释此行为的内容?对我来说这似乎很奇怪,我看到从函数外部和内部调用“nodeClick”有两种不同的行为。

感谢您的帮助!

这是有问题的完整代码...

dblclick_timer = false;
//.on("click", nodeClick) //works perfectly
.on("click", function(d) {
    if ( dblclick_timer )  {
        clearTimeout(dblclick_timer)
        dblclick_timer = false
        console.log("double click");
        d.fixed=false;
    }
    else dblclick_timer = setTimeout( function(){
                            dblclick_timer = false
                            console.log("single click only");
                            d3.select(this).nodeClick;
                        }, 250)
})

在收到所有很好的反馈之后,这是通过在 d3.event 变为 null 之前存储它的工作解决方案...

.on("click", function(d,i) {
                            var cacheEvent = d3.event;
                            if ( dblclick_timer )  {
                                clearTimeout(dblclick_timer)
                                dblclick_timer = false
                                console.log("double click");
                                d.fixed=false;
                                force.start(); 
                            }
                            else dblclick_timer = setTimeout( function(){
                                dblclick_timer = false
                                console.log("single click only");
                                d3.event = cacheEvent;
                                nodeClick.call(d3.select(this), d, i);
                            }, 250)
                        })

最佳答案

正如第一条评论中所述,您必须建立正确的上下文:它是 javaScript 的东西,而不是 d3 的东西。如果您建立正确的 this 上下文并传递相同的参数,它将完全相同。关键是使用 Function.prototype.call 来调用回调。这是standard javaScript .

.on("click", function(d, i) {
                            if some logic ()  {
                               console.log("double click");
                            } else {
                                console.log("single click only");
                                nodeClick.call(this, d, i);
                            }
                        })  

documents 中所述

The specified listener is invoked in the same manner as other operator functions, being passed the current datum d and index i, with the this context as the current DOM element.

关于javascript - 从 d3 中的函数内部调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31190726/

相关文章:

javascript - 椭圆弧箭头边d3力布局

javascript - 如何消除c3js折线图中的轴线溢出

javascript - 在基于本地文件的应用程序中(文件为 ://)),是否可以使用 AngularJS 进行 HTML5 模式 URL 路由

javascript - 如何在 Javascript 中获取用户的多个输入?如何为所有人声明变量?

javascript - jQuery 动画回调吃掉的事件对象

javascript - 如何使用 JQuery 倒计时从 Bootstrap 日期选择器中开始计算 "change"事件后的剩余时间?

javascript - 如何从 Kaizala API 获取 accessToken

javascript - NVD3 中的 ScatterChart – 从 csv 文件读取数据

javascript - D3 多层时间轴

javascript - 淡出文本标签以及 d3 中的节点