chaihongjun.me

JS移除空白节点的封装函数

我们在日常进行DOM操作的时候,经常会使用到查找元素节点的父节点或者子节点及兄弟节点等。由于浏览器实现的效果差异,在IE老版本环境下,DOM操作查找节点会自动忽略掉空的文本节点,而标准的DOM会识别出空白文本节点(现代浏览器)。一般我们不对空白文本节点做操作,而且也没有实际意义的操作,因此,为了统一兼容,可以将空白文本节点事先做排除处理:

/*  
参数说明:
node:需要被操作的节点
node.childNodes[i].nodeType === 3 表示node子节点类型如果为3,即为文本节点
/^\s+$/.test(node.childNodes[i].nodeValue) 正则匹配节点值是否包含空白字符
/^\s+$/ 表示匹配以空白字符1-N多个开头的模式
node.childNodes[i].nodeValue 当前节点的节点值(只适合文本节点)
if (node.childNodes[i].nodeType === 3 && /^\s+$/.test(node.childNodes[i].nodeValue)) 
表示判断
1.首先当前节点是否是文本节点
2.再判断是不是空白的节点
由于节点操作需要在父节点上,因此,
node.childNodes[i].parentNode.removeChild(node.childNodes[i])
表示因为当前节点是空白文本节点,所以回到,它的父节点,再删除这个空白文本子节点
*/
function removeSpaceNode(node){
 for(var i=0; i<node.childNodes.length;i++){
   if(node.childNodes[i].nodeType===3&&/^\s+$/.test(node.childNodes[i].nodeValue)){
     node.childNodes[i].parentNode.removeChild(node.childNodes[i]);
    }
   }
 return node;
}

当须要操作的时候只需要先使用这个函数过滤一下即可:

...
 var eNode = document.getElementById("elementNode");
     removeSpaceNode(eNode);
...

上面的方法是将空白文本节点删除,是将DOM做了修改,如果不想对DOM做修改,则可以将非空白节点按照顺序存放入一个新的数组,待后续操作:

function filterSpaceNode(nodes) {
var ret = []; //新数组用于存放非空白节点
for (var i = 0; i < nodes.length; i ++) {
//如果识别到空白文本节点,就不添加数组
if (nodes[i].nodeType == 3 && /^\s+$/.test(nodes[i].nodeValue)) continue;
//把每次的元素节点,添加到数组里
ret.push(nodes[i]);
}
return ret;
}


知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:chaihongjun»