2014-12-08 3 views
1

documentElement не имеет детей

var element = new DOMParser().parseFromString('<foo><bar></bar></foo>', 'application/xml').documentElement; 
 
var children = element.children; 
 
document.write('' + element); 
 
document.write('' + children);

В Chrome и Firefox, я вижу "[объект Element] [объект HTMLCollection]".

Но в IE 9-11 я вижу, что «[object Element] undefined».

Почему у documentElement нет детей?

Каков наилучший способ в IE 9+ (и Chrome и FF) получить все дочерние элементы элемента?

+0

Используйте 'childNodes' если' детей '' undefined'. На самом деле, я думаю, вы получите ту же проблему в Safari. – raina77ow

+0

@ raina77ow, но я хочу ребенка * элементы *, а не дочерние * узлы *. –

+0

Я вижу, но это IE, вы знаете. [Релевантные] (http://stackoverflow.com/questions/1464328/why-does-this-javascript-dom-code-only-workin-ff-but-not-ie). – raina77ow

ответ

1

Самый простой подход, который я могу порекомендовать использовать Array.prototype.filter() на дочерние узлы элемента:

function getChildElements(element) { 
    return Array.prototype.slice.call(element.childNodes) 
    .filter(function (e) { return e.nodeType === 1; }); 
} 

var childElements = getChildElements(element); 
0

children определяется в ParentNode интерфейс, который реализуется Element.

Однако, похоже, что на IE ParentNode реализован HTMLElement вместо Element.

Интересно, что этот грязный подход работает для одиночных экземпляров на IE:

element.__proto__ = HTMLElement.prototype; 
var children = element.children;   // Now this works 
element.__proto__ = Element.prototype; // Restore [[Prototype]] 

Для того, чтобы исправить проблемы в IE для всех Element случаев, вы можете использовать

var obj = Element.prototype, 
    prop = 'children', 
    desc = Object.getOwnPropertyDescriptor(HTMLElement.prototype, prop); 
if(!obj.hasOwnProperty(prop) && desc) 
    Object.defineProperty(obj, prop, desc); 
Смежные вопросы