Ruby's Louvre

每天学习一点点算法

导航

对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;
            }
        }

posted on 2011-11-07 02:03  司徒正美  阅读(1767)  评论(2编辑  收藏  举报