2011-01-07 12 views
9

क्या किसी को Raphael.js एसवीजी लाइब्रेरी के साथ कोई अनुभव है?मैं jQuery का उपयोग कर Raphael.js ऑब्जेक्ट्स में सीएसएस शैलियों को कैसे लागू करूं?

मैं एक एसवीजी मानचित्र (स्मार्टफोन पर उपयोग के लिए) बनाने के लिए Raphael.js का उपयोग कर रहा हूं, लेकिन मुझे नक्शा ऑब्जेक्ट्स खोलने में परेशानी हो रही है कि राफेल jQuery द्वारा बाहरी बातचीत के लिए बनाता है और सीएसएस द्वारा स्टाइलिंग करता है।

var R = Array(); 
    R[1] = new Raphael("level1", 408, 286); 
    R[2] = new Raphael("level2", 408, 286); 
    R[3] = new Raphael("level3", 408, 286); 
    R[4] = new Raphael("level4", 408, 286); 
    R[5] = new Raphael("level5", 408, 286); 

var attr = { 
    fill: "#ccc", 
    stroke: "#000", 
    "stroke-width": 0.5, 
    "stroke-linecap": "square", 
    "stroke-linejoin": "miter" 
}; 

// loop through a bunch of objects (not shown for brevity) 
    // in the end, I end up with a couple hundred objects drawn by Raphael 

    var o = R[fID].path(coordstring).attr(attr); 

    // creates an #o[ID] id value that jQuery can target 
    o.node.id = "o"+$(this).attr('id'); // id value comes from data source 

    o.click(function(){ 
     highlightMapObject(this.node.id.substr(1));        
    ); 

// end loop 

// accessed from the o.click and from outside in jQuery 
function highlightMapObject(oid){ 
    var $target = $("#o"+oid); 
    $target.addClass('highlight'); 
} 

मुद्दा मुझे लगता है कि राफेल वस्तु के लिए एक वर्ग जोड़ने की कोशिश कर काम नहीं करता है, या यह काम कर रहा है, तो है, उस वर्ग के सीएसएस गुण (बदला हुआ पृष्ठभूमि रंग की तरह, आदि में चल रहे हो रहे हैं) लागू नहीं किया जा रहा है।

तो अगर मेरे .highlight वर्ग है:

.highlight { background-color: #f00; } 

है कि लागू नहीं हो रही है या तो, या मूल राफेल attrs से fill:"ccc" अधिलेखित नहीं है। मेरा अनुमान है कि क्योंकि jQuery द्वारा लक्षित आईडी को वस्तु के बजाए राफेल ऑब्जेक्ट NODE पर है, जो शायद समस्या का हिस्सा है।

मैंने राफेल से निपटने के दौरान पूरी तरह से नोड से बचने के लिए बहुत सी सलाह देखी है, लेकिन ऐसा लगता है कि मैंने राफेल ऑब्जेक्ट को बाहरी लक्ष्यीकरण (इस मामले में jQuery के माध्यम से) खोलने का एकमात्र तरीका प्रतीत किया है।

मैं इन वस्तुओं पर शैली परिवर्तन को प्राप्त करने के सीएसएस का उपयोग करने की जरूरत नहीं है, लेकिन मुझे लगता है कि परिवर्तन बाहर से प्राप्त करने के लिए सक्षम होना चाहिए है - के बजाय (jQuery के माध्यम से, बाहरी प्रकाश डाला अनुरोध के जवाब में आदि) सभी आंतरिक (राफेल के माध्यम से और केवल ऑब्जेक्ट क्लिक के जवाब में)

विचार?

धन्यवाद!

+2

मुझे राफेल लाइब्रेरी पसंद है। मैं विशेष रूप से प्रभावित था कि यह jQuery के साथ एकीकृत कैसे हो सकता है। –

उत्तर

10

मैं बिल्कुल यकीन है कि आप क्या कोड क्या कर रहा है नहीं कर रहा हूँ, लेकिन आप एक राफेल वस्तु के बाहर एक jQuery वस्तु प्राप्त करना चाहते हैं तो ऐसा करते हैं:

var $jQueryObject = $(raphaelObject.node); 

वहां से आप एक वर्ग को जोड़ने के लिए jQuery का उपयोग कर सकते :

$jQueryObject.addClass('highlight'); 
+0

धन्यवाद कि बहुत अच्छा काम किया (सीएसएस सेट करना, लेकिन कक्षा को नहीं जोड़ना)। मैं मदद की सराहना करता हूं। –

+0

और हाँ, मुझे बिल्कुल यकीन नहीं है कि मेरा कोड क्या कर रहा है :) –

+0

अच्छी तरह से 'attr' राफेल विशेषताओं का नक्शा सीएसएस गुण नहीं है और इसे [attr] (http: // raphaeljs का उपयोग करके राफेल ऑब्जेक्ट पर लागू किया जाना चाहिए) .com/reference.html # attr)। एक बार आपके पास एक jQuery ऑब्जेक्ट [addClass] हो (http: // api।jquery.com/addClass/) निश्चित रूप से काम करना चाहिए। –

5

मैंने यह भी पाया है, तो आप राफेल के साथ पथ प्रतिपादन के बाद इनलाइन शैलियों निकाल दिए हैं।

$('#somediv path').removeAttr('fill').removeAttr('stroke'); 

तो आप उन्हें शैली दे सकते हैं कि कैसे कभी आप सीएसएस

#somediv path { fill: white; } 
#somediv:hover path { fill: blue; } 
+0

अद्यतन के लिए धन्यवाद - यह सहायक है। –

3

का उपयोग कर चाहते हैं या आप एक विशेषता के रूप में एक वर्ग को जोड़ने के

$jQueryObject.attr('class', 'highlight'); 

यह बजाय काम करेंगे

$jQueryObject.addClass('highlight'); 
संबंधित मुद्दे