I've been struggling to make a piece of text clickable. I could make other text clickable and the function behaved as expected once this text was clicked. The troublesome text was nested inside something, I think that's why it was not behaving the same with .on()
I added an id
to the piece of text to make it easy to select.
Now I finally have a piece of code which makes the text clickable and everything performs as it should - but only when entered in the Chrome developer console! :
d3.select("#patext").on("click", function() {toggleLine();})
Once this is entered in the Chrome console everything works perfectly but in the index.html
file it does nothing. 'patext' is the id I gave it earlier. The index.html
contains a <style></style>
section at the top, then underneath a <body></body>
. Inside the body are two <script></script>
the first loads d3.js the second is my script. The d3.select()
line above is just below the function definition of toggleLine()
.
Have already gone through the suggestions here and here and my script is in the body and script to load d3 is a separate one to the main script. Any ideas?
As requested, here are 80 of the original 240 lines it's based on a Bostock script hope I didn't remove anything important
<!DOCTYPE html>
<meta charset="utf-8">
<style>
body {
font: 10px sans-serif;
/* background-color: #ffeda0;*/
}
.axis path
</style>
<body>
<script src="//d3js.org/d3.v3.min.js"></script>
<script>
var parseDate = d3.time.format("%Y-%m-%d").parse;
var x = d3.time.scale().range([0, width]);
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
d3.csv("myfile.csv", function(error, data) {
if (error) throw error;
color.domain(d3.keys(data[0]).filter(function(key) { return key !== "date"; }));
data.forEach(function(d) {
d.date = parseDate(d.date);
});
var cities = color.domain().map(function(name) {
return {
name: name,
values: data.map(function(d) {
return {date: d.date, temperature: +d[name]}; // plus casts a string '55' to a number 55
})
};
});
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain([
d3.min(cities, function(c) { return d3.min(c.values, function(v) { return v.temperature; }); }),
d3.max(cities, function(c) { return d3.max(c.values, function(v) { return v.temperature; }); })
]);
svg.append("rect") // fill it a colour
.attr("width", 830)
.attr("height", "100%")
.attr("fill", "AliceBlue");
svg.append("g")
.classed("axis x", true)
.call(xAxis2);
var city = svg.selectAll(".city")
.data(cities)
.enter().append("g")
.attr("class", "city");
city.append("path")
.style("stroke", function(d) {return color(d.name); })
.attr("class", "line")
.attr("id", function(d) {console.log((d.name).slice(0,3));return (d.name).slice(0,3);}) // for click fn below.
city.append("text")
.datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; })
.style("stroke", function(d) {return color(d.name); })
.transition()
.attr("x", 3)
.attr("dy", ".35em")
.text(function(d) { return d.name; })
.attr("id", function(d) {console.log((d.name).slice(0,2)+"text");return ((d.name).slice(0,2)+"text");}) // for click fn
});
function toggleLine() {
var active = gol.active ? false : true,
newOpacity = active ? 0 : 1;
d3.select("#gol").style("opacity", newOpacity);
gol.active = active;}
document.addEventListener("DOMContentLoaded", function(event) {
//... your code
d3.select("#patext").on("click", function() {toggleLine();});
//... more of your code
});
</script>
</body>