为什么我保存的D3选择在某些情况下没有效果
Why does my saved D3 selection have no effect in some cases?
我对如何保存D3选择供以后使用感到困惑。在下面的代码中,我为坐标轴设置了一个"全局"变量,在第一次创建坐标轴时将它们保存到该变量中。后来,我能够将这个变量用于某些事情(这里,设置一些文本),但不能用于其他事情(这里,更新比例),这只有在我显式地(重新)选择坐标轴时才能工作。
可能有一些关于JavaScript变量作用域或生命周期,我不明白吗?感谢任何帮助!
相关代码,从完整的上下文中浓缩而来:
// Top level of page
var gxaxis, gyaxis;
var updatePlot = function (view, first) {
d3.csv("data.csv", function (error, data) {
data.forEach(function (d) {
...
});
var x, y;
x = d3.scale.linear().range(...);
y = d3.scale.linear().range(...);
x.domain(d3.extent(data, function (d) {...})).nice();
y.domain(d3.extent(data, function (d) {...})).nice();
var xAxis = d3.svg.axis().scale(x).orient("bottom");
var yAxis = d3.svg.axis().scale(y).orient("left");
// The variable 'first' is true on page load, so this code the if clause will be executed before any executions of the else clause
if (first) {
gxaxis = svg.append("g").attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end");
gyaxis = svg.append("g").attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("class", "label")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end");
} else {
// Why is it necessary to explicitly select; why can't I use my gxaxis variable (as I do below for the text)?
svg.select(".x.axis")
.transition().duration(0).ease("in")
.call(xAxis);
// Using gyaxis.transition()... has NO EFFECT
svg.select(".y.axis")
.transition().duration(0).ease("in")
.call(yAxis);
}
var xLabel = ...;
var yLabel = ...;
// This use of gxaxis works.
gxaxis.text(xLabel);
gyaxis.text(yLabel);
});
};
// Set up handlers for switching among views
d3.selectAll(".view-select").on("click", function () {
d3.event.preventDefault();
updatePlot(this.id, false);
});
updatePlot('a', true);
代码:
gxaxis = svg.append("g").attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end");
创建这个DOM:
<svg>
<...>
<g class="x axis">
<g class="tick">
<line ...>
<text ...>
</g>
</g>
</...>
</svg>
并将text
保存到选区中,因为它是最后添加的。
如果你想要坐标轴,在编辑文本之前保存坐标轴。
gxaxis = svg.append("g").attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
gxaxis.selectAll("text")
.attr("class", "label")
.attr("x", width)
.attr("y", -6)
.style("text-anchor", "end");
相关文章:
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- 在不移动内部文本的情况下缩放元素的效果
- 如何在有延迟的情况下对两个代码进行积分
- 有没有一种方法可以在没有文档或jQuery的情况下使用javascript解码html实体
- 为什么jQuery代码段在没有IFrame的情况下可以工作,而在有IFrame时却不能工作
- 如何检查html5视频是否有足够的缓冲,以便在不停止缓冲的情况下播放
- 有没有任何情况下,一个方法不应该是原型方法
- JavaScript while循环没有'不能在有条件的情况下工作
- 类型胁迫在有条件的情况下更危险吗?
- 有没有办法在没有真正的点击事件的情况下使用 onclick
- 在这种情况下,我应该如何在余烬中放置我的模型有很多关系
- 有没有一种方法可以在没有谷歌云控制台的情况下使用带有JavaScript的谷歌硬盘
- 在这种情况下,有什么方法可以向`.call()`发送更多的参数吗
- 如何在没有过渡效果的情况下使用fancybox调整大小
- 有没有一种方法可以在没有jQuery的情况下获得JavaScript中当前添加到后台的事件列表
- 有没有一种方法可以在没有视口元标记的情况下获得硬件像素中的真实视口大小
- 有没有一种方法可以让jQuery日期选择器在没有年份的情况下工作
- Greasemonkey-如何只在有焦点的情况下突出显示
- 为什么我保存的D3选择在某些情况下没有效果
- 是否有可能在不使用服务器端代码的情况下有条件地向页面添加JavaScript文件?