jQuery 3 ไม่มีปัญหานี้
การเปลี่ยนแปลงอย่างใดอย่างหนึ่งที่ระบุไว้ในการแก้ไข jQuery 3.0คือ:
เพิ่มการจัดการคลาส SVG ( # 2199 , 20aaed3 )
ทางออกหนึ่งสำหรับปัญหานี้คือการอัพเกรดเป็น 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 นั้นเป็นเพราะรุ่น jQuery ก่อนหน้า 3.0 ใช้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
ข้อความที่ตัดตอนมาจาก jQuery SVG jquery.svgdom.js
:
function getClassNames(elem) {
return (!$.svg.isSVGElem(elem) ? elem.className :
(elem.className ? elem.className.baseVal : elem.getAttribute('class'))) || '';
}
ฟังก์ชั่นนี้จะตรวจสอบว่าองค์ประกอบเป็นองค์ประกอบ SVG หรือไม่และหากเป็นองค์ประกอบนั้นจะใช้baseVal
คุณสมบัติของSVGAnimatedString
วัตถุหากมีอยู่ก่อนที่จะถอยกลับบนclass
แอตทริบิวต์
จุดยืนทางประวัติศาสตร์ของ jQuery เกี่ยวกับปัญหา:
ขณะนี้ jQuery แสดงรายการปัญหานี้ในหน้าไม่แก้ไข นี่คือส่วนที่เกี่ยวข้อง
ข้อบกพร่องขององค์ประกอบ SVG / VML หรือ Namespaced
jQuery เป็นห้องสมุดหลักสำหรับ HTML DOM ดังนั้นปัญหาส่วนใหญ่ที่เกี่ยวข้องกับเอกสาร SVG / VML หรืออิลิเมนต์ที่กำหนดเนมสเปซอยู่นอกขอบเขต เราพยายามที่จะแก้ไขปัญหาที่ "ตกเลือด" กับเอกสาร HTML เช่นเหตุการณ์ที่เกิดขึ้นจาก SVG
เห็นได้ชัดว่า jQuery พิจารณาการสนับสนุน SVG เต็มรูปแบบนอกขอบเขตของแกน jQuery และเหมาะสำหรับปลั๊กอิน