HTMLDocument和XMLDocument 的children

在所有主流浏览器中,document是一个HTMLDocument类型的对象。

document.children  或者 DOM元素的children都是可以访问的,它返回是该节点下的所有Element节点。 它们同样还有一个childNodes属性,它返回所有节点,区别就是它包含所有文字节点,注释节点等等,它一般比 children返回的元素多。

console.dir(document.__proto__)
    HTMLDocument
console.dir(document.body.__proto__)
    HTMLBodyElement 
document.children
    [html]
document.childNodes
   (2) [<!DOCTYPE html>, html]
document.body.children
  (2) [div#main, div.timeTravel]
document.body.childNodes
  (4) [text, div#main, text, div.timeTravel]

IE11下,解析一个XML文件后,得到的对象是XMLDocument,它竟然没有children属性。而chrome,firefox都是有children属性的。

var parser = new DOMParser();
var root = parser.parseFromString(this.xbrl, "application/xml");   //root 是XMLDocument对象

去MDN上查询一下XMLDocument的API,竟然说

W3C并没有定义XMLDocument接口。原因是document接口本来就是为xml定义的。而HTML只是xml的一种实现。

现在来看,就IE浏览器解析的XMLDocument有问题!为了保证代码用children属性,给这两个原型增加children,我是这样解决的:

var parser = new DOMParser();
var root = parser.parseFromString(this.xbrl, "application/xml");
    //IE11中,root是XMLDocument对象,没有  children属性
if (!root.children) {
    Object.defineProperty(XMLDocument.prototype, "children", {
        get: function () {
            var nodes=Array.prototype.slice.call( this.childNodes) as Node[];
            return nodes.filter((n)=>n.nodeType==1);
        }
    });
    Object.defineProperty(Element.prototype, "children", {
        get: function () {
            var nodes=Array.prototype.slice.call( this.childNodes) as Node[];
            return nodes.filter((n)=>n.nodeType==1);
        }
    });
}
//此处即可用children来获取子节点了,
this.xbrlHtml = this.renderElement(root.children[0]);    

完美解决!

转载于:https://my.oschina.net/u/1540190/blog/915288

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值