Javascript操作DOM的API及兼容性相关笔记(三)

1.数组的那些遍历方法forEach、map、filter、every、some,在IE678中不存在,dom对象的属性操作方法getAttribute、setAttribute、removeAttribute在IE678中也不存在,通过控制台打印的时候发现,返回的是一个Object类型的{},也就是空对象。

◆js兼容性封装代码

/**
 * 功能:根据id获取元素节点
 * @param id
 * @returns {Element}
 */
function getelebyid( id ) {
    return document.getElementById(id);
}


//******************获取子元素节点*********开始********//
/**
 * 功能:获取第一个子元素节点
 * @param ele
 * @returns {Element|*|Node}
 */
function getfirstchild( ele ) {
    return ele.firstElementChild || ele.firstChild;
}

/**
 * 功能:获取最后一个子元素节点
 * @param ele
 * @returns {Element|*|Node}
 */
function getlastchild( ele ) {
    return ele.lastElementChild || ele.lastChild;
}

/**
 * 功能:获取对应索引值的子元素节点
 * @param ele
 * @param index
 * @returns {*|HTMLElement}
 */
function getchildofindex( ele, index ) {
    return ele.children[index];
}

/**
 * 功能:获取所有的子元素节点
 * @param ele
 * @returns {Array}
 */
function getallchild( ele ) {
    var newArr = [];
    var oldArr = ele.children;
    for (var i = 0; i < oldArr.length; i++) {
        if (oldArr[i].nodeType === 1) {
            newArr.push(oldArr[i]);
        }
    }
    return newArr;
}
//******************获取子元素节点*********结束********//


//******************获取兄弟元素节点*********开始********//
/**
 * 功能:获取上一个兄弟元素节点
 * @param ele
 * @returns {Element|*|Node}
 */
function getpresibling( ele ) {
    var pre = ele.previousElementSibling || ele.previousSibling;
    return pre;
}

/**
 * 功能:获取下一个兄弟元素节点
 * @param ele
 * @returns {Element|*|Node}
 */
function getnextsibling( ele ) {
    return ele.nextElementSibling || ele.nextSibling;
}

/**
 * 功能:获取对应索引值的兄弟元素节点
 * @param ele
 * @param index
 * @returns {*|HTMLElement}
 */
function getsiblingofindex( ele, index ) {
    return ele.parentNode.children[index];
}


/**
 * 功能:获取所有的兄弟元素节点(不包括自己)
 * @param ele
 * @returns {Array}
 */
function getallsibling( ele ) {
    var newArr = [];
    var oldArr = ele.parentNode.children;
    for (var i = 0; i < oldArr.length; i++) {
        if (oldArr[i] != ele) {
            newArr.push(oldArr[i]);
            //newArr[newArr.length]=oldArr[i];
        }
    }
    return newArr;
}
//******************获取兄弟元素节点*********结束********//


◆html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>对象的访问关系兼容性函数封装</title>
    <style type="text/css">
        * {
            padding: 0;
            margin: 0;
        }


        ul {
            width: 200px;
            margin:70px 50px;
            overflow: hidden;
        }
        
        li {
            list-style:none;
            width: 100px;
            height: 100px;
            background-color: #0f0;
            margin:10px auto;
        }
    </style>
</head>
<body>
    <div id="box">
        <ul>
            <li></li>
            <li></li>
            <li id="li3"></li>
            <li></li>
            <li></li>
        </ul>
    </div>
    <script src="1.对象的访问关系兼容性工具类(tools).js"></script>
    <script>
//        //获取当前节点
//        var box=document.getElementById("box");
//
//        //获取父节点
//        box.parentNode;
//
//        //获取上一个兄弟节点
//        box.previousSibling;
//        box.previousElementSibling;
//
//        //获取下一个兄弟节点
//        box.nextSibling;
//        box.nextElementSibling;
//
//        //获取第一个子节点
//        box.firstChild;
//        box.firstElementChild;
//
//        //获取最后一个子节点
//        box.lastChild;
//        box.lastElementChild;
//
//        //获取子节点
//        box.childNodes;
//        box.children;

        var li=getelebyid("li3");
        li.style.backgroundColor="#f00";

        getpresibling(li).style.backgroundColor="#00f";
        getnextsibling(li).style.backgroundColor="#ff0";

        var parent=li.parentNode;
        getfirstchild(parent).style.backgroundColor="#0ff";
        getlastchild(parent).style.backgroundColor="#f0f";

        var arr=getallsibling(li);
        arr.forEach(function(element,index,array){
            element.style.backgroundColor="#000";
        });

    </script>
</body>
</html>


2.dom元素创建的三种方式
◆使用document.write();这种方式会覆盖原来的页面的全部内容,慎用。
◆使用innerHTML属性,这种方式如果是持续添加的话,那么就使用+=,如果想覆盖原来的话,就直接=,绑定属性和内容比较方便。(节点套节点)。

◆使用document.createElement("li");这种方式是最纯正的,效率不高,因为还要添加到某个节点里面,但是创建的这个元素可以当作一个真正的页面元素来使用,定数量的时候一般用它。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>dom元素创建的三种方式</title>
</head>
<body>
<button id="btn1">创建第一种创建元素的方式</button>
<button id="btn2">创建第二种创建元素的方式</button>
<button id="btn3">创建第三种创建元素的方式</button>
<ul id="ul01">

</ul>
<ul id="ul02">
<li id="li01">指定目标节点</li>
</ul>
<script>

        //第一种方式 document.write();这种方式会覆盖原来的页面的全部内容
        btn1.onclick=function(){
            document.write("<li>第一种创建元素的方式创建的元素</li>");
        }

        //第二种方式 innerHTML; innerText无法识别标签
        btn2.onclick=function(){
            ul01.innerHTML+="<li>第二种创建元素的方式创建的元素</li>";
        }

        //第三种方式 document.createElement();
        btn3.onclick=function(){
            var li=document.createElement("li");
            li.innerHTML="第三种创建元素的方式创建的元素";
            //把一个元素添加到一个元素内部的最下面
            ul02.appendChild(li);
            //把一个新元素添加指定节点的前面
            ul02.insertBefore(li,li01);

            console.log(li.innerText);
            console.log(li.textContent);
        }

</script>
</body>
</html>


3.通过dom对象的第一种获取属性的方式 对象.属性名和对象["属性名"],只能够获取标签上的行内属性,例如对象.style并不能获取内嵌的<style type="text/css"></style>标签对中的css样式属性和外链的<link re="stylesheet" href="1.css"/>中的css样式属性,但可以获取页面标签中的行内css样式,页面标签行内css样式通过style属性来获取,对象.style也是一个对象,并不是一个字符串,如果要获取字符串的话,可以通过对象.style.cssText来获取css样式文本字符串,也能通过对象.style.cssText来设置css样式文本字符串的值,jquery中的css方法就是通过cssText来实现的,cssText其实就是页面标签的style属性的文本值,通过它可以快速的覆盖原来的行内样式,获取和设置对象.style中的样式属性使用的命名规则是驼峰命名法而不是css样式里的-横杠,比如css样式中line-height转换为页面标签对象的style对象的属性时是对象.style.lineHeight。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>style属性的注意点</title>
    <style type="text/css">
        #box {
            border: 1px solid #000;
        }
        
    </style>
</head>
<body>
<div id="box" style="width: 100px;height: 100px;background-color: #0f0;"></div>
<script>
    //1.对象的style属性也是一个对象
    var style=box.style;
    console.log(style);
    //2.style属性对象只能够获取行内的样式并不能获取内嵌和外链的样式
    console.log(style.backgroundColor);//如果有 则会输出属性值的字符串
    console.log(style.border);//如果是行内样式中没有的属性 则会返回空字符串
    //3.style属性对象里的成员使用的都是驼峰命名法,并并非是全小写加-横杠
    console.log(style.width);
    console.log(style.height);
    //4.如果想通过设置样式时一次性设置多个,可以使用style属性对象的cssText属性来设置,通过设置字符串的方式来设置css样式,和直接设置多个行内样式方式一样,每一次直接设置cssText都会覆盖掉原来标签设置style属性中的字符串。
    console.log(style.cssText);
    style.cssText="width:50px;height:50px;";


</script>
</body>
</html>


4.盒子隐藏的方式  display visibility opacity position
◆box.style.display="none";隐藏 不占位置
◆box.style.visibility="hidden";隐藏 占位置
◆box.style.opacity="0";和下面一组  隐藏占位置box.style.filter="alpha(opacity=0)";只在IE678中有效

◆box.style.position="absolute";和下面一组 隐藏不占位置,box.style.top="-9999px";

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>各种隐藏盒子</title>
    <style>
        #box {
            width: 100px;
            height: 100px;
            background-color: #0f0;
        }
    </style>
</head>
<body>
<div id="box"></div>
<script>
    box.onclick= function ( ) {
        box.style.display="none";//隐藏 不占位置

        box.style.visibility="hidden";//隐藏 占位置

        box.style.opacity="0";//和下面一组  隐藏占位置
        box.style.filter="alpha(opacity=0)";//只在IE678中有效

        box.style.position="absolute";//和下面一组 隐藏不占位置
        box.style.top="-9999px";
    }
</script>
</body>
</html>


5.元素的增加、删除、替换、克隆
◆增加:appendChild(newnode);追加新节点insertBefore(newnode,oldnode);把新节点插入到老节点之前
◆删除:removeChild(oldnode);移除老节点
◆替换:replaceChild(newnode,oldnode);使用新节点替换掉老节点

◆克隆:cloneNode();不完全克隆,cloneNode(true);完全克隆。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>元素的创建、增加、删除、替换、克隆</title>
</head>
<body>
<ul id="ul01">
    <li id="li01">我是指定目标节点li01</li>
    <li id="li02">我是指定目标节点li02</li>
    <li id="li03">我是指定目标节点li03</li>
    <li id="li04">我是指定目标节点li04</li>
</ul>
    <script>
        //元素的创建、增加、删除、替换、克隆

        //元素的创建三种方式
//1.        document.write("<li></li>") 不常用 会覆盖掉原来的内容
//2.        ul01.innerHTML="<li></li>"; 常用 当出现节点套节点的时候用这个特别方便的,绑定属性什么的也是很快的,直接书写html标签即可
//3.        document.createElement("li");常用,当指定节点数目时用这个很方便,但是节点套节点会有点麻烦,那个时候推荐是innerHTML

        //元素的增加
        var li=document.createElement("li");
        li.innerHTML="我是li";
        //追加
            //ul01.appendChild(li);

            //把li插入到li01中去
            //ul01.insertBefore(li,li01);

        //元素的删除  从ul01删除掉li01
            //ul01.removeChild(li01);

        //元素的替换  把ul01中的 li替换成li01
            //ul01.replaceChild(li,li01);

        //元素的克隆
            var cloneUl1= ul01.cloneNode();
            var cloneUl2= ul01.cloneNode(true);
            console.log(cloneUl1);//空壳的ul
            console.log(cloneUl2);//完整的ul

    </script>
</body>
</html>


6.如果移动子节点,不要使用正的for循环,因为父元素中的子节点的长度会随着移动而减少,所以需要使用反for循环。

◆选择水果移动到另一个篮子里

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择水果后移动到另一个水果篮</title>
    <style type="text/css">
        select {
            width: 150px;
            height: 200px;
            background-color: #0f0;
        }
    </style>
</head>
<body>
<select name="" size="10" id="sle01" multiple>
    <option value="0">香蕉</option>
    <option value="1">橘子</option>
    <option value="2">苹果</option>
    <option value="3">鸭梨</option>
    <option value="4">海豚</option>
</select>
<button>>>></button>
<button><<<</button>
<button>></button>
<button><</button>
<select name="" size="10" id="sle02" multiple>
</select>
<script>
    //需求:当点击>>>按钮时 就把sle01中所有的option全部移动到sle02中,<<<也是类似, 当点击>是,就把sle01中选中的option全部移动到sle02中,<也是类似。
    //思路:点击>>>或者<<<时,获取所有的option,使用反循环添加选项,如果是><时,把当前选中的项 使用循环添加项
    //步骤:
    //1.获取事件源及相关元素
    //2.绑定事件
    //3.书写事件驱动程序


    //1.获取事件源及相关元素
    var btn1 = document.getElementsByTagName("button")[0];
    var btn2 = document.getElementsByTagName("button")[1];
    var btn3 = document.getElementsByTagName("button")[2];
    var btn4 = document.getElementsByTagName("button")[3];

    //2.绑定事件
    btn1.onclick = function () {//<<<
        //3.书写事件驱动程序

        var selects = sle01.children;
        //这个循环不行,因为元素数组的节点会减少 所以只能使用反循环
//        for(var i=0;i<selects.length;i++){
//            sle02.appendChild(selects[i]);
//        }
        for (var i = selects.length - 1; i >= 0; i--) {
            sle02.appendChild(selects[selects.length - 1 - i]);
        }
    }

    //>>>
    btn2.onclick = function () {
        //3.书写事件驱动程序
        //3.书写事件驱动程序

        var selects = sle02.children;
        //这个循环不行,因为元素数组的节点会减少 所以只能使用反循环
//        for(var i=0;i<selects.length;i++){
//            sle02.appendChild(selects[i]);
//        }
        for (var i = selects.length - 1; i >= 0; i--) {
            sle01.appendChild(selects[selects.length - 1 - i]);
        }
    }

    //>
    btn3.onclick = function () {
        moveSelectedNode(sle01, sle02);
    }

    //<
    btn4.onclick = function () {
        moveSelectedNode(sle02, sle01);
    }

    //选中所有项
    function selectAllNode( obj ) {
        var objchildrens = obj.children;
        for (var i = 0; i < objchildrens.length; i++) {
            objchildrens[i].selected = true;
        }
    }

    //移动选中后的项
    function moveSelectedNode( obj, toobj ) {
        var newArr = []
        var objchildrens = obj.children;
        for (var i = 0; i < objchildrens.length; i++) {
            if (objchildrens[i].selected) {
                newArr.push(objchildrens[i]);
            }
        }
        for (var j = 0; j < newArr.length; j++) {
            toobj.appendChild(newArr[j]);
        }
    }

</script>
</body>
</html>

posted @ 2018-06-25 16:32  我叫贾文利  阅读(138)  评论(0编辑  收藏  举报