DOM操作是前端人员最常用的,但是很多的操作方法在不同的浏览器下面却有不同的标准,所以总结了一些公共的兼容方法。注:这里是在window上面增加了一个对象来承载我的方法,如果采用原型的方式,由于ie低版本是和操作系统绑定的所以HTMLElement不存在,所以原型的方法不能兼容。
以下的方法为了展现完整的代码,所以中间不断开加注释,所有的注释在代码里面。
(function(WIN){ //HTMLElement.prototype var DOM = {}; /** * 获取子节点 * * @param ele代表父元素; * @param node查找规定的子元素,如果不传入则查找所有的子元素; * @return 返回一个数组--里面是一个dom集合 */ DOM.getChildren = function(ele,node){ var domArr = [], //最终符合标准的子元素全部放到这里 child = ele.childNodes, //所有的子元素(包括text节点,注释节点) condition = null; //循环元素节点,筛选 for(var i = 0, len = child.length, item; i < len; i++){ item = child[i]; condition = (node && typeof node === 'string') ? (item.nodeType === 1 && item.tagName === node.toUpperCase()) : (item.nodeType === 1); if(condition){ //根据条件筛选 domArr.push(item); } } //返回集合 return domArr; }; /** * 获取下一个兄弟节点(一个节点) * * @param node当前的html元素 * @return 返回一个dom元素 */ DOM.getNextSibling = function(node){ //一直向下查找找到元素节点返回 var node = node.nextSibling; if(node.nodeType === 1){ //如果查找到的是元素节点 return node; } if(node.nextSibling){ //如果查找到的不是元素节点,并且有下一个兄弟节点 //递归调用该方法查找 return arguments.callee(node); } //如果查找到的既不是元素节点也没有下一个节点了,那么返回null return null; }; //另外一种实现的方式(获取下一个兄弟节点) DOM.getNextSibling = function(node){ if(!node){return}; if(node.nextElementSibling) { return node.nextElementSibling; }else { //如果不支持的话就用while循环 var silbings = node.nextSibling; while(silbings.nodeType != 1){ silbings = silbings.nextSibling; } return silbings; } }; /** * 查找哥哥节点(集合) * * @param node当前的html元素 * @param dom一个数组集合,里面是dom元素的集合 * @return 返回一个数组 */ DOM.getPrevSilbing = function(node, dom){ var domArr = dom ? dom : []; var node = node.previousSibling; if(node && node.nodeType === 1){ //如果查找到的是元素节点放入数组 domArr.push(node); } if(node && node.previousSibling){ //如果查找到的不是元素节点,并且有下一个兄弟节点 //递归调用该方法查找 return arguments.callee(node,domArr); } //如果查找到的既不是元素节点也没有下一个节点了,那么返回null return domArr; }; /** * 通过class来查找元素 * * @param name是要查找的class名称 * @param content是查找范围,默认是document * @return 返回一个类数组或一个数组,所以取到的不能用item操作 */ DOM.getEleByClass = function(name,content){ name = name.replace(/^ +| +$/g,''); //去掉开头结尾的空格 if(document.getElementsByClassName){ return document.getElementsByClassName(name); }else { var content = content || WIN.document, tag = content.getElementsByTagName('*'), reg = new RegExp('(^| )'+name+'( |$)'), domArr = []; for(var i = 0, len = tag.length, curClass, result; i < len; i++){ curClass = tag[i].className; //当前元素的所有class result = reg.test(curClass); //正则匹配是否含有该class if(result){ domArr.push(tag[i]);} //如果匹配到该class,把dom结构放进数组里面去 } return domArr; //返回含有该class的所有dom } }; /** * 通过class来查找元素(但是这个适用于有很多的class限制的时候) * * @param name是要查找的class名称 * @param content是查找范围,默认是document * @return 返回一个类数组或一个数组,所以取到的不能用item操作 */ DOM.byClass = function(name,content){ content = content || document; name = name.replace(/^ +| +$/g,''); var tar = content.getElementsByTagName('*'); var aStr = name.split(/ +/); for(var i = 0, len = aStr.length; i < len; i++){ eles = DOM.getEleByClass(aStr[i],eles); //循环调用byClass方法 } return eles; }; /** * 判断是否含有某个class * * @param ele是dom元素 * @param name是class名称 * @return 返回一个布尔值,true或者false */ DOM.hasClass = function(ele,name){ var reg = new RegExp('(^| )'+name+'( |$)',"g"); var classname = ele.className; return reg.test(classname); }; /** * 添加一个class名称 * * @param ele是dom要添加class的dom元素 * @param name是class名称 * */ DOM.addClass = function(ele,name){ if(!DOM.hasClass(ele,name)){ //如果原本没有这个class var oldName = ele.className; var newName = oldName + ' ' +name; ele.className = newName; } }; /** * 删除class的名称 * * @param ele是dom要添加class的dom元素 * @param name是class名称 * */ DOM.removeClass = function(ele,name){ if(DOM.hasClass(ele,name)){ //如果原本没有这个class var oldName = ele.className; var reg = new RegExp(' *'+name+' *',"g"); //匹配空格 ele.className = oldName.replace(reg,''); } }; /** * 查找元素的css值 * * @param ele代表指定的元素 * @param style代表要获取的属性 * */ DOM.getStyle = function(ele,style){ if(WIN.getComputedStyle) { return getComputedStyle(ele,null)[style]; //第二个参数可以是伪类“after” }else { return ele.currentStyle[style]; } }; WIN.DOM = DOM; })(window);
方法写的逻辑比较简单,如果有漏洞,请联系本人修改。qq:185986288
浙公网安备 33010602011771号