- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
恐怕我还是不明白 d3-object。
我创建了 d3-elements 并为其分配了 select.on("mouseover", onGraphicMouseOver)
事件。
现在我在我的函数中并且有 this
。
如果我记录this
,我会得到直接的svg字符串:
<g id="a29" style="touch-action: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
<line class="hotwater graphic" x1="270" y1="110" x2="540" y2="110" id="g29"></line>
<line class="hotwater graphic" x1="270" y1="120" x2="540" y2="120"></line>
</g>
到目前为止,一切顺利。
现在我想对这些线条进行处理,比如为它们分配类,为此,我想迭代它们。
最好的方法是什么?
我的第一个想法:
for (var i = 0; i < this.childNodes.length; i++) {
this.childNodes[i].classList.add("graphicmouseover");
}
但是有没有更简单的方法,使用d3.js。
如果是的话,我怎样才能自己找到这些信息。我已经使用 d3 好几个星期了,但对这个概念还没有一个真正完整的想法。对于像我这样的傻瓜来说,也许有人知道比原始文档更信息丰富的文档:(
我真的很感谢有用的提示,所以我不必用这些菜鸟问题来惹恼你。
谢谢卡斯滕
根据请求更新:我从数据库中将内部元素(此处为两行)的 svg 字符串作为文本加载。然后:
function loadGraphicIntoEditor(svgGraphics, editor) {
//svgGraphics are the json-recordsets, editor is the d3.selected svg-area
for (var i = 0; i < svgGraphics.length; i++) {
var graphic = svgGraphics[i];
const graph = editor.append("g") //appending the g-tag to the svg-area
.attr("id", "a" + graphic.Id.toString())
.html(graphic.SvgString) //the string <line...></line>
.on("mouseenter", onGraphicMouseEnter)
.on("mouseover", onGraphicMouseOver)
.on("mouseout", onGraphicMouseOut)
.on("mousedown", onGraphicMouseDown)
.on("dblclick", onGraphicDblClick)
.on("contextmenu", onGraphicContext)
.call(d3.drag()
.on("start", graphicDragStart)
.on("drag", graphicDragging)
.on("end", graphicDragEnd));
d3.select(graph.node().childNodes[0]).attr("id", "g" + graphic.Id.toString());
}
}
最终更新:
这是我现在的解决方案:
function onGraphicMouseOver(d, i) {
d3.select(this).selectAll('.graphic').classed("graphicmouseover", true);
}
...生活可以如此简单:)
谢谢大家
最佳答案
尝试如下:
var lines = d3.selectAll('line.hotwater');
//console.log(lines);
lines.each(function(d,i) {
//console.log(i, d, this);
//console.log(this);
d3.select(this)
.attr("stroke", "black")
.attr("stroke-width", "5px")
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg width="1000" height="1000" style="background:#ff0000">
<g id="a29" style="touch-action: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
<line class="hotwater graphic" x1="270" y1="110" x2="540" y2="110" id="g29"></line>
<line class="hotwater graphic" x1="270" y1="120" x2="540" y2="120"></line>
</g>
</svg>
输出:
注意:我在 HTML 中将 svg 背景设置为红色
但后来我用了 d3.selectAll('line.hotwater');
选择我们的两条线。然后用lines.each()
循环它们。并使用d3.select(this)
将其转换为 d3 选择,然后我们可以像往常一样进行修改:
d3.select(this)
.attr("stroke", "black")
.attr("stroke-width", "5px")
这会向线条添加黑色描边和 5px 描边宽度,以便我们在 svg 上看到它们。
我在这里使用 d3.js V5.x,但我认为 API 在几个版本中都是这样的。
更新:正如OP所澄清
最简单的方法就是使用 d3 的 selectAll:
select(this).selectAll('.graphic').classed("graphicmouseover", true);
这本质上是对“this”(来自事件)进行后代 querySelectorAll,然后循环并为每个选定的设置类。 D3 通过其全选为我们管理此操作。
在更全面地了解OP的问题后进行更新。
问题是事件附加到组而不是行。
但我认为有一种方法可以通过如下模式来实现这一目标:
const graph = editor.append("g") //appending the g-tag to the svg-area
.attr("id", "a" + graphic.Id.toString())
.html(graphic.SvgString); //the string <line...></line>
console.log(graph.selectAll('line.graphic').size()); //gives the size of the selection
graph.selectAll('line.graphic')
// .attr('stroke', 'blue')
.on('click', onClick);
我尝试从此处的OP代码中制作一个最小的可重现示例:https://codepen.io/Alexander9111/pen/MWwmVLr
也在这里:
const svgGraphics = [
{
Id: '29',
SvgString: `<line class="hotwater graphic" x1="270" y1="110" x2="540" y2="110" id="g29"></line>
<line class="hotwater graphic" x1="270" y1="120" x2="540" y2="120"></line>`
}
]
const editor = d3.select('svg');
loadGraphicIntoEditor(svgGraphics, editor);
function onClick(d,i){
console.log('clicked');
//console.log(this); //or console.log(event.target);
}
function loadGraphicIntoEditor(svgGraphics, editor) {
//svgGraphics are the json-recordsets, editor is the d3.selected svg-area
for (var i = 0; i < svgGraphics.length; i++) {
var graphic = svgGraphics[i];
const graph = editor.append("g") //appending the g-tag to the svg-area
.attr("id", "a" + graphic.Id.toString())
.html(graphic.SvgString); //the string <line...></line>
console.log(graph.selectAll('line.graphic').size());
graph.selectAll('line.graphic')
// .attr('stroke', 'blue')
.on('click', onClick);
// .on("mouseenter", onGraphicMouseEnter)
// .on("mouseover", onGraphicMouseOver)
// .on("mouseout", onGraphicMouseOut)
// .on("mousedown", onGraphicMouseDown)
// .on("dblclick", onGraphicDblClick)
// .on("contextmenu", onGraphicContext)
// .call(d3.drag()
// .on("start", graphicDragStart)
// .on("drag", graphicDragging)
// .on("end", graphicDragEnd));
d3.select(graph.node().childNodes[0]).attr("id", "g" + graphic.Id.toString());
}
}
line {
stroke: black;
stroke-width: 5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg width="1000" height="1000" style="background:#ff0000">
</svg>
关于javascript - 如何迭代 d3.select(this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60434298/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!