2009-11-28 12 views
5

मैं वेब arround देख किया गया है, और मैं काफी यकीन है कि मैं पहले से ही इस सवाल का जवाब ("नहीं") पता हूँ, लेकिन मैं जाँच करना चाहते हैं:आईई समर्थन

आईई समर्थन importNode करता है() अभी तक? क्या डोम चलने और नोड्स बनाने से बेहतर विकल्प है? (मैं the clasic article by Anthony Holdener लेकिन इसके एक साल से ज्यादा पुराने देखा है अब, और मैं आशा करती हूं कि या तो आईई विकसित किया गया है, या किसी को एक और workarround है)

धन्यवाद।

+0

यहाँ एक [एक कार्यान्वयन से संबंधित प्रश्न] है (http://stackoverflow.com/a/6075604/405017)। – Phrogz

उत्तर

4

मैं नहीं सुना है यह अभी तक बदल गया है, और जॉन Resig द्वारा एक recent post में, वह कहता है:

इंटरनेट एक्सप्लोरर importNode का समर्थन नहीं करता या adoptNode

इसके अलावा इस एक को देखने के cross-browser importnode() पर अतिरिक्त लेख सूचीबद्ध करें क्योंकि इसमें इंटरनेट एक्सप्लोरर के लिए एक विशिष्ट कार्य-कार्य शामिल है।

भावी पीढ़ी के लिए बोली के लिए,

मेरी समस्याओं के सभी का हल सब के बाद एक डोम विधि का उपयोग नहीं करने के लिए, और बदले अपने ही कार्यान्वयन का उपयोग किया गया था। इधर, इसकी महिमा के सभी में, एक क्रॉस-ब्राउज़र शिकायत तरह से कोडित importNode() समस्या के लिए अपने अंतिम समाधान है: (लाइन wraps »एड चिह्नित।)

if (!document.ELEMENT_NODE) { 
    document.ELEMENT_NODE = 1; 
    document.ATTRIBUTE_NODE = 2; 
    document.TEXT_NODE = 3; 
    document.CDATA_SECTION_NODE = 4; 
    document.ENTITY_REFERENCE_NODE = 5; 
    document.ENTITY_NODE = 6; 
    document.PROCESSING_INSTRUCTION_NODE = 7; 
    document.COMMENT_NODE = 8; 
    document.DOCUMENT_NODE = 9; 
    document.DOCUMENT_TYPE_NODE = 10; 
    document.DOCUMENT_FRAGMENT_NODE = 11; 
    document.NOTATION_NODE = 12; 
} 

document._importNode = function(node, allChildren) { 
    switch (node.nodeType) { 
    case document.ELEMENT_NODE: 
     var newNode = document.createElement(node » 
.nodeName); 
     /* does the node have any attributes to add? */ 
     if (node.attributes && node.attributes » 
.length > 0) 
     for (var i = 0; il = node.attributes.length;i < il) 
      newNode.setAttribute(node.attributes[i].nodeName, 
      node.getAttribute(node.attributes[i++].nodeName)); 
     /* are we going after children too, and does the node have any? */ 
     if (allChildren && node.childNodes && node.childNodes.length > 0) 
     for (var i = 0; il = node.childNodes.length; i < il) 
      newNode.appendChild(document._importNode(node.childNodes[i++], allChildren)); 
     return newNode; 
     break; 
    case document.TEXT_NODE: 
    case document.CDATA_SECTION_NODE: 
    case document.COMMENT_NODE: 
     return document.createTextNode(node.nodeValue); 
     break; 
    } 
}; 

यहाँ है उपयोग में:

var newNode = null, importedNode = null; 

newNode = xhrResponse.responseXML.getElementsByTagName('title')[0].childNodes[0]; 
if (newNode.nodeType != document.ELEMENT_NODE) 
    newNode = newNode.nextSibling; 
if (newNode) { 
    importedNode = document._importNode(newNode, true); 
    document.getElementById('divTitleContainer').appendChild(importedNode); 
    if (!document.importNode) 
    document.getElementById('divTitleContainer').innerHTML = document.getElementById('divTitleContainer').innerHTML; 
} 
+1

यह एक अच्छा सामान्य दृष्टिकोण है, लेकिन आप 'COMMENT_NODE' के जवाब में 'document.createComment'' करना चाहते हैं; इसे एक पाठ नोड में बदलना शायद एक अच्छा विचार नहीं है।आईई में एचटीएमएल तत्वों पर 'getAttribute'/'setAttribute' का उपयोग करने में कई समस्याएं हैं, दुर्भाग्यवश; यदि आप क्लोनिंग कर रहे हैं तो 'नाम' एक समस्या हो सकती है, और 'ऑनएक्स' विशेषताओं और इनलाइन 'स्टाइल' उपयोगी तरीके से काम नहीं कर रहे हैं (सर्वश्रेष्ठ से बचें)। किसी भी माता-पिता नोड में संलग्न होने पर भी '

-1

एक हल्का वजन समाधान के लिए (बशर्ते आप निर्भरता को जोड़ने कोई आपत्ति नहीं है), तो आप हमेशा jQuery इस्तेमाल कर सकते हैं:

$(dom_to_import_into).find('element-to-import-into').append($(dom_to_import).clone()); 

यह 'element-to-import-into' के अंत में dom_to_import जोड़ देगा।

+0

अच्छी टिप! धन्यवाद –

+0

आईई में काम नहीं कर सकता। निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। मुझे संदेह है कि मूल पोस्टर importNode का उपयोग कर रहा है क्योंकि वह बाहरी दस्तावेज़ (जैसे iframe या window.open) से प्रतिलिपि बना रहा है। इस प्रकार, jQuery के एपेंड() का उपयोग करना अभी भी आईई पर असफल हो जाएगा। HierarchyRequestError। – joedotnot

5

इंटरनेट एक्सप्लोरर 9 डीओएम एपीआई में एक फंक्शन दस्तावेज़.importNode() है। हालांकि, IE9 एक स्क्रिप्ट त्रुटि जब यह

SCRIPT16386 कहा जाता है फेंकता है: ऐसी कोई इंटरफ़ेस समर्थित

इसके अलावा वहाँ स्रोत नोड का नाम स्थान परिभाषित करने की जरूरत है (जैसे, जब हम एसवीजी आयात करना चाहते हैं - In IE9, Imported nodes do not seem to be recognized as SVG Elements)

सुझाए गए this उपयोगी कामकाज। हालांकि, जब हम तत्व आयात करते हैं जिसमें विशेष नामस्थान (xmlns विशेषता में घोषित किया गया है, उदाहरण के लिए <svg xmlns="http://www.w3.org/2000/svg" …>…</svg>) clone.setAttributeNS(a.namespaceURI,a.nodeName,a.nodeValue) में त्रुटि होगी क्योंकि विशेषता xmlns के लिए नेमस्पेसुरि शून्य है।

वैकल्पिक हल जो मेरे लिए काम नहीं है:

var newNode; 
try { 
    newNode = document.importNode(sourceDocumentElement, true); 
} 
catch(e) { 
    newNode = importNode(sourceDocumentElement, true); 
} 

function importNode(node, allChildren) { 
    switch (node.nodeType) { 
    case document.ELEMENT_NODE: 
     var newNode = document.createElementNS(node.namespaceURI, node.nodeName); 
     if(node.attributes && node.attributes.length > 0) 
     for(var i = 0, il = node.attributes.length; i < il; i++) 
      newNode.setAttribute(node.attributes[i].nodeName, node.getAttribute(node.attributes[i].nodeName)); 
     if(allChildren && node.childNodes && node.childNodes.length > 0) 
     for(var i = 0, il = node.childNodes.length; i < il; i++) 
      newNode.appendChild(importNode(node.childNodes[i], allChildren)); 
     return newNode; 
     break; 
    case document.TEXT_NODE: 
    case document.CDATA_SECTION_NODE: 
    case document.COMMENT_NODE: 
     return document.createTextNode(node.nodeValue); 
     break; 
    } 
} 
+0

यह मेरे लिए बहुत अच्छा काम करता है, लेकिन मुझे एक समस्या है जहां तत्व टूटी हुई छवियों (IE9 में) के रूप में दिखाई दे रहे हैं। कोई विचार क्यों ऐसा होगा? मैंने सत्यापित किया है कि छवि यूआरएल वैध हैं, इसलिए निश्चित रूप से समस्या नहीं है। धन्यवाद! – lakenen

+0

यदि कोई दिलचस्पी लेता है, तो मैंने [समस्या हल की] [http://stackoverflow.com/questions/14593520/ie9-importing-inline-svg-image-elements-broken)। – lakenen

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