对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; } }
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年