d3

2012-07-31 9 views
13

'da SVG foreignObject öğesi seçilemiyor SVG foreignObject öğeleriyle uygulanan HTML düğüm etiketleri olan d3 zorla yönlendirilmiş bir düzen ile çalışıyorum. Bu elemanları konumlarını ve diğer özelliklerini güncellemek için çeşitli zamanlarda seçmek istiyorum (ve bunlar oluşturulduğu ve ve exit() ile destoryed olarak izledikleri gibi), ancak diğer SVG öğeleri gibi onları seçebiliyorum gibi görünmüyor .d3

İşte kompakt örnektir:

HTML:

<html> 
    <head> 
     <title>Cannot Select SVG Foreign Object</title> 
     <script src="http://d3js.org/d3.v2.js"></script> 
     <script src = "fo_select.js"></script> 
    </head> 
    <body> 
     <svg id="example_svg" width="600" height="600"> 
       <g> 
        <circle r="40" cx = "80" cy="80"></circle> 
        <foreignObject width = "100" height = "100" x = "200" y="200"> 
         <body>Hello, world</body> 
        </foreignObject> 
       </g> 
     </svg> 
     <script>run()</script> 
    </body> 
</html> 

JavaScript: Bu kadar http://bl.ocks.org/3217448 de de

function run() { 
    svg = d3.select("#example_svg"); 
    console.log(svg.selectAll("circle")); 
    console.log(svg.selectAll("foreignObject")); 
} 

. Konsol çıktısı: ikinci bir boş iken birinci dizi circle elemanı içeren

[Array[1]] 
[Array[0]] 

. circle nesnesi neden seçilebilir, ancak foreignObject değil? foreignObject'un alışılmadık doğası ile ilgili olduğunu varsayıyorum. Kodumda işlemek için onu nasıl seçerim? Çok teşekkürler.

+0

(Ek virgül yazım hatalarını kaldırmak için güncelleştirildi) –

cevap

19

Kesinlikle, SVG büyük/küçük harf duyarlı olduğundan <foreignobject> yerine <foreignObject> kullanmalısınız.

Daha da önemlisi, camelCase öğelerinin seçilmesini engelleyen bir bug in WebKit açık olmasıdır. Alternatif

, CSS sınıflarını veya kimliklerini kullanabilirsiniz

.selectAll(function() { return this.getElementsByTagName("foreignObject"); }) 

(. Şimdi kapalı WebKit bug 46800 bkz Gerçi eski WebKit sürümleri çalışmayabilir):

olası bir geçici çözüm kullanmaktır ve bunun yerine öğelerinizi seçin. Bahsedilen çeşitli hatalar göz önüne alındığında bu yaklaşımı şu anda tavsiye ederim.

+2

Çok teşekkürler - bu bir hata olduğunu daha iyi hissettiriyor. :-) Sınıf seçimini bir geçici çözüm olarak kullanacağım. –

+0

"Uncaught SyntaxError: Sorgu yürütülemedi:" [object NodeList] 'geçerli bir seçici değil. " d3.selectAll kullanırken (document.getElementsByTagName ("foreignObject")). Ama sınıf adına göre seçim mükemmel bir şekilde çalışır. Teşekkürler. Chrome 31'de hala bir hata görünüyor. –

+0

Aslında, önerilen geçici çözümümde bir hata oluştu. Seçimin her öğesi için çağrılan bir işlevi kullanmak için güncelledik. Orijinal önerim, yalnızca selection.selectAll değil d3.selectAll için çalıştı. –

-2

d3.selectAll ("foreignObject") veya svg.selectAll ("foreignObject") yapabilmeniz gerekir. ForeignObject özniteliklerinizde (x ve y arasında) fazladan virgül olabilir. D3'ü kullanarak sadece foreignObject öğelerini ekledim, bu yüzden onları farklı bir şekilde gömmekle ilgili bir şey var.