Saya menggunakan jQuery SVG. Saya tidak bisa menambah atau menghapus kelas ke objek. Adakah yang tahu kesalahan saya?
SVG:
<rect class="jimmy" id="p5" x="200" y="200" width="100" height="100" />
JQuery yang tidak akan menambah kelas:
$(".jimmy").click(function() {
$(this).addClass("clicked");
});
Saya tahu SVG dan jQuery bekerja bersama dengan baik karena saya dapat menargetkan objek dan mengaktifkan peringatan ketika diklik:
$(".jimmy").click(function() {
alert('Handler for .click() called.');
});
javascript
jquery
css
svg
jquery-svg
Don P
sumber
sumber
Jawaban:
Edit 2016: baca dua jawaban berikutnya.
element.classList.add('newclass')
berfungsi di peramban modernJQuery (kurang dari 3) tidak dapat menambahkan kelas ke SVG.
.attr()
bekerja dengan SVG, jadi jika Anda ingin bergantung pada jQuery:Dan jika Anda tidak ingin bergantung pada jQuery:
sumber
.attr("class", "oldclass")
(atau lebih rumit.setAttribute("class", "oldclass")
) benar-benar tidak setara dengan menghapusnewclass
!Ada element.classList di DOM API yang berfungsi untuk elemen HTML dan SVG. Tidak perlu untuk plugin jQuery SVG atau bahkan jQuery.
sumber
jQuery 3 tidak memiliki masalah ini
Salah satu perubahan yang tercantum pada revisi jQuery 3.0 adalah:
Salah satu solusi untuk masalah ini adalah meng-upgrade ke jQuery 3. Ini berfungsi dengan baik:
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.Kutipan dari jQuery
attributes/classes.js
:Ini berlaku seperti yang diharapkan untuk elemen HTML, tetapi untuk elemen SVG
className
sedikit berbeda. Untuk elemen SVG,className
bukan string, tetapi sebuah instance dariSVGAnimatedString
.Pertimbangkan kode berikut:
Jika Anda menjalankan kode ini, Anda akan melihat sesuatu seperti yang berikut di konsol pengembang Anda.
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.
Kutipan dari jQuery SVG
jquery.svgdom.js
:Fungsi ini akan mendeteksi jika suatu elemen adalah elemen SVG, dan jika itu akan menggunakan
baseVal
propertiSVGAnimatedString
objek jika tersedia, sebelum jatuh kembali padaclass
atribut.Sikap historis jQuery tentang masalah ini:
jQuery saat ini mencantumkan masalah ini di halaman Won't Fix mereka . Inilah bagian yang relevan.
Jelas jQuery dianggap sebagai dukungan SVG penuh di luar lingkup inti jQuery, dan lebih cocok untuk plugin.
sumber
Jika Anda memiliki kelas dinamis atau tidak tahu kelas apa yang bisa diterapkan maka metode ini saya percaya adalah pendekatan terbaik:
sumber
Berdasarkan jawaban di atas saya membuat API berikut
sumber
Setelah memuat,
jquery.svg.js
Anda harus memuat file ini:http://keith-wood.name/js/jquery.svgdom.js
.Sumber: http://keith-wood.name/svg.html#dom
Contoh kerja: http://jsfiddle.net/74RbC/99/
sumber
Cukup tambahkan konstruktor prototipe yang hilang ke semua node SVG:
Anda kemudian dapat menggunakannya dengan cara ini tanpa memerlukan jQuery:
Semua kredit diberikan kepada Todd Moto .
sumber
jQuery tidak mendukung kelas elemen SVG. Anda bisa mendapatkan elemen secara langsung
$(el).get(0)
dan menggunakanclassList
danadd / remove
. Ada trik dengan ini juga dalam elemen SVG paling atas sebenarnya adalah objek DOM normal dan dapat digunakan seperti setiap elemen lainnya di jQuery. Dalam proyek saya, saya membuat ini untuk mengurus apa yang saya butuhkan tetapi dokumentasi yang disediakan di Mozilla Developer Network memiliki shim yang dapat digunakan sebagai alternatif.contoh
Alternatif yang lebih sulit adalah menggunakan D3.js sebagai mesin pemilih Anda. Proyek saya memiliki grafik yang dibuat dengan itu sehingga juga dalam lingkup aplikasi saya. D3 dengan benar memodifikasi atribut kelas dari elemen DOM vanilla dan elemen SVG. Meskipun menambahkan D3 untuk kasus ini kemungkinan akan berlebihan.
sumber
jQuery 2.2 mendukung manipulasi kelas SVG
The jQuery 2.2 dan 1.12 Dirilis pasca termasuk kutipan berikut:
Contoh menggunakan jQuery 2.2.0
Ini menguji:
Jika Anda mengklik kotak kecil itu, itu akan berubah warna karena
class
atribut ditambahkan / dihapus.sumber
Berikut ini adalah kode saya yang agak tidak berlaku tetapi berfungsi yang berhubungan dengan masalah-masalah berikut (tanpa ketergantungan):
classList
tidak ada pada<svg>
elemen di IEclassName
tidak mewakiliclass
atribut pada<svg>
elemen di IEgetAttribute()
dansetAttribute()
implementasiIni menggunakan
classList
jika memungkinkan.Kode:
Contoh penggunaan:
sumber
className
properti daripada mencoba mengatur atribut. Alasan "LTE IE7 membutuhkan strAttributeName menjadi" className "saat mengatur, mendapatkan, atau menghapus atribut CLASS" adalah karena browser tersebut memiliki implementasi yang rusakgetAttribute(x)
dansetAttribute(x)
yang hanya mendapatkan atau mengatur properti dengan namax
, sehingga lebih mudah dan lebih kompatibel untuk mengatur properti secara langsung.<svg>
elemen di halaman yang dirancang untuk bekerja di IE 7. Untuk apa nilainya, kode saya tidak berhasil menambahkan atribut kelas ke<svg>
elemen di IE 7 karena elemen tersebut berperilaku seperti elemen kustom lainnya.Saya menggunakan Snap.svg untuk menambahkan kelas ke dan SVG.
http://snapsvg.io/docs/#Element.addClass
sumber
Salah satu solusinya adalah dengan menambahkanClass ke wadah elemen svg:
sumber
Saya menulis ini di proyek saya, dan itu berhasil ... mungkin;)
contoh
sumber
Terinspirasi oleh jawaban di atas, terutama oleh Sagar Gala, saya telah membuat API ini . Anda dapat menggunakannya jika Anda tidak ingin atau tidak dapat meningkatkan versi jquery Anda.
sumber
Atau hanya menggunakan metode DOM sekolah lama ketika JQ memiliki monyet di tengah suatu tempat.
Pelajari orang DOM. Bahkan dalam framework-palooza 2016 sangat membantu. Juga, jika Anda pernah mendengar seseorang membandingkan DOM dengan perakitan, tendang mereka untuk saya.
sumber