兼容的 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);
  }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,806評論 1 92
  • 一、樣式篇 第1章 初識jQuery (1)環境搭建 進入官方網站獲取最新的版本 http://jquery.co...
    凜0_0閱讀 3,451評論 0 44
  • 我上一周和老爸來了一次“世界大戰",這次我很快從情緒里轉了念頭,不僅這次我沒有像以往一樣把自己當成受害者,覺的這一...
    勇敢去飛閱讀 839評論 0 3
  • 歌手:Adele 所屬專輯:25 Hello, it's me 你好嗎 是我 I was wondering if...
    LittleHouse閱讀 2,754評論 0 1
  • 最近,香港演員張柏芝又上熱搜了。 張柏芝和謝霆鋒離婚后,話題一直沒斷過。這次上熱搜又是因為謝霆鋒和王菲和她的女兒同...
    6翻了year閱讀 545評論 0 0