В API Internet Explorer 9 DOM есть функция document.importNode (). Тем не менее, IE9 выдает ошибку сценария, когда он называется
SCRIPT16386: такой интерфейс не поддерживается
Также необходимо определить пространство имен исходного узла (например, когда мы хотим импортировать SVG - * В IE9 импортированные узлы, похоже, не распознаются как элементы SVG )
Phrogz предложил этот полезный обходной путь. Однако, когда мы импортируем элемент со специальным пространством имен (объявленным в атрибуте xmlns, например, <svg xmlns="http://www.w3.org/2000/svg" …>…</svg>
), будет ошибка в clone.setAttributeNS(a.namespaceURI,a.nodeName,a.nodeValue)
, поскольку namespaceURI для атрибута xmlns имеет значение null.
Есть обходной путь, который мне подходит:
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;
}
}