zoukankan      html  css  js  c++  java
  • 前端之DOM

    老师的博客:https://www.cnblogs.com/liwenzhou/p/8011504.html

    DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方法。 

    当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

    HTML DOM 模型被构造为对象的树。

    DOM标准规定HTML文档中的每个成分都是一个节点(node):

    • 文档节点(document对象):代表整个文档
    • 元素节点(element 对象):代表一个元素(标签)
    • 文本节点(text对象):代表元素(标签)中的文本
    • 属性节点(attribute对象):代表一个属性,元素(标签)才有属性
    • 注释是注释节点(comment对象) 

    JavaScript 可以通过DOM创建动态的 HTML:

    • JavaScript 能够改变页面中的所有 HTML 元素
    • JavaScript 能够改变页面中的所有 HTML 属性
    • JavaScript 能够改变页面中的所有 CSS 样式
    • JavaScript 能够对页面中的所有事件做出反应

    查找标签

    直接查找

    对于样式
    document.getElementById(id) 根据ID获取一个标签 document.getElementsByClassName(class) 根据class属性获取
    对于标签 document.getElementsByTagName(div) 根据标签名获取标签合集

    注意:id是element,而其它是elments

    涉及到DOM操作的JS代码应该放在文档的哪个位置

    间接查找

    parentElement            父节点标签元素
    children                 所有子标签
    firstElementChild        第一个子标签元素
    lastElementChild         最后一个子标签元素
    nextElementSibling       下一个兄弟标签元素
    previousElementSibling   上一个兄弟标签元素

    为了详细的这些方法的使用,见下面的代码

    HTML

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>review53</title>
        <style>
            div>
            .c1{height:500px;
                width:500px;
                background:yellow ;
            border-radius: 5%;
                overflow:auto;}
            .p1{
                color: rgb(112,121,142);
                display:inline-block;}
            #nb{color:#569823}
            .p2{color:red}
        </style>
    
    
    </head>
    <body>
    <div class="c1">我是一个div我的类是c1
        <p class="p2">我是div中的p标签 class=p2
            <span class="p1">我是div的孙子 class=p1</span>
        </p>
        <p class="p1"> 我是第二个div的子标签 class p1</p>
    </div>
    <p calss="p1">我是一个单独的p标签 我的类是p1</p>
    <a href="https://www.jd.com" >小哥哥快来玩啊</a>
    <div id="nb">我是一个代表nbid的div</div>
    <script src="查找标签.js" ></script>
    </body>
    </html>

    javascript

    alert('欢迎来到德莱联盟');
    console.log('查找标签');
    // 直接查找document.getElementById           根据ID获取一个标签
    // document.getElementsByClassName   根据class属性获取
    // document.getElementsByTagName     根据标签名获取标签合集
    var laoda=document.getElementsByClassName('c1');
    console.log(laoda);
    var son=document.getElementsByClassName('p2');
    var grandson=document.getElementsByClassName('p1');
    // parentElement            父节点标签元素
    var par=son[0].parentElement;
    console.log('查找父标签',par);
    // children                 所有子标签
    var childr=laoda[0].children;
    // var childr1=laoda[0].childList  不知道是啥,打印出来是undefined
    console.log('所有子标签',childr);
    // console.log('childenlist',childr1)
    // firstElementChild        第一个子标签元素
    // var firstchi=laoda[0].firstChild; // 返回时文本
    var first1=laoda[0].firstElementChild;
    console.log('第一个子标签',first1);// 返回是个文本
    // lastElementChild         最后一个子标签元素
    var lastchil=laoda[0].lastElementChild;
    // lastchild 返回的是文本
    console.log('最后一个子标签',lastchil);
    // nextElementSibling       下一个兄弟标签元素
    var next=laoda[0].nextElementSibling;
    console.log('下一个兄弟标签',next);
    // previousElementSibling   上一个兄弟标签元素
    var previ=laoda[0].previousElementSibling;
    console.log('上一个兄弟标签',previ);

    直接查找没有会显示null,但是直接查找会影响间接查找,如果直接查找的值为null的话,间接查找会直接报错。

    id 查找的元素可以直接使用,不用再加上[].

    返回都是一个列表

    节点操作

    你可以把节点看做是<p><div>之类的

    创建节点

    语法:createElement(标签名)

    var divEle = document.createElement("div");

    添加节点的属性:

    添加节点

    在最后添加一个子节点:

    somenode.appendChild(newnode);

    把节点放在某个节点的前面

    somenode.insertBefore(newnode,某个节点);

    节点属性:

    a.setAttribute('alt','你的哈士奇正在路上');
    p3.innerText='我是p3的文本'; //文本添加
    节点.setAttribute(参数名,参数值);
    节点.innerText=值;

    删除节点

    语法:

    获得要删除的元素,通过父元素调用该方法删除。

    somenode.removeChild(要删除的节点)

    替换节点

    语法:

    也是通过父类的方法去调用。

    somenode.replaceChild(newnode, 某个节点);

    节点属性

    获取文本节点的值:

    var divEle = document.getElementById("d1")
    divEle.innerText
    divEle.innerHTML

    设置文本节点的值:

    var divEle = document.getElementById("d1")
    divEle.innerText="1"
    divEle.innerHTML="<p>2</p>"

    attribute操作

    var divEle = document.getElementById("d1");
    divEle.setAttribute("age","18")
    divEle.getAttribute("age")
    divEle.removeAttribute("age")
    
    // 自带的属性还可以直接.属性名来获取和设置
    imgEle.src
    imgEle.src="..."

    获取值操作

    语法:

    elementNode.value

    适用于以下标签:

    • .input   
    • .select
    • .textarea 
    var iEle = document.getElementById("i1");
    console.log(iEle.value);
    var sEle = document.getElementById("s1");
    console.log(sEle.value);
    var tEle = document.getElementById("t1");
    console.log(tEle.value);

    class的操作

    className  获取所有样式类名(字符串)
    
    classList.remove(cls)  删除指定类
    classList.add(cls)  添加类
    classList.contains(cls)  存在返回true,否则返回false
    classList.toggle(cls)  存在就删除,否则添加

    指定CSS操作

    obj.style.backgroundColor="red"

    JS操作CSS属性的规律:

    1.对于没有中横线的CSS属性一般直接使用style.属性名即可。如:

    obj.style.margin
    obj.style.width
    obj.style.left
    obj.style.position

    2.对含有中横线的CSS属性,将中横线后面的第一个字母换成大写即可。如:

    obj.style.marginTop
    obj.style.borderLeftWidth
    obj.style.zIndex
    obj.style.fontFamily

    上诉集合代码

    html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>节点测试</title>
        <style>
            .div1{
                color: rgb(12,248,32);
            }
            .p1 {
                background: #998891;
            }
            .p2 {
                background: #119999;
            }
            .sel{
                confize:20px;
            }
        </style>
    </head>
    <body>
    <div class="div1">我是div class=div1
        <p class="p1">我是在div中的p1 class=p1</p>
        <p class="p2">我是在div中的p2 class=p2</p>
    </div>
    <lable>地址:</lable>
    <select name="location" id="location">
        <optgroup>
            重庆
            <option name="yz">渝中区</option>
            <option name="spb">沙坪坝区</option>
            <option name="yb">渝北区</option>
        </optgroup>
    
    </select>
    <script src="节点测试.js"></script>
    </body>
    </html>

    javascipt

    // 创造节点
    // alert('创造节点');
    var div2=document.createElement('div');
    var p3=document.createElement('p');
    var p4 =document.createElement('p');
    var a = document.createElement('img');
    // alert('添加节点属性');
    a.setAttribute('src','https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=4083886402,415126003&fm=27&gp=0.jpg');
    a.setAttribute('alt','你的哈士奇正在路上');
    p3.innerText='我是p3的文本'; //文本添加
    p4.innerText='我是p4的文本';
    p3.setAttribute('class','p2');
    p4.setAttribute('class','p1');
    // alert('获取标签');
    var classc1=document.getElementsByClassName('div1')[0];
    console.log('获取class为div1 的标签',classc1);
    classc1.appendChild(a);
    var classp1=document.getElementsByClassName('p1')[0];
    // 把p3放在classp1的前面
    classc1.insertBefore(p3,classp1);
    var classp2=document.getElementsByClassName('p2')[1];
    // classc1.insertAfter(p3);  据说没有这个方法,要自己写,百度有
    // 21行的情况有点复杂,本来有两个为p2类的。但是26删除了一个,但是执行到这步时候,其实两个值,但是在浏览器的console只能查看一个,所以此时[1]
    console.log(classp2);
    // 删除节点
    classc1.removeChild(p3);
    // 替换节点
    classc1.replaceChild(p4,classp2);
    // 获取文本节点的值
    console.log('classc1.html:',classc1.innerHTML);
    console.log('classc1.innerText:',classc1.innerText);
    // 设置节点的值 不推荐使用
    
    // classc1.innerText='classc1.innerText: 我是div class=div1
    ' +
    //     '
    ' +
    //     '我是在div中的p1 class=p1
    ' +
    //     '
    ' +
    //     '我是p4的文本';
    // classc1.innerHTML='我是div class=div1
    ' +
    //     '    <p class="p1">我是在div中的p1 class=p1</p>
    ' +
    //     '    <p class="p1">我是p4的文本</p>
    ' +
    //     '<img src="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=4083886402,415126003&amp;fm=27&amp;gp=0.jpg" alt="你的哈士奇正在路上">';
    // 属性操作  对于命名的属性 a.标签的src在上面已经设置了,所以可以改
    console.log(classc1.color);
    a.src='https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3184510818,39967754&fm=27&gp=0.jpg';
    //获取值
    var classlocation=document.getElementById('location');
    console.log('classlocation:',classlocation.name);
    //class操作
    var name=p3.className;  //查看节点的类别名
    console.log(name);
    var classpp=document.getElementsByClassName('p1')[0]; //得到是个列表
    classpp.classList.add('p2');//正价类
    console.log('增加之后就有两个类名了:',classpp.className);
    //制定css操作
    
    classlocation.style.margin='10px'; //#将classp1的外边框改了
    classlocation.style.borderColor='red';
    classlocation.style.borderWidth='9px';//.对含有中横线的CSS属性,将中横线后面的第一个字母换成大写即可

    事件

    HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

    常用事件

    onclick        当用户点击某个对象时调用的事件句柄。
    ondblclick     当用户双击某个对象时调用的事件句柄。
    
    onfocus        元素获得焦点。               // 练习:输入框
    onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
    onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(select联动)
    
    onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
    onkeypress     某个键盘按键被按下并松开。
    onkeyup        某个键盘按键被松开。
    onload         一张页面或一幅图像完成加载。
    onmousedown    鼠标按钮被按下。
    onmousemove    鼠标被移动。
    onmouseout     鼠标从某元素移开。
    onmouseover    鼠标移到某元素之上。
    
    onselect      在文本框中的文本被选中时发生。
    onsubmit      确认按钮被点击,使用的对象是form。

     小练习,显示时间

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>shijian</title>
    </head>
    <body>
    <div>时间的设置
        <p><input id="time_content" type="text"  >
        <input id="start"type="submit" value="开始">
        <input id="end" type="submit" value="结束"></p>
    </div>
    <script>
        var now_time;
        function foo1(){
            var day =new Date();
            var time_content=document.getElementById('time_content');
            time_content.value=day.toLocaleString();
            console.log(day.toLocaleString())
        }
        // 开始按钮
        var start_time_content=document.getElementById('start');
        start_time_content.onclick=function (){
            if(now_time===undefined){
                foo1();
                now_time = setInterval(foo1, 1000);
            }
        };
        var end_time_content=document.getElementById('end');
        end_time_content.onclick=function () {
            if(now_time){
            clearInterval(now_time);
            now_time=undefined;
            }
        }
    </script>
    
    </body>
    </html>

    注意:此时千万不要在时间框的父级标签价form标签,因为form标签你的提交及sumbmit有刷新的功能,所以说然后代码就变回了原样。所以一定要记住。废了我太多的时间。

     老师的博客上有关于省份选择的联系,有时间练一下。

  • 相关阅读:
    MS CRM 2011 Field Security Profile
    MS CRM 2011 在CRM中使用REST Endpoint
    如何在报表的Header和Footer中使用DataSet中的Field
    MS CRM 2011 如何获得Option Set的Label与Value
    MS CRM 2011 如何获得当前用户使用的界面语言
    MS CRM 2011 如何创建基于SQL的自定义报表,并使用数据预筛选(PreFiltering)
    MS CRM 2011 与 SharePoint 2010 的集成
    查看服务器的连接数
    ie6,ie7,ie8,ie9 css bug兼容解决记录
    【转】命令行查看Memcached运行状态
  • 原文地址:https://www.cnblogs.com/accolade/p/10657170.html
Copyright © 2011-2022 走看看