स्वीकार किए जाते हैं जवाब से पता चलता है भी तरह से जटिल। जैसा कि फॉरेस्टो अपने जवाब में दावा करता है , " यह उन्हें डोम एक्सप्लोरर में जोड़ने के लिए लगता है, लेकिन स्क्रीन पर नहीं " और इसका कारण एचटीएमएल और एसवीजी के लिए अलग-अलग नामस्थान हैं।
सबसे आसान समाधान पूरे svg को "ताज़ा" करना है। सर्कल (या अन्य तत्वों) को जोड़ने के बाद, इसका उपयोग करें:
$("body").html($("body").html());
यह ट्रिक करता है। स्क्रीन पर सर्कल है।
या यदि आप चाहते हैं, एक कंटेनर div का उपयोग करें:
$("#cont").html($("#cont").html());
और कंटेनर के अंदर अपना svg लपेटें:
<div id="cont">
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 100" width="200px" height="100px">
</svg>
</div>
कार्यात्मक उदाहरण:
http://jsbin.com/ejifab/1/edit
इस तकनीक के फायदे:
- आप मौजूदा svg को संपादित कर सकते हैं (जो पहले से ही DOM में है), उदा। बिना स्क्रिप्टिंग के राफेल या अपने उदाहरण "हार्ड कोडेड" का उपयोग करके बनाया गया।
- आप तार जैसे जटिल तत्व संरचनाओं को जोड़ सकते हैं।
$('svg').prepend('<defs><marker></marker><mask></mask></defs>');
जैसे आप jQuery में करते हैं।
- तत्वों को जोड़ने और स्क्रीन पर दिखाई देने के बाद
$("#cont").html($("#cont").html());
उनकी विशेषताओं का उपयोग करके उन्हें jQuery का उपयोग करके संपादित किया जा सकता है।
संपादित करें:
उपरोक्त तकनीक केवल "हार्ड कोडित" या DOM मैनिप्युलेटेड (= document.createElementNS आदि) SVG के साथ काम करती है। यदि राफेल का उपयोग तत्वों को बनाने के लिए किया जाता है, (मेरे परीक्षणों के अनुसार) राफेल ऑब्जेक्ट्स और SVG DOM के बीच लिंकिंग $("#cont").html($("#cont").html());
का उपयोग किया जाता है तो टूट जाता है। इसके लिए वर्कअराउंड बिल्कुल भी उपयोग नहीं करना है $("#cont").html($("#cont").html());
और इसके बजाय डमी एसवीजी दस्तावेज़ का उपयोग करना है।
यह डमी एसवीजी पहले एसवीजी दस्तावेज का एक पाठात्मक प्रतिनिधित्व है और इसमें केवल ऐसे तत्व शामिल हैं जिनकी आवश्यकता है। अगर हम उदाहरण के लिए चाहते हैं। राफेल दस्तावेज़ में एक फिल्टर तत्व जोड़ने के लिए, डमी कुछ ऐसा हो सकता है <svg id="dummy" style="display:none"><defs><filter><!-- Filter definitons --></filter></defs></svg>
। शाब्दिक प्रतिनिधित्व को पहले jQuery के $ ("बॉडी") का उपयोग करके डोम में परिवर्तित किया जाता है। और जब (फ़िल्टर) तत्व DOM में होता है, तो इसे मानक jQuery विधियों का उपयोग करके क्वेरी किया जा सकता है और मुख्य SVG दस्तावेज़ में जोड़ा जाता है जो राफेल द्वारा बनाया जाता है।
इस डमी की आवश्यकता क्यों है? राफेल निर्मित दस्तावेज़ के लिए कड़ाई से एक फिल्टर तत्व क्यों नहीं जोड़ा जाता है? यदि आप इसे प्रयोग करके देखें। $("svg").append("<circle ... />")
, यह html तत्व के रूप में बनाया गया है और स्क्रीन पर कुछ भी नहीं है जैसा कि उत्तर में वर्णित है। लेकिन अगर पूरे एसवीजी दस्तावेज़ को जोड़ा जाता है, तो ब्राउज़र स्वचालित रूप से एसवीजी दस्तावेज़ में सभी तत्वों के नामस्थान रूपांतरण को संभालता है।
एक उदाहरण तकनीक को प्रबुद्ध करता है:
// Add Raphael SVG document to container element
var p = Raphael("cont", 200, 200);
// Add id for easy access
$(p.canvas).attr("id","p");
// Textual representation of element(s) to be added
var f = '<filter id="myfilter"><!-- filter definitions --></filter>';
// Create dummy svg with filter definition
$("body").append('<svg id="dummy" style="display:none"><defs>' + f + '</defs></svg>');
// Append filter definition to Raphael created svg
$("#p defs").append($("#dummy filter"));
// Remove dummy
$("#dummy").remove();
// Now we can create Raphael objects and add filters to them:
var r = p.rect(10,10,100,100);
$(r.node).attr("filter","url(#myfilter)");
इस तकनीक का फुल वर्किंग डेमो यहाँ है: http://jsbin.com/ilinan/1/edit ।
(मेरे पास (अभी तक) कोई विचार नहीं है, $("#cont").html($("#cont").html());
राफेल का उपयोग करते समय काम क्यों नहीं होता है। यह बहुत ही छोटा हैक होगा।)
RMB
>edit as html
HTML टैग और हिट पर दर्ज सब कुछ प्रदर्शित करता है (लेकिन सभी घटना श्रोताओं गायब हो)। इस जवाब को पढ़ने के बाद मैंने अपनी createElement कॉल्स को createElementNS में बदल दिया और अब सब कुछ काम करता है!