d3.drag的文档指出拖动事件的DOM元素目标可用于this
回调:
调度指定事件时,将使用与select相同的上下文和参数调用每个侦听器。在侦听器上:当前数据d和索引i,并且此上下文作为当前DOM元素。
但是我的回叫是一个对象实例,并this
指向该对象。因此,我需要另一种访问通常传入的当前DOM元素的方法this
。我该怎么做?
将第二个和第三个参数一起使用以获取this
何时this
不可用:
d3.drag().on(typename, function(d, i, n) {
//here, 'this' is simply n[i]
})
有关详细说明,请看下面我写的关于this
箭头函数的文章。这个问题与您的不同,但解释是相同的。
这是一个基本的演示,尝试拖动一个圆圈并查看控制台:
var data = d3.range(5)
var svg = d3.select("body")
.append("svg")
.attr("width", 400)
.attr("height", 100);
var circle = svg.selectAll(null)
.data(data)
.enter()
.append("circle")
.attr("cy", 50)
.attr("cx", function(d) {
return 50 + 50 * d
})
.attr("r", 10)
.attr("fill", "tan")
.attr("stroke", "black")
.call(d3.drag()
.on("start", function(d, i, n) {
console.log(JSON.stringify(n[i]))
}))
<script src="https://d3js.org/d3.v4.min.js"></script>
PS:我正在使用JSON.stringify
D3选择,因为如果您尝试进行console.log D3选择,则堆栈片段会冻结。
通过箭头功能使用“ this”
D3.js中的大多数函数都接受匿名函数作为参数。常见的例子是.attr
,.style
,.text
,.on
和.data
,但名单是不是这样大。
在这种情况下,将为按顺序传递的每个选定元素评估匿名函数:
d
)i
)nodes
)this
作为当前DOM元素。基准,所述索引和所述当前组作为参数,在D3.js著名的第一,第二和第三参数(其参数被命名为传统上通过d
,i
并且p
在D3
3.x版)。对于使用this
,则不需要使用任何参数:
.on("mouseover", function(){
d3.select(this);
});
this
当鼠标悬停在元素上时,将选择上面的代码。检查它是否在此提琴中正常工作:
作为新的ES6语法,与函数表达式相比,箭头函数的语法更短。但是,对于经常使用的D3程序员来说this
,有一个陷阱:箭头函数不会创建自己的this
上下文。这意味着,在箭头功能中,this
其含义是从封闭上下文中获取的。
在某些情况下这可能很有用,但是对于习惯于this
在D3中使用的编码器来说,这是一个问题。例如,使用上面小提琴中的相同示例,此操作将无效:
.on("mouseover", ()=>{
d3.select(this);
});
好吧,这不是一个大问题:可以在需要时简单地使用常规的老式函数表达式。但是,如果您想使用箭头函数编写所有代码怎么办?是否可以使用带有箭头功能的代码
并this
在D3中正确使用?
答案是 肯定的 ,因为this
与相同nodes[i]
。当它描述时,提示实际上在整个D3 API中都存在:
…以
this
作为当前DOM元素(nodes[i]
)
解释很简单:因为nodes
是DOM中的当前元素组,并且i
是每个元素的索引,所以nodes[i]
请引用当前DOM元素本身。即this
。
因此,可以使用:
.on("mouseover", (d, i, nodes) => {
d3.select(nodes[i]);
});
我正在创建一个带有拖放特性的javafx应用程序。我需要能够从一个窗格拖拽到下一个窗格。丢弃后,所有被丢弃的节点都需要是可访问的。拖放操作很顺利。然而,我有一个问题,其中不是所有的节点都可以访问后删除。我会拖动一个节点并点击它,有时它会做出响应,但有时当我点击它时,一个随机节点将不再显示功能。对于哪些节点停止工作,哪些节点始终工作,没有明显的模式(我可以看到)。如果任何人有任何关于为什么这可能是一
我在一个2D游戏中使用Unity(我对它还是很业余的),虽然使用create->ui->image添加一个新的sprite工作很好,但无论我从资产文件夹中拖放一个图像,它总是位于我为画布设置的背景后面,不管我是否使用更高的排序顺序,如果图像是画布的子级,或者图层对我的所有画布元素都是相同的(UI或默认)。在尝试拖动动画时也会得到相同的结果。 我在某个地方读到画布有点像另一个UI元素,图像必须是它的
我试图在Android上构建一个回调类,从我的原生代码中的不同线程调用Java方法。我读过很多关于如何做到这一点的书,只要我在同一条线上,这一切都是有效的。但是,从另一个线程中,我无法正确检索,也无法找出我做错了什么。 我对C和JNI不是很有经验,所以这很可能是初学者的问题。。。但我已经花了好几天时间,看不出它是什么。 这是我的回调类,. h和. cpp文件: 这是我的原生_库,在这里我获得了,并
我有一个非常奇怪的问题,当我把一个项目从计划外的游戏桶拖到一个网格中时,你可以看到可拖动的项目被切断,大约80%的时间都是在这个区域上拖动的。 当计划外游戏中的项目溢出时,滚动条会出现这种情况。否则,拖动时不会切断。在网格中的游戏之间也可以找到拖放工作。 这只发生在Chrome中。Firefox和Edge运行良好。我真的不知道要显示什么JS或CSS,因为它可以是任何东西。 另外,当我像下面的屏幕一
我在JavaFX中创建了一个小的绘画程序,并且有了一个圆形创建工具。目前,我可以正确地画圆,但与我的其他工具不同,我看不到正在创建的圆(即,当我拖动鼠标时)。只有当我松开鼠标时,我才能看到圆(以正确的尺寸绘制)。我试图在拖动时添加一个< code>strokeOval()方法,但是它创建了一个奇怪的“泪珠”状的圆。我什么都试过了,有人能帮忙吗? 这是我的代码: 上面的代码正确创建了圆,但在我释放鼠
问题内容: 当它的DOM元素(包括所有子节点)实际加载到页面上并准备就绪时,我想在我的react.js组件上调用一个回调。具体来说,我有两个要渲染相同大小的组件,选择具有自然尺寸的任何一个组件的最大值。 看起来并不是我真正想要的,因为每个组件仅被调用一次,但是我希望在组件完成渲染后再次调用我的回调。我以为可以将事件添加到顶级DOM元素中,但是我想这仅适用于某些元素,例如和。 问题答案: 看起来像的