兼容的 DOM 方法

1. 获取某个容器中所有的元素(也可以获取特定标签的元素)(children)

<div id = "box">
    <div></div>
    <div>
          <p></p>
    </div>
    <p></p>
</div>
<script>
// 想获取 box 下的所有子元素
      var oDiv = document.getElementById("box");
     // oDiv.children.length   //   IE 下与标准浏览器表现不一致
      function children(curEle,tagName){
            var arr = [];
            if(/MSIE (6|7|8)/i.test(navigator.userAgent)){    // IE 6 ~ 8 
                  var nodeList = curEle.childNodes;
                  for(var i = 0, len = nodeList.length; i< len; i++){
                    var curNode = nodeList[i];
                    if(curNode.nodeType == 1){
                       arr[arr.length] = curNode;
                    }
                    nodeList = null;
                  }
            }else{
               arr = Array.prototype.slice.call(curEle.children);   // 标准浏览器
            }

            if(typeof tagName !== "string") {
                  for(var i = 0; i < arr.length; i++){
                      var ele = arr[i];
                      if(ele.nodeName.toLowerCase() == tagName.toLowerCase()){
                          arr.splice(i,1);
                           i--;
                      }
                  }
             }
            return arr;
      }
</script>

2. getElementsByClass : 通过元素的样式获取一组元素
3. 获取上一个兄弟元素节点(prev)、下一个兄弟元素节点(next)、所有的哥哥节点(prevAll)、所有的弟弟节点(nextAll)、 相邻的两个元素(sibling)、所有的兄弟元素节点(siblings)

var flag = "getComputedStyle" in window
function prev(ele){
  if(flag){   // IE 6~8 中为 false
    return ele.previousElementSibling;
   } 
    var pre = ele.previousSibling;
    while(pre && pre.nodeType !== 1){
      pre = pre.previousSibling;
    }
    return pre;
}

function next(ele){
  if(flag){
    return ele.nextElementSibling;
  }
  var nextEle = ele.nextSibling;
  while(nextEle && nextEle.nodeType !== 1){
      nextEle = nextEle.nextSibling'
    }
    return nextEle;
}

function prevAll(ele){
  var arr = [];
  var pre = prev(ele);
  while(pre){
    arr.unshift(pre);
    pre = prev(ele);
  }
  return arr;
}

function nextAll(ele){
  var arr = [];
  var nex = next(ele);
  while (nex){
    arr.push(nex);
    nex = next(nex);
  }
  return arr;
}

function sibling(ele){
  var pre = prev(ele);
  var nex = next(ele);
  var arr = [];
  pre ? arr.push(pre) : null;
  nex ? arr.push(nex) : null;
  return arr;
}

function siblings(ele){
   return prevAll(ele).concat(nextAll(ele));
}

4. 获取第一个元素的子节点、最后一个元素的子节点

function firstChild(ele){
  var allEle = children(ele);    // ele.children 返回数组,如果没有子元素,返回 []
  return allEle.length > 0 ? allEle[0] : null;   
}

function lastChild(ele){
  var allEle = children(ele);
  return allEle.length > 0 ? allEle[allEle.length - 1] : null;
}

5. 获取当前元素的索引(index)

function index(ele){
   return prevAll(ele).length;
}

6. 增加到某个容器的开头(prepend)

function append(container, newEle){
  container.appendChild(newEle);
}

function prepend(container, newEle){
  var firstEle = firstChild(container);
  if(firstEle){
    container.insertBefore(newEle, firstEle);
  }else{
     container.appendChild(newEle); // 说明没有子元素
  }
}

7. 增加到容器中某个元素的末尾(insertAfter)

function insertBefore(newEle,oldEle){
   oldEle.parentNode.insertBefore(newEle,oldEle);
}

function insertAfter(newELe, oldEle){
  var nex = next(oldEle);
  if(nex){
     oldEle.parentNode.insertBefore(newEle,nex);  
    return;
  }
  oldEle.parentNode.appendChild(newEle);
}

function insertAfter(nEle,oEle){
  var parentEle = oEle.parentNode;
  if(parentEle.lastChild == oEle){
    parentEle.appendChild(nEle);
  }else{
    parentEle.insertBefore(nEle,oEle.nextSibling); // 紧跟后面
  }
}

8. 判断是否有样式类名 (hasClass)

var box = document.getElementById("box");
box.className +=" className"; // 加等于 注意空格 

function hasClass(ele, className){
//  ele.className  得到一个字符串
  var reg = new RegExp("(^| +)"+className + "( +|$)");   // 左边可能是开头或一到多个字符,右边可能是结尾或一到多个字符
   return reg.test(ele.calssName);
}

9. 增加样式类名(addClass)

function addClass(ele, className){
    var arr = className.split(/ +/g);
    for(var i = 0; i < arr.length; i++ ){
        var curName = arr[i];
        if(!hasClass(ele,curName)){
          ele.ClassName +=" " + curName;
        }
    }
}

10. 删除样式类名(removeClass)

function removeClass(ele, className){
    var arr = className.split(/ +/g);
    for(var i = 0; i < arr.length; i++ ){
        var curName = arr[i];
        if(hasClass(ele,curName)){
          var reg = new RegExp("(^| +)" + curName + "( +|$)", "g");
           ele.classaName = ele.className.replace(reg," ");
        }
    }
}

11. 设置CSS样式(setCss)

function setCss(ele, attr, value){
  if(attr == "float"){
     ele.style.cssFloat = value;
     ele.style.styleFloat = value;
     return;
  }
  if(attr == "opacity"){
    ele.style.opacity = value;
    ele.style.filter = "alpha(opacity=" + value * 100 + ")";
    return;
  }
  var reg = /^(width|height|top|bottom|left|right|((margin|padding)(Top|Bottom|Left|Right)?))$/;
  if(reg.test(attr)){
    if(!isNaN(value)){
        value = value + "px";
    }     
  }
  ele.style[attr] = value;
}  

12. 批量设置CSS样式(setGroupCss)

function setGroupCss(ele,obj=0){
  if(obj.toString() !== "[object Object]"){   // 如果只传入ele,obj = undefined,undefined null 没有 toString() 方法。
    return;
  }
  for(var key in obj){
    if(obj.hasOwnProperty(key)){
          setCss(ele,key,obj.key);
     }  
  }
}

13. jQuery 中的 css 方法的使用以及自定义的 css 方法:

$("#box").css("width")  // getCss
$("#box").css("width",300) // setCss
$("#box").css({
    width:100, height:100
})

function css(ele){
  var arr = Array.prototype.slice.call(arguments,1);
  if(typeof arguments[1] == "string"){
    if(typeof arguments[2] == "undefined"){
        return getCss.apply(ele,arr);
    }
    setCss.apply(ele, arr);
    return;
  }
  if(argTwo.toString() == "[object Object]"){
    setGroupCss.apply(this,arguments);
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,722评论 1 92
  • 一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.co...
    凛0_0阅读 3,350评论 0 44
  • 我上一周和老爸来了一次“世界大战",这次我很快从情绪里转了念头,不仅这次我没有像以往一样把自己当成受害者,觉的这一...
    勇敢去飞阅读 818评论 0 3
  • 歌手:Adele 所属专辑:25 Hello, it's me 你好吗 是我 I was wondering if...
    LittleHouse阅读 2,667评论 0 1
  • 最近,香港演员张柏芝又上热搜了。 张柏芝和谢霆锋离婚后,话题一直没断过。这次上热搜又是因为谢霆锋和王菲和她的女儿同...
    6翻了year阅读 518评论 0 0