【发布时间】:2014-07-29 12:24:32
【问题描述】:
我一直在尝试,逐步将一些非常好的但静态和非 d3 code 转换为 d3.js 可视化中的动态动画。
(虽然与这个问题没有直接关系,但原始代码“简单”-haha- 接受用户提供的和弦名称,例如“Amaj7”,将其分解为组件音符并显示相关波形。我正在尝试来创建基于和弦名称数组的过渡驱动动画。)
就我而言,对于每次成功代码更新(到 d3.js 友好版本),源代码都会被保存以作为与下一个的工作比较。
在当前的代码更新中,我在尝试合并转换时遇到了一个小故障。过渡本身已得到充分证明,并且(通过日志记录)可以看到按预期触发。
在转换期间,所需的属性值更改(要处理的下一个和弦名称,以及立即转换的目标)失败。将以前的(工作)版本与当前版本进行比较:
初始创建,两者通用,但在单独的文件中,因此元素只能通过 DOM 访问
var input = container
.append("input")
.attr("class", wavebase.animation_type + "_input")
.attr("id", "chordinput")
.attr("type", "text")
.attr("value","Amaj7");
旧
var input = document.getElementById('chordinput');
input.addEventListener('change', inputChanged, false);
inputChanged.call(input);
和(过渡前):
input.setAttribute("value", (waveplot.chordname + "\x0A"));
inputChanged.call(input);
让我们明确一点:上述工作。
新
var input = container
.select("#chordinput")
input.on('change', inputChanged, false);
inputChanged.call(input);
后来,这都没有:
input
.transition()
.text(function() {
return (waveplot.chordname + "\x0A");
})
..也不是这个:
input
.transition()
.attr("value", function() {
return (waveplot.chordname + "\x0A");
});
..nor 变体减去返回字符 ("\x0A") 会导致更新输入元素的值字段。顺便说一下,waveplot.chordname 总是正确定义的。
鉴于新代码中甚至连原来的 Amaj7 都无法识别,我的直觉是问题出在该行
input.on('change', inputChanged, false);
显然,在播放过渡时,我的目标是使用这条线来捕获多个事件。我做错了什么或做错了什么?例如,我是否必须使用不同的触发器(“提交”和“点击”都没有任何影响)、使用 d3.dispatch(),或者甚至将每个事件映射到它自己的 ('change.n') 处理程序?
注意:虽然我很想在 jsfiddle 中演示这个,但整个东西都嵌入在一个框架中,也就是目前不切实际..
谢谢 暴徒
【问题讨论】:
标签: javascript events input d3.js transitions