2012-12-30 6 views
11

मैं जावास्क्रिप्ट में नामों की एक सूची प्रबंधित कर रहा हूं। जब आप एक बॉक्स चेक करते हैं, तो आपका नाम सूची में दिखाई देता है। जब आप इसे अनचेक करते हैं, तो यह पार हो जाता है। और जब आप अनिश्चित स्थिति में बॉक्स सेट करते हैं, तो आपका नाम हटा दिया जाता है।क्लोन नोड मूल नोड के बराबर नहीं है (isEqualNode के साथ)

मुझे एक छिपे हुए div में वर्तमान में लॉग इन उपयोगकर्ता का नाम मिला है। नाम शैली विशेषताओं के साथ एक अवधि है।

मैं जांचता हूं कि नाम पहले से ही isqualNode के साथ सूची में है या नहीं। पृष्ठ लोड होने पर सूची में होने पर, यह ठीक काम करता है: नाम पाया जाता है और बॉक्स अपडेट किए जाने पर बॉक्स अपडेट होने पर अपडेट किया जाता है।

for(var i=0 ; i < bullet.childNodes.length ; i++) { 
    var node = bullet.childNodes[i]; 
    if(node.className == 'crossed') 
     node = node.firstChild; 
    if(node.isEqualNode(document.getElementById('curUser').firstChild)) 
     break; 
} 
// if i < bullet.childNodes.length, then we found the user's name in the list 

जब नाम सूची में नहीं है, तो मैं अवधि को क्लोन करता हूं।

var newName = document.getElementById('curUser').firstChild.cloneNode(true); 
bullet.appendChild(newName); 

यह काम करता है, दृष्टि से।

लेकिन मैं कुछ मुश्किल पर ठोकर खाई: newName.isEqualNode(document.getElementById('curUser').firstChild) झूठी है! तो यदि बॉक्स राज्य फिर से बदल जाता है, तो नया जोड़ा नाम नहीं मिलेगा और फिर एक नया बनाया जाएगा।

यहाँ काल लग रहा है की तरह है:,

<span style="font-weight: bold ; color: #003380 ;">Pikrass</span> 

क्षण के लिए मैं सिर्फ जांच में कम सख्त बनाती हूँ (मैं सिर्फ बजाय isEqualNode पर भरोसा करने की अवधि के अंदर का पाठ डेटा की जांच कर सकते हैं), लेकिन IqualNode के अनुसार, मुझे दिलचस्पी है कि एक क्लोन नोड मूल से अलग क्यों हो सकता है।

प्रासंगिक चश्मा: cloneNode, isEqualNode


संपादित : मैं फ़ायरफ़ॉक्स और क्रोमियम के साथ परीक्षण किया गया। फ़ायरफ़ॉक्स के साथ EqualNode झूठा रिटर्न देता है, लेकिन क्रोमियम के साथ यह सच हो जाता है। इस बात को इंगित करने के लिए धन्यवाद फेलिक्स।

+1

कौन सा ब्राउज़र? ऐसा लगता है कि क्रोम में काम करता है: http://jsfiddle.net/WhxQP/। –

+0

दिलचस्प सवाल। यहां एक सरल उदाहरण दिया गया है: http://jsfiddle.net/QtJJb/ –

+0

यह पहेली फ़ायरफ़ॉक्स 17.x में काम नहीं कर रही है। –

उत्तर

0

कभी भी बेहतर देर से नहीं।:)

मैं अब फ़ायरफ़ॉक्स 17 के साथ इस मुद्दे को पुन: पेश नहीं कर सकता, इसलिए टिप्पणियों में चर्चा की गई यह शायद गेको में एक बग था, जिसे तब तय किया गया है।

हालांकि मुझे कोई भी बग रिपोर्ट नहीं मिली। मैं इस उत्तर को अभी स्वीकार करने के रूप में ध्वजांकित करता हूं, लेकिन अगर कोई बग रिपोर्ट या हुड के नीचे क्या चल रहा था उसका स्पष्टीकरण प्राप्त कर सकता है तो मैं इसके बजाय स्वीकार करूंगा।

बर्गी की टिप्पणियां दो अन्य उत्तरों के लिए सही हैं।

4

बस इसे समझ लिया। specification के अनुसार, isEqualNode केवल तभी सत्य होता है जब दोनों तत्वों के बराबर मात्रा में गुण होते हैं। लेकिन अगर स्रोत तत्व में एक आईडी है, तो इसकी प्रतिलिपि बनाई गई नहीं है क्योंकि आईडी शोर अद्वितीय हैं, इसलिए इसमें कम विशेषताएं हैं। आईडी के बजाय कक्षा के साथ यह ठीक काम करता है।

मार्कअप:

<div id="withId">withId content</div> 
<div class="withoutId">withoutId content</div> 

जे एस:

function test(node) { 
    var copy = node.clone(true); 
    document.body.appendChild(copy); 
    console.log('are equal: ' + copy.isEqualNode(node) 
     + ', attributes lengths: ' + node.attributes.length + ' ' + copy.attributes.length 
     + ', ids: ' + node.getAttribute('id') + ' ' + copy.getAttribute('id')); 
} 

test(document.getElementById('withId')); 
// are equal: false, attributes lengths: 1 0, ids: withId null 

test(document.getElementsByClassName('withoutId')[0]); 
// are equal: true, attributes lengths: 1 1, ids: null null 

http://jsfiddle.net/igorz/fxtDw/

+2

आईड्स की प्रतिलिपि क्यों नहीं की जानी चाहिए? डब्ल्यू 3 स्पेक ऐसा नहीं कहता है, और यहां तक ​​कि [मोज़िला का संदर्भ] (https://developer.mozilla.org/en-US/docs/DOM/Node.cloneNode) स्पष्ट रूप से बताता है "*' क्लोन नोड() 'डुप्लिकेट का कारण बन सकता है दस्तावेज़ में तत्व आईडी * "। – Bergi

2

यह यहाँ Mozilla's reference लिखा है (धन्यवाद @Bergi)

डुप्लिकेट नोड cloneNode (द्वारा लौटाए गए) प्राप्त करता है एक नया अनन्य आईडी जब इसे किसी अन्य नोड

जैसा कि आप संलग्न कर रहे हैं, तो आईडी शायद इस पल में बदल दी गई है।

+0

मुझे लगता है कि केवल आंतरिक 'अद्वितीय आईडी' (जैसा कि [यहां] (https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/NsIAccessNode#Attributes) को संदर्भित करता है), जिसे ' isEqualNode' – Bergi

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