简体   繁体   中英

D3 click event returning null attribute

I'm using D3 V4 and am trying to get the ID of the object that is clicked on. Heck, I'd love to see any attribute value returned (d, fill, class, etc). Instead I get null returned, no matter the attribute. Code below.

    d3.json("0267_02_combine.json", function(json) {
    var features = json.features;

    var path = d3.geoPath()
        .projection(projection.fitExtent([[0, 0], [w, h]], json));

    svg.selectAll(".room")
        .data(json)
    .enter().append("path")
        .attr("class", "room")
        .attr("d", path)
        .attr("fill","lightblue")
        .attr("id", function(d){                
            return d.properties.loc;
        });

    svg.on("click", function() {
        console.log(d3.select(this)); //I see stuff!  Yay!
        console.log(d3.select(this).attr("fill")); //returns null
        console.log(d3.select(this).attr("id")); //returns null
        console.log(d3.select(this).attr("class")); //returns null

        var coords = d3.mouse(this);
        console.log(coords); //returns SVG coordinates
        console.log(projection.invert(d3.mouse(this))); //returns lat/lon

    })

});

Are you sure the selected element you are attaching the click handler to has a fill, class or id?

Try adding your click handler to the path instead.

 d3.json("0267_02_combine.json", function(json) { var features = json.features; var path = d3.geoPath() .projection(projection.fitExtent([[0, 0], [w, h]], json)); var path = svg.selectAll(".room") .data(json) .enter().append("path") .attr("class", "room") .attr("d", path) .attr("fill","lightblue") .attr("id", function(d){ return d.properties.loc; }); path.on("click", function() { console.log(d3.select(this)); //I see stuff! Yay! console.log(d3.select(this).attr("fill")); //returns null console.log(d3.select(this).attr("id")); //returns null console.log(d3.select(this).attr("class")); //returns null var coords = d3.mouse(this); console.log(coords); //returns SVG coordinates console.log(projection.invert(d3.mouse(this))); //returns lat/lon }) }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM