jQuery 3にはこの問題はありません
jQuery 3.0リビジョンにリストされている変更の1つは次のとおりです。
SVGクラス操作追加(#2199を、20aaed3)
この問題の1つの解決策は、jQuery 3にアップグレードすることです。
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>
問題:
jQueryクラス操作関数がSVG要素で機能しないのは、3.0より前のバージョンのjQuery className
がこれらの関数のプロパティを使用するためです。
cur = elem.nodeType === 1 && ( elem.className ?
( " " + elem.className + " " ).replace( rclass, " " ) :
" "
);
これはHTML要素の場合は期待どおりに動作しますが、SVG要素の場合className
は少し異なります。SVG要素の場合、className
は文字列ではなく、のインスタンスですSVGAnimatedString
。
次のコードを検討してください。
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>
このコードを実行すると、開発者コンソールに次のようなものが表示されます。
test div
SVGAnimatedString { baseVal="test svg", animVal="test svg"}
SVGAnimatedString
jQueryのようにそのオブジェクトを文字列にキャストする[object SVGAnimatedString]
と、jQueryが失敗する場所がになります。
jQuery SVGプラグインがこれを処理する方法:
jQuery SVGプラグインは、関連する関数にパッチを適用してSVGサポートを追加することにより、この問題を回避します。
function getClassNames(elem) {
return (!$.svg.isSVGElem(elem) ? elem.className :
(elem.className ? elem.className.baseVal : elem.getAttribute('class'))) || '';
}
この関数は、要素がSVG要素であるかどうかを検出し、そうである場合は、属性にフォールバックする前baseVal
に、SVGAnimatedString
オブジェクトのプロパティを使用します(使用可能な場合)class
。
この問題に対するjQueryの歴史的スタンス:
jQueryは現在、この問題をWo n't Fixページにリストしています。こちらが関連パーツです。
SVG / VMLまたは名前空間要素のバグ
jQueryは主にHTML DOMのライブラリであるため、SVG / VMLドキュメントまたは名前空間要素に関連するほとんどの問題は範囲外です。私たちは、SVGからバブルするイベントなど、HTMLドキュメントに「染み出る」問題に対処しようとします。
明らかに、jQueryは、jQueryコアの範囲外の完全なSVGサポートを検討しており、プラグインにより適しています。