2012-08-07 9 views
5

यह javascript cloneNode and properties से संबंधित प्रश्न से संबंधित है।क्लोन नोड कस्टम गुणों को क्यों बहिष्कृत करता है?

मैं वही व्यवहार देख रहा हूं। Node.cloneNode किसी भी गुण मैं अपने आप को (मूल पोस्ट से कोड) जोड़ देते हैं पर कॉपी नहीं करता है:

var theSource = document.getElementById("someDiv") 
    theSource.dictator = "stalin"; 

    var theClone = theSource.cloneNode(true); 
    alert(theClone.dictator); 

theClone किसी भी संपत्ति "तानाशाह" शामिल नहीं है।

मुझे ऐसा क्यों लगता है कि इस मामले में कोई स्पष्टीकरण नहीं मिला है। documentation on MDN बताता है कि cloneNode "इसकी सभी विशेषताओं और उनके मूल्यों की प्रतिलिपि बनाता है", एक पंक्ति जो सीधे DOM specification से ली जाती है।

ऐसा लगता है कि यह मेरे लिए टूटा हुआ है क्योंकि यह कस्टम गुणों वाले एक डोम पेड़ की गहरी प्रतिलिपि करना असंभव है।

क्या मुझे यहां कुछ याद आ रही है?

+0

मैं शायद क्लोन नोड का उपयोग करने से बचूंगा, और अगर मैं कुछ क्लोन करना चाहता हूं, तो मैं तत्व को क्लोन करने के लिए अपने स्वयं के क्लोनिंग फ़ंक्शन को लागू करूंगा (उदाहरण के लिए, आप कन्स्ट्रक्टर का उपयोग करके एक नया बना सकते हैं, फिर अपने विशिष्ट मामले के आधार पर कॉपी गुण, कॉपी गुण, और संभवतः अन्य कस्टम सामान)। – trusktr

उत्तर

7

एक संपत्ति किसी विशेषता के बराबर नहीं है।

इसके बजाय setAttribute() और getAttribute() का उपयोग करें।

var theSource = document.getElementById("someDiv") 
theSource.setAttribute('dictator','stalin'); 

var theClone = theSource.cloneNode(true); 
alert(theClone.getAttribute('dictator')); 
2

इसका परीक्षण किया गया। cloneNode क्लोन में कस्टम विशेषता शामिल है, लेकिन उस विशेषता को सीधे पुनर्प्राप्त नहीं किया जा सकता है। प्रयास करें:

var theSource = document.getElementById("someDiv") 
theSource.dictator = "stalin"; 
//or better/more cross browser compatible 
theSource.setAttribute('dictator','stalin'); 

var theClone = theSource.cloneNode(true); 
alert(theClone.getAttribute('dictator')); //so, use getAttribute 

यह क्लोनिंग expando properties साथ एक ब्राउज़र समस्या हो सकती है। मैंने testcase (बाद में देखें) इस पुराने bugzilla report से भाग लिया। यह क्रोम और फ़ायरफ़ॉक्स (दोनों नवीनतम संस्करणों) में काम नहीं करता है।

//code from testcase @ bugzilla 
var a = document.createElement("div");  
a.order = 50;  
alert(a.order);  
b = a.cloneNode(true);  
alert(b.order);  
+0

यह शून्य –

+0

देता है तो मुझे लगता है कि यह ब्राउज़र निर्भर हो सकता है? क्रोम (नवीनतम) में यह काम करता है। – KooiInc

+0

आपको पहले 'createAttribute' का उपयोग करके पहले विशेषता बनाना होगा। https://developer.mozilla.org/en-US/docs/DOM/document.createAttribute। – marteljn

3

प्रत्येक संपत्ति एक विशेषता के अनुरूप नहीं है। किसी तत्व में एक कस्टम प्रॉपर्टी जोड़ना कोई विशेषता नहीं जोड़ता है, तो जब आप ऐसा करते हैं तो DOM spec द्वारा कवर नहीं किया जाता है।

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

+0

यदि आप रैपर का उपयोग करते हैं, तो आप उस डेटा को कॉपी करना चाहते हैं, तो आपको उन रैपर को क्लोन करने के लिए अपनी खुद की विधि बनाना होगा। मुझे लगता है कि 'क्लोन नोड' को सिर्फ बहिष्कृत किया जाना चाहिए, क्योंकि वहां बहुत सारे उपयोग के मामले हैं जहां यह पूरी तरह विफल हो जाएगा। – trusktr

संबंधित मुद्दे