我们在日常进行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; }