jQuery 3 में यह समस्या नहीं है
JQuery 3.0 संशोधन में सूचीबद्ध परिवर्तनों में से एक है:
SVG वर्ग जोड़-तोड़ जोड़ें ( # 2199 , 20aa3 )
इस समस्या का एक समाधान 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 वर्ग मैनिपुलेशन फ़ंक्शंस एसवीजी तत्वों के साथ काम नहीं करने का कारण है क्योंकि 3.0 से पहले के jQuery संस्करण classNameइन कार्यों के लिए संपत्ति का उपयोग करते हैं।
cur = elem.nodeType === 1 && ( elem.className ?
( " " + elem.className + " " ).replace( rclass, " " ) :
" "
);
यह HTML तत्वों के लिए अपेक्षित व्यवहार करता है, लेकिन SVG तत्वों के classNameलिए थोड़ा अलग है। एसवीजी तत्व के लिए, 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 प्लगइन एसवीजी समर्थन जोड़ने के लिए संबंधित कार्यों को पैच करके इसके चारों ओर काम करता है।
function getClassNames(elem) {
return (!$.svg.isSVGElem(elem) ? elem.className :
(elem.className ? elem.className.baseVal : elem.getAttribute('class'))) || '';
}
यह फ़ंक्शन पता लगाएगा कि क्या कोई तत्व एसवीजी तत्व है, और यदि यह है तो यह baseValगुण के गुण का उपयोग करेगा SVGAnimatedStringयदि उपलब्ध है, classविशेषता पर वापस गिरने से पहले ।
इस मुद्दे पर jQuery का ऐतिहासिक रुख:
jQuery वर्तमान में इस समस्या को उनके W Fix Fix पेज पर सूचीबद्ध करता है । यहाँ प्रासंगिक भागों है।
एसवीजी / वीएमएल या नामांकित तत्व कीड़े
jQuery मुख्य रूप से HTML DOM के लिए एक लाइब्रेरी है, इसलिए SVG / VML दस्तावेज़ या नामांकित तत्वों से संबंधित अधिकांश समस्याएं गुंजाइश से बाहर हैं। हम उन समस्याओं को संबोधित करने की कोशिश करते हैं जो HTML दस्तावेजों में "ब्लीड" के माध्यम से होती हैं, जैसे कि एसवीजी से बाहर होने वाली घटनाएं।
जाहिर तौर पर jQuery को jQuery कोर के दायरे से बाहर पूर्ण SVG समर्थन माना जाता है, और प्लगइन्स के लिए बेहतर अनुकूल है।