Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

对XML元素操作的一些注意点

在IE中,如果版本少于9,那么不能直接设置自定义属性,必须通过setAttribute方法才行,其他浏览器没有此麻烦。

//比如Sizzle这段代码,在IE的XML中会出错,不能直接el.aaa = "bbb"
            if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
                count = 0;
 
                for ( node = parent.firstChild; node; node = node.nextSibling ) {
                    if ( node.nodeType === 1 ) {
                        node.nodeIndex = ++count;
                    }
                }
 
                parent[ expando ] = doneName;
            }

XML的getElementsByTagName,如果标签名存在命名空间(换言之有“:”隔开),opera, chrome, safari是找不到,firefox与IE可以。这时就需要用getElementsByTagNameNS与lookupNamespaceURI这两个生僻的API了。下面是我寻找tagName的方法:

function getElementsByTagName(tagName, els, flag_xml) {
    var method = "getElementsByTagName", elems = [], uniqResult = {}, prefix
    if(flag_xml && tagName.indexOf(":") > 0 && els.length && els[0].lookupNamespaceURI){
        var arr = tagName.split(":");
        prefix = arr[0];
        tagName = arr[1];
        method = "getElementsByTagNameNS";
        prefix = els[0].lookupNamespaceURI(prefix);
    }
    switch (els.length) {
        case 0:
            return elems;
        case 1:
            //在IE67下,如果存在一个name为length的input元素,下面的all.length返回此元素,而不是长度值
            var all =  prefix ? els[0][method](prefix,tagName) : els[0][method](tagName)
            for(var i = 0, ri = 0, el; el = all[i++];){
                if(el.nodeType === 1){//防止混入注释节点
                    elems[ri++] = el
                }
            }
            return elems;
        default:
            for(i = 0, ri = 0; el = els[i++];){
                var nodes = prefix ? el[method](prefix,tagName) : el[method](tagName)
                for (var j = 0, node; node = nodes[j++];) {
                    var uid = dom.getUID(node);
                    if (!uniqResult[uid]) {
                        uniqResult[uid] = elems[ri++] = node;
                    }
                }
            }
            return elems;
    }
}

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(1798)  评论(2编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2009-11-07 javascript框架之继承机制2
点击右上角即可分享
微信分享提示