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