jQuery 3'te bu sorun yok
JQuery 3.0 revizyonlarında listelenen değişikliklerden biri:
SVG sınıfı manipülasyonu ekle ( # 2199 , 20aaed3 )
Bu sorunun bir çözümü jQuery 3'e yükseltmek olacaktır. Harika çalışıyor:
var flip = true;
setInterval(function() {
// Could use toggleClass, but demonstrating addClass.
if (flip) {
$('svg circle').addClass('green');
}
else {
$('svg circle').removeClass('green');
}
flip = !flip;
}, 1000);
svg circle {
fill: red;
stroke: black;
stroke-width: 5;
}
svg circle.green {
fill: green;
}
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<svg>
<circle cx="50" cy="50" r="25" />
</svg>
Sorun:
JQuery sınıfı düzenleme işlevlerinin SVG öğeleriyle çalışmamasının nedeni, 3.0'dan önceki jQuery sürümlerinin className
bu işlevler için özelliği kullanmasıdır .
cur = elem.nodeType === 1 && ( elem.className ?
( " " + elem.className + " " ).replace( rclass, " " ) :
" "
);
Bu, HTML öğeleri için beklendiği gibi davranır, ancak SVG öğeleri className
için biraz farklıdır. Bir SVG öğesi için, className
bir dize değil, bir örneğidir SVGAnimatedString
.
Aşağıdaki kodu göz önünde bulundurun:
var test_div = document.getElementById('test-div');
var test_svg = document.getElementById('test-svg');
console.log(test_div.className);
console.log(test_svg.className);
#test-div {
width: 200px;
height: 50px;
background: blue;
}
<div class="test div" id="test-div"></div>
<svg width="200" height="50" viewBox="0 0 200 50">
<rect width="200" height="50" fill="green" class="test svg" id="test-svg" />
</svg>
Bu kodu çalıştırırsanız geliştirici konsolunuzda aşağıdakine benzer bir şey görürsünüz.
test div
SVGAnimatedString { baseVal="test svg", animVal="test svg"}
Bu SVGAnimatedString
nesneyi jQuery'nin yaptığı gibi bir dizeye atacak olsaydık [object SVGAnimatedString]
, jQuery'nin başarısız olduğu yer olurdu .
JQuery SVG eklentisi bunu nasıl ele alır:
JQuery SVG eklentisi, SVG desteği eklemek için ilgili işlevleri yamalayarak bu sorunu giderir.
function getClassNames(elem) {
return (!$.svg.isSVGElem(elem) ? elem.className :
(elem.className ? elem.className.baseVal : elem.getAttribute('class'))) || '';
}
Bir öğe bir SVG unsurudur Bu fonksiyon algılar ve eğer o kullanacağı baseVal
özelliği SVGAnimatedString
varsa geri düşmeden önce, nesnenin class
özniteliği.
jQuery'nin bu konudaki tarihsel duruşu:
jQuery şu anda bu sorunu Düzeltilmeyecek sayfasında listeliyor . İşte ilgili parçalar.
SVG / VML veya Ad Aralığı Öğeleri Hataları
jQuery öncelikle HTML DOM için bir kütüphanedir, bu nedenle SVG / VML belgeleri veya ad boşluklu öğelerle ilgili sorunların çoğu kapsam dışıdır. SVG dışına çıkan olaylar gibi HTML belgelerine "sızan" sorunları çözmeye çalışıyoruz.
Açıkçası jQuery, jQuery çekirdeğinin kapsamı dışında tam SVG desteği olarak kabul edildi ve eklentiler için daha uygun.