jQuery 3 tidak memiliki masalah ini
Salah satu perubahan yang tercantum pada revisi jQuery 3.0 adalah:
tambahkan manipulasi kelas SVG ( # 2199 , 20aaed3 )
Salah satu solusi untuk masalah ini adalah meng-upgrade ke jQuery 3. Ini berfungsi dengan baik:
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>
Masalah:
Alasan fungsi manipulasi kelas jQuery tidak berfungsi dengan elemen SVG adalah karena versi jQuery sebelum 3.0 menggunakan className
properti untuk fungsi-fungsi ini.
cur = elem.nodeType === 1 && ( elem.className ?
( " " + elem.className + " " ).replace( rclass, " " ) :
" "
);
Ini berlaku seperti yang diharapkan untuk elemen HTML, tetapi untuk elemen SVG className
sedikit berbeda. Untuk elemen SVG, className
bukan string, tetapi sebuah instance dari SVGAnimatedString
.
Pertimbangkan kode berikut:
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>
Jika Anda menjalankan kode ini, Anda akan melihat sesuatu seperti yang berikut di konsol pengembang Anda.
test div
SVGAnimatedString { baseVal="test svg", animVal="test svg"}
Jika kita melemparkan SVGAnimatedString
objek itu ke string seperti yang dilakukan jQuery, kita harus melakukannya [object SVGAnimatedString]
, di mana jQuery gagal.
Bagaimana plugin jQuery SVG menangani ini:
Plugin jQuery SVG bekerja di sekitar ini dengan menambal fungsi yang relevan untuk menambahkan dukungan SVG.
function getClassNames(elem) {
return (!$.svg.isSVGElem(elem) ? elem.className :
(elem.className ? elem.className.baseVal : elem.getAttribute('class'))) || '';
}
Fungsi ini akan mendeteksi jika suatu elemen adalah elemen SVG, dan jika itu akan menggunakan baseVal
properti SVGAnimatedString
objek jika tersedia, sebelum jatuh kembali pada class
atribut.
Sikap historis jQuery tentang masalah ini:
jQuery saat ini mencantumkan masalah ini di halaman Won't Fix mereka . Inilah bagian yang relevan.
Bug Elemen SVG / VML atau Namespaced
jQuery terutama merupakan pustaka untuk HTML DOM, jadi sebagian besar masalah yang terkait dengan dokumen SVG / VML atau elemen namespace berada di luar jangkauan. Kami mencoba untuk mengatasi masalah yang "berdarah" ke dokumen HTML, seperti peristiwa yang keluar dari SVG.
Jelas jQuery dianggap sebagai dukungan SVG penuh di luar lingkup inti jQuery, dan lebih cocok untuk plugin.