2012-07-04 38 views
43

Tôi đang cố gắng truy cập các thuộc tính cy cx & cy của một số vòng tròn svg cụ thể mà tôi đã vẽ lên màn hình bằng cách sử dụng hàm .data() của d3.js, bất kỳ ai có thể trợ giúp không? Mã đang cố gắng truy cập vào nó ở bên dưới.Truy cập các thuộc tính phần tử d3.js từ datum?

d3.selectAll(".mynode").each(function(d, i){ 
    if(d.someId == targetId){ 
    console.log(d.attr("cx")); // just trying to demo my point, doesn't work 
    } 
} 

Tôi khá mới để d3.js & javascript, vì vậy tôi không chắc chắn nếu tôi đang tiếp cận trở lại này để phía trước anyways hoặc có lẽ tôi có thể đã bỏ lỡ một giải pháp sẵn có?

+0

bạn đã thử d.cx chưa? Nếu bạn gọi .data trên d3.selectAll (". Mynode") và đối số cho dữ liệu chứa các đối tượng có trường cx, thì nó sẽ hoạt động. – mathheadinclouds

Trả lời

65

Mã của bạn đang cố gắng để có được một thuộc tính svg từ một mục dữ liệu, khi những gì bạn thực sự muốn là nhận được rằng thuộc tính từ các yếu tố svg DOM, như trong:

console.log(d3.selectAll(".mynode").attr("cx")); 

này sẽ chỉ cho bạn thuộc tính cho phần tử không null đầu tiên của lựa chọn của bạn; Bạn cũng có thể filter lựa chọn của bạn để có được những phần tử DOM bạn đang tìm kiếm:

console.log(d3.selectAll(".mynode").filter(_conditions_).attr("cx")); 

Hoặc, nếu bạn muốn truy cập các thuộc tính của tất cả các yếu tố được lựa chọn, sử dụng this trong mỗi chức năng của bạn:

d3.selectAll(".mynode").each(function(d, i){ 
    if(d.someId == targetId){ 
    console.log(d3.select(this).attr("cx")); 
    } 
} 
+1

tôi đã sử dụng 'd3.select (this) .attr (" cx ")' trước nhưng nó đã trả về 'null', tôi nhận ra cuối cùng tôi đã yêu cầu thuộc tính' cx' của một phần tử nhóm svg (doh!) Và i đã phải sửa đổi nó thành 'd3.select (this.firstChild) .attr (" cx ")' để truy cập vào phần tử vòng tròn của tôi trong phần tử nhóm, tôi không thích sử dụng firstChild/lastChild vv, nhưng nó hoạt động ngay bây giờ . Ngoài ra tôi sẽ không có suy nghĩ về phương pháp lọc nếu bạn đã không đề xuất nó, tôi vẫn không hoàn toàn chắc chắn làm thế nào để đi về việc thực hiện nó trong khi tìm kiếm các giá trị cụ thể datum, nhưng cảm ơn bạn! –

+0

Ill cũng thêm rằng nó có thể trả về null nếu bạn cố gắng truy cập nó sớm trong một chuỗi lệnh và giá trị cụ thể chưa được đặt. – greg

12

Phương pháp lọc trong câu trả lời được chấp nhận là chính xác. Cách tiếp cận thứ hai trong câu trả lời được chấp nhận (sử dụng .each) là không chính xác và có lỗi giống như người hỏi đang tạo: nếu .data() không được gọi (trường hợp ở đây), thì đối số đầu tiên d được chuyển tới .each sẽ không được xác định (và không phải là "nút dom hiện tại", vì tất cả người mới, bao gồm cả bản thân tôi, sẽ mong đợi); nút dom hiện tại bạn nhận được thông qua d3.select (điều này), chính xác trong câu lệnh if ở cuối cùng - lỗi nằm trong điều kiện thử nghiệm nếu. Phiên bản chính xác theo sau.

d3.selectAll(".mynode").each(function(d,i){ 
    var elt = d3.select(this); 
    if (elt.attr("id") == "yourTargetIdGoesHere"){ 
     console.log(elt.attr("cx")); 
    } 
}); 

fiddle: fiddle (có chứa mã cho cả hai phiên bản, tức là lọc và mỗi)

UPDATE: Câu trả lời của tôi đã giả định rằng bạn không sử dụng .data(), vì bạn không đưa ra mã vì điều đó; sau đó tôi thấy rằng bạn đã viết rằng bạn đã sử dụng .data()

trong trường hợp đó, tùy thuộc vào cấu trúc dữ liệu của bạn, thay thế d.attr ("cx") theo d.cx đơn giản có thể hoạt động.

11

Có cách thậm chí đơn giản hơn: (cung cấp chỉ số i được đưa ra)

d3.selectAll("circle")[0][i].attributes.cx.value 

vì nó có thể được nhìn thấy here.

Các vấn đề liên quan