• 前端:DOM


    文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。我们最为关心的是,DOM把网页和脚本以及其他的编程语言联系了起来。DOM属于浏览器,而不是JavaScript语言规范里的规定的核心内容。

    一、查找元素

    1、直接查找

    document.getElementById             根据ID获取一个标签
    document.getElementsByName          根据name属性获取标签集合
    document.getElementsByClassName     根据class属性获取标签集合
    document.getElementsByTagName       根据标签名获取标签集合

    :以后设置id,不能以数字开头并且与其他id不能重复,不然会找错

     示例:

    <div>
        <div class="c1">cla1</div>
        <div class="c1" id="i1">
            <div name="n1">n1</div>
            <div name="n1">
                <a>a1</a>
                <a>a2</a>
            </div>
        </div>
        <div class="c1">cla3</div>
    </div>

    这里直接在终端浏览器上进行演示,演示效果图:

    我们找到的分为两类,一类是元素,一类是元素集合。其他的直接查找也是通过这种方法来找,这里就不一一演示了。

    2、间接查找

    包含文本和标签:
    parentNode          // 父节点
    childNodes          // 所有子节点
    firstChild          // 第一个子节点
    lastChild           // 最后一个子节点
    nextSibling         // 下一个兄弟节点
    previousSibling     // 上一个兄弟节点
     
    只包含标签:
    parentElement           // 父节点标签元素
    children                // 所有子标签
    firstElementChild       // 第一个子标签元素
    lastElementChild        // 最后一个子标签元素
    nextElementtSibling     // 下一个兄弟标签元素
    previousElementSibling  // 上一个兄弟标签元素

    示例1:

    <div>
        123
        <div class="c1">cla1</div>
        <div class="c1" id="i1">
            <p>pppppp</p>
            <div name="n1">
                <span>span</span>
            </div>
            <div name="n1">
                <a>a1</a>
                <a>a2</a>
            </div>
        </div>
        <div class="c1">cla3</div>
    </div>

    效果演示图:

    效果演示图2:

    如果nodeType=3,就是文本,如果nodeType=1,就是标签。

    示例2:

    <div>
        <div class="c1">cla1</div>
        <div class="c1" id="i1">
            <p>pppppp</p>
            <div name="n1">
                <span>span</span>
            </div>
            <div name="n1">
                <a>a1</a>
                <a>a2</a>
            </div>
        </div>
        <div class="c1">cla3</div>
    </div>

     效果演示图:

    实例:只获取标签

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div>
            123
            <div class="c1">asdf</div>
            <div class="c1" id="i1">
                <p>p</p>
                <div name="n1">
                    <span>n1</span>
                </div>
                <div name="n2">
                    <a>a1</a>
                    <a>a11111</a>
                </div>
            </div>
            <div class="c1">casdf</div>
        </div>
        <script>
            var i1 = document.getElementById("i1");//id为i1的标签
            var p1_text = i1.parentNode;//含文本,也有标签
            var p1 = i1.parentElement;//不含文本,只有标签
    
            var eles_node = p1_text.childNodes //含文本和所有标签
            for(var j=0;j<eles_node.length;j++){
                var current_node = eles_node[j];
                if(current_node.nodeType == 1){//nodeType==1是标签,nodeType>1是文本
                    console.log(eles_node[j])
                }
            }
            var eles = p1.children;//不含文本所有标签
            for(var i=0;i<eles.length;i++){
                console.log(eles[i])
            }
        </script>
    </body>
    </html>

     结果:

    二、操作

    1、内容

    1 innerText   文本
    2 outerText
    3 innerHTML   HTML内容
    4 outerHTML  
    5 value       值

    示例:

    <body>
        <a href="http://www.baidu.com">hello<span>world</span></a>
        <script>
            var obj = document.getElementsByTagName("a")[0];
            alert(obj.innerText);
            alert(obj.innerHTML);
        </script>
    </body>

    Text效果演示图

    Html效果演示图

    如果要赋值:

    <body>
        <a href="http://www.baidu.com">百度<span>ok</span></a>
        <input id="txt" type="text"/>
        <select id="sel">
            <option value="1">北京</option>
            <option value="2">上海</option>
            <option value="3">广州</option>
        </select>
        <script>
            var obj =document.getElementsByTagName("a")[0];
            obj.innerText = "123"//赋值
            obj.innerHTML = "<p>333</p>"//赋值
        </script>
    
    </body>

    value:可以获取值,也可以设置值。

    <input id="txt" type="text">
    <select id="sel">
        <option value="1">上海</option>
        <option value="2">北京</option>
    </select>

    效果演示图:

    1、文本为空时取值:

    2、文本有值时取值:

    3、赋值:

    获取例子中表单里面的值:

    1、

    2、

    value可操作的标签:input:text、checkbox、radio、password、select、textarea

    其他实例:

    复选框操作:checked=true:选中;checked=false:未选中。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>好吃的</h1>
        <div id="i1">
            <ul>
                <li><input type="checkbox" value="1">芒果</li>
                <li><input type="checkbox" value="2">桂圆</li>
                <li><input type="checkbox" value="3">提子</li>
            </ul>
        </div>
        <div id="i2">
            <ul>
                <li><input type="checkbox" value="11">火锅</li>
                <li><input type="checkbox" value="22">冒菜</li>
                <li><input type="checkbox" value="33">串串</li>
            </ul>
        </div>
    </body>
    </html>

    效果演示图:

    实例:全选、取消、反选

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>全选、取消、反选</title>
    </head>
    <body>
        <h1>今天你想吃什么</h1>
        <div>
            <input type="button" value="全选" onclick="CheckAll();"/>
            <input type="button" value="取消" onclick="CancleAll();"/>
            <input type="button" value="反选" onclick="ReverseAll();"/>
        </div>
        <table>
            <thead>
            <tr>
                <th>序号</th>
                <th>菜名</th>
                <th>价格</th>
            </tr>
            </thead>
            <tbody id="tb">
                <tr>
                    <td><input class="c1" type="checkbox"/></td>
                    <td>火锅</td>
                    <th>188</th>
                </tr>
                <tr>
                    <td><input class="c1" type="checkbox"/></td>
                    <td>冒菜</td>
                    <th>68</th>
                </tr>
                <tr>
                    <td><input class="c1" type="checkbox"/></td>
                    <td>烧烤</td>
                    <th>88</th>
                </tr>
            </tbody>
        </table>
    
        <script>
            function CheckAll() {//全选
                var tb = document.getElementById("tb");
                var checks = tb.getElementsByClassName("c1");
                for(var i=0;i<checks.length;i++){
                    var current_check = checks[i];
                    current_check.checked = true;
                }
            }
    
            function CancleAll() {//取消
                var tb = document.getElementById("tb");
                var checks = tb.getElementsByClassName("c1");
                for(var i=0;i<checks.length;i++){
                    var current_check = checks[i];
                    current_check.checked = false;
                }
            }
    
            function ReverseAll() {//反选
                var tb = document.getElementById("tb");
                var checks = tb.getElementsByClassName("c1");
                for(var i=0;i<checks.length;i++){
                    var current_check =checks[i];
                    if(current_check.checked){//如果选中,就是true
                        current_check.checked = false;//将选中的变为false
                    }else{//如果没有选中,就是false
                        current_check.checked = true;//将没有选中的变为true
                    }
                }
            }
        </script>
    </body>
    </html>
    全选、取消、反选

    实例:单选框

    注:radio要有相同的name才能互斥。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>单选框</title>
    </head>
    <body>
        <div>
            <ul class="radios">
                <li><input type="radio" name="gender" value="11">man</li>
                <li><input type="radio" name="gender" value="22">woman</li>
            </ul>
        </div>
        <script>
            var radios = document.getElementsByTagName("input")
        </script>
    </body>
    </html>

    效果演示图:

     实例:下拉框

    <select id="sel">
        <option value="11">北京</option>
        <option value="22" selected="selected">上海</option>
        <!--selected="selected":默认选中上海-->
        <option value="33">广州</option>
    </select>

    效果演示图:

    1:

     2:

     selectedIndex:

    1:

    2:

    2、属性

    1 attributes                // 获取所有标签属性
    2 setAttribute(key,value)   // 设置标签属性
    3 getAttribute(key)         // 获取指定标签属性
    4  
    5 /*
    6 var atr = document.createAttribute("class");
    7 atr.nodeValue="democlass";
    8 document.getElementById('n1').setAttributeNode(atr);
    9 */

     实例:摸态对话框

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{
                margin: 0;
            }
            .hide{
                display: none;
            }
            .model{
                position: fixed;
                top: 0;
                bottom: 0;
                left: 0;
                right: 0;
                background: rgba(0,0,0,.5);
                z-index: 2;
            }
            .content{
                height: 300px;
                width: 400px;
                background-color: pink;
                position: fixed;
                top: 50%;
                left: 50%;
                margin-top: -150px;
                margin-left: -200px;
                z-index: 3;
            }
        </style>
    </head>
    <body>
        <div style="background-color: palevioletred;height: 1024px">
            <table>
               <tr>
                   <td>1</td>
                   <td>2</td>
                   <td>3</td>
                   <td><input type="button" value="点我" onclick="Show();"></td>
               </tr>
           </table>
            <table>
               <tr>
                   <td>1</td>
                   <td>2</td>
                   <td>3</td>
                   <td><input type="button" value="点我" onclick="Show();"></td>
               </tr>
           </table>
            <table>
               <tr>
                   <td>1</td>
                   <td>2</td>
                   <td>3</td>
                   <td><input type="button" value="点我" onclick="Show();"></td>
               </tr>
           </table>
       </div>
        <div id="2" class="model hide"></div>
        <div id="3" class="content hide">
            <p>用户:<input type="text"></p>
            <p>密码:<input type="password"></p>
            <p>
                <input type="button" value="确定" onclick="Hide()">
                <input type="button" value="取消" onclick="Hide()">
            </p>
        </div>
    
        <script>
            function Show() {
                document.getElementById("2").classList.remove("hide");
                document.getElementById("3").classList.remove("hide");
            }
            function Hide() {
                document.getElementById("2").classList.add("hide");
                document.getElementById("3").classList.add("hide");
            }
        </script>
    </body>
    </html>
    摸态对话框

    给onclick传特殊参数:this。只要鼠标点击this就代指点击的是当前标签

    实例:折叠菜单

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            ul{
                padding: 0;
                margin: 0;
            }
            .hide{
                display: none;
            }
            .menu{
                width: 200px;
                height: 500px;
                background-color: #2459a2;
                border: 2px solid #333;
            }
            .menu .title{
                background-color: brown;
                cursor: pointer;
            }
            .menu .content{
                background-color: white;
            }
        </style>
    </head>
    <body>
        <div class="menu">
            <div class="item">
                <div class="title" onclick="Show(this);">菜单一</div>
                <div class="content">
                    <ul>
                        <li>内容1</li>
                        <li>内容1</li>
                        <li>内容1</li>
                    </ul>
                </div>
            </div>
            <div class="item">
                <div class="title" onclick="Show(this);">菜单二</div>
                <div class="content hide">
                    <ul>
                        <li>内容2</li>
                        <li>内容2</li>
                        <li>内容2</li>
                    </ul>
                </div>
            </div>
            <div class="item">
                <div class="title" onclick="Show(this);">菜单三</div>
                <div class="content hide">
                    <ul>
                        <li>内容3</li>
                        <li>内容3</li>
                        <li>内容3</li>
                    </ul>
                </div>
            </div>
            <div class="item">
                <div class="title" onclick="Show(this);">菜单四</div>
                <div class="content hide">
                    <ul>
                        <li>内容4</li>
                        <li>内容4</li>
                        <li>内容4</li>
                    </ul>
                </div>
            </div>
        </div>
    <script>
        function Show(arg) {
            arg.nextElementSibling.classList.remove("hide");//删除当前点击的div中的hide
            var father = arg.parentElement;//找到当前点击的div的父级
            var sons = father.parentElement.children;//找到所有的item
            for(var i=0;i<sons.length;i++){
                var current_ele = sons[i];//得到循环到哪个菜单
                if(current_ele == father){
    
                }else{
                    current_ele.children[1].classList.add("hide");//找到"content hide"的div
                }
            }
        }
    </script>
    </body>
    </html>
    折叠菜单

    实例:搜索框

    方法一:
    <
    input type="text" placeholder="请输入内容">

    方法二:

    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>万能搜索框</title>
        <style>
            .gg{
                color: gray;
            }
            .bb{
                color: black;
            }
        </style>
    </head>
    <body>
        <input type="text" class="gg" value="请输入内容" onfocus="Touch(this);" onblur="Move(this);"/>
        <script>
            function Touch(ths) {
                ths.className = "bb";
                var current_val = ths.value;//通过点击标签获得value值
                if (current_val == "请输入内容"){//判断点击后如果文本框里面值是:请输入内容
                    ths.value = "";//赋值一个空值给value
                }
            }
            function Move(ths) {
                var current_val = ths.value;//鼠标离开文本框时文本框里面的值
                if (current_val =="请输入内容" || current_val.trim().length == 0){//判断鼠标离开后文本框内容如果是用户自己输入:请输入内容,或者是空格,或者是空
                    ths.value = "请输入内容";//就重新赋值
                    ths.className = "gg";//复制后将字体颜色变成灰色
                }
            }
        </script>
    </body>
    </html>

    onfocus:当鼠标获取焦点时,通俗来将就是鼠标点入搜索框时,鼠标在闪动并且边框也改变了颜色。

    onblur:当鼠标离开搜索框时可以执行某个函数

    实例:自定义属性操作

     将自定义属性进行操作后,改变原来的文本内容

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>自定义属性</title>
    </head>
    <body>
        <input type="button" onclick="Func();" value="点点点"/>
        <div id="i1">
            <div class="c1">111</div>
            <div class="c1" abc="222">111</div>
            <div class="c1">111</div>
            <div class="c1" abc="222">111</div>
            <div class="c1">111</div>
            <div class="c1" abc="222">111</div>
        </div>
    
        <script>
            function Func() {
                var i1 = document.getElementById("i1");//找到id
                var divs = i1.children;//找到所有的孩子
                for(var i=0;i<divs.length;i++){//循环所有的孩子
                    var current_div = divs[i];//获取索引
                    var result = current_div.getAttribute("abc");//找到索引对应的标签的属性
                    if(result == "222"){//如果属性的值等于222
                        current_div.innerText = "222";//将此标签的内容重新赋值
                    }
                }
            }
        </script>
    </body>
    </html>

    效果演示图:

    1:

    2:

    3、class操作

    1 className                // 获取所有类名
    2 classList.remove(cls)    // 删除指定类
    3 classList.add(cls)       // 添加类
    1 以字符串形式呈现:obj.getElementById("...").className
    2 以列表形式呈现:obj.getElementById("...").classList
    3 删除属性:obj.getElementById("...").classList.remove("....")
    4 添加属性:obj.getElementById("...").classList.add("....")

    示例:

    <select id="sel">
        <option value="1">北京</option>
        <option value="2">上海</option>
        <option value="3">广州</option>
    </select>

    效果演示图:

    实例:Tab菜单

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            ul{
                list-style: none;
                padding: 0;
                margin: 0;
            }
            ul li{
                float: left;
                background-color: paleturquoise;
                color: white;
                padding: 8px 10px;
            }
            .clearfix:after{
                display: block;
                content: '.';
                height: 0;
                visibility: hidden;
                clear: both;
            }
            .hide{
                display: none;
            }
            .tab-menu .title{
                background-color: #dddddd;
            }
            .tab-menu .title .active{
                background-color: white;
                color: black;
            }
            .tab-menu .content{
                border: 1px solid #dddddd;
                min-height: 150px;
            }
        </style>
    </head>
    <body>
        <div style=" 600px;margin: 0 auto">
            <div class="tab-menu">
                <div class="title clearfix">
                    <ul>
                        <li target="11" class="active" onclick="Show(this);">火锅配料</li>
                        <li target="33" onclick="Show(this);">冒菜配料</li>
                        <li target="22" onclick="Show(this);">烧烤配料</li>
                    </ul>
                </div>
                <div id="cc" class="content">
                    <div con="11">牛油、醪糟...</div>
                    <div con="22" class="hide">孜然、花椒粉...</div>
                    <div con="33" class="hide">豆瓣、大蒜...</div>
                </div>
            </div>
        </div>
    
        <script>
            function Show(ths) {
                var tsrget = ths.getAttribute("target");
                ths.className = "active";//给点击到的标签赋值class
                var brothers = ths.parentElement.children;//获取兄弟标签
                for(var i=0;i<brothers.length;i++){
                    if(ths == brothers[i]){//如果循环到自己,就不做操作
    
                    }else{//如果循环到其他,就移除class属性
                        brothers[i].removeAttribute("class");
                    }
                }
                //操作内容
                var contents = document.getElementById("cc").children;//获取内容div的子级
                for(var j=0;j<contents.length;j++){//循环子级
                    var current_content = contents[j];//得到循环到的某一子级
                    var con = current_content.getAttribute("con");//获取con属性的值
                    if(con == tsrget){//如果con值和点击到标签的属性值一样
                        current_content.classList.remove("hide");//去除hide属性
                    }else{//如果不一样
                        current_content.className = "hide";//添加hide属性
                    }
                }
            }
        </script>
    </body>
    </html>
    Tab菜单

    效果演示图:

    1:

    2:

    4、标签操作

    a、创建标签

    1 // 方式一
    2 var tag = document.createElement('a')
    3 tag.innerText = "wupeiqi"
    4 tag.className = "c1"
    5 tag.href = "http://www.cnblogs.com/wupeiqi"
    6  
    7 // 方式二
    8 var tag = "<a class='c1' href='http://www.cnblogs.com/wupeiqi'>wupeiqi</a>"

     

    b、操作标签

     1 // 方式一
     2 var obj = "<input type='text' />";
     3 xxx.insertAdjacentHTML("beforeEnd",obj);
     4 xxx.insertAdjacentElement('afterBegin',document.createElement('p'))
     5  
     6 //注意:第一个参数只能是'beforeBegin'、 'afterBegin'、 'beforeEnd'、 'afterEnd'
     7  
     8 // 方式二
     9 var tag = document.createElement('a')
    10 xxx.appendChild(tag)
    11 xxx.insertBefore(tag,xxx[1])

    beforeBegin:在<ul>上部添加

    beforeEnd:在<li>的末尾添加

    afterEnd:在<ul>的外部末尾添加

    afterBegin:在<li>内部开头添加

    实例:创建标签并插入标签

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>添加列表</title>
    </head>
    <body>
        <div>
            <h1>添加您知道的美食</h1>
            <input type="text"/>
            <input type="button" value="添加" onclick="Addcon(this);"/>
        </div>
        <div>
            <ul id="content">
                <li>大宅门火锅</li>
                <li>老妈兔头</li>
            </ul>
        </div>
        <script>
            function Addcon(ths) {
                var val = ths.previousElementSibling.value;//获取输入的值
                ths.previousElementSibling.value = "";//获取值后,将内容复制为空
                var contentList = document.getElementById("content");//获取列表
    //            //第一种添加形式:字符串方式
    //            var str = "<li>" + val + "</li>";//将获取到的值和标签进行组合
    //            contentList.insertAdjacentHTML("beforeEnd",str);//将组合好的字符串添加到列表中
    
    //            //第二种添加形式:元素方式(推荐)
                var tag = document.createElement("li");//创建一个要添加的标签
                tag.innerText = val;//将输入的值赋值
                contentList.appendChild(tag);//添加到列表中
                contentList.insertBefore(tag,contentList.children[1]);//添加到制定索引位置
    
    //            //扩展:添加子标签
    //            var tag = document.createElement("li");//创建一个要添加的标签
    //            tag.innerText = val;//将输入的值赋值
    //            var temp = document.createElement("a");
    //            temp.innerText = "百度";
    //            temp.href = "http://baidu.com";
    //            tag.appendChild(temp);
    //            contentList.insertBefore(tag,contentList.children[1]);//添加到制定索引位置
            }
        </script>
    </body>
    </html>
    创建标签并插入标签

    实例:标签操作之移动

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>添加列表实例</title>
    </head>
    <body>
        <h2 id="h2">222
            <a>a</a>
            <span>s</span>
        </h2>
        <div id="content">
            <div class="item">1</div>
            <div class="item">1</div>
        </div>
        <script>
            var h = document.getElementById("h2");//获取id=h2标签
            var c = document.getElementById("content");//获取id=content标签
            c.appendChild(h);//直接将h2标签和内容全部移到id=content标签里面
        </script>
    </body>
    </html>

    效果演示图:

    实例:标签操作之克隆(拷贝、复制)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>添加列表实例</title>
    </head>
    <body>
        <h2 id="h2">222
            <a>a</a>
            <span>s</span>
        </h2>
        <div id="content">
            <div class="item">1</div>
            <div class="item">1</div>
        </div>
        <script>
            var h = document.getElementById("h2");//获取id=h2标签
            var c = document.getElementById("content");//获取id=content标签
            //克隆:.cloneNode(true)
            var newH = h.cloneNode(true);//cloneNode(true)加true表示h2标签里所有的内容都克隆,不加就表示只拷贝h2标签而里面文本和其他标签都没有拷贝
            c.appendChild(newH);
        </script>
    </body>
    </html>

    效果演示图:

    实例:返回顶部

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>返回顶部实例</title>
        <style>
            .go-top{
                background-color: palevioletred;
                position: fixed;
                width: 40px;
                height: 40px;
                right: 20px;
                bottom: 10px;
            }
            .hide{
                display: none;
            }
            a{
                text-decoration: none;
                color: palegoldenrod;
            }
        </style>
    </head>
    <body onscroll="Func();"><!--onscroll:只要滑动滚动条就会执行这个函数-->
        <div id="i1" style="height: 2000px">
            <h1>顶部</h1>
        </div>
        <div id="i2" class="go-top hide">
            <a href="javascript:void (0);" onclick="GoTop();">返回顶部</a>
            <!--href="javascript:void (0)"返回顶部时上不刷新(直接写Href是刷新)。也可以这样写:href="#"-->
        </div>
        <script>
            function Func() {
                var scrolltop = document.body.scrollTop;//获取滚动条距离顶部的距离
                var ii = document.getElementById("i2");
                if(scrolltop>10){  //判断滚动条距离顶部的距离大于10的时候
                    ii.classList.remove("hide");  //就将隐藏属性去掉
                }else{
                    ii.classList.add("hide");  //判断滚动条距离顶部的距离小于10的时候,就将隐藏属性加上
                }
            }
            function GoTop() {
                document.body.scrollTop = 0;//滚动条赋值为0,就返回到顶部
            }
        </script>
    </body>
    </html>
    返回顶部

    5、样式操作

    注意backgroundColor的写法

    1 var obj = document.getElementById('i1')
    2  
    3 obj.style.fontSize = "32px";
    4 obj.style.backgroundColor = "red";

    6、位置操作

     1 总文档高度
     2 document.documentElement.offsetHeight
     3   
     4 当前文档占屏幕高度
     5 document.documentElement.clientHeight
     6   
     7 自身高度
     8 tag.offsetHeight
     9   
    10 距离上级定位高度
    11 tag.offsetTop
    12   
    13 父定位标签
    14 tag.offsetParent
    15   
    16 滚动高度
    17 tag.scrollTop
    18  
    19 /*
    20     clientHeight -> 可见区域:height + padding
    21     clientTop    -> border高度
    22     offsetHeight -> 可见区域:height + padding + border
    23     offsetTop    -> 上级定位标签的高度
    24     scrollHeight -> 全文高:height + padding
    25     scrollTop    -> 滚动高度
    26     特别的:
    27         document.documentElement代指文档根节点
    28 */

    示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>scrollheight</title>
    </head>
    <body style="margin: 0">
        <div style="height: 20px;background-color: green;"></div>
        <div style="border: 5px solid pink;padding: 10px;">
            <div>
                <div id="xo" style="height: 200px;overflow: auto; 400px;margin: 0 auto;border: 15px solid red;padding: 3px;" >
                    <div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div>
                    <div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div>
                    <div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div>
                    <div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div><div>sdf</div>
                </div>
            </div>
        </div>
        <script>
            var i =document.getElementById("xo");
            console.log(i.scrollTop); //红色框内滚动条离滚动条顶部的位置:...
            console.log(i.scrollHeight); //红色框内整个文档内部的总高度+padding(上和下)
            console.log(i.clientTop); //红色边框高度:15
            console.log(i.clientHeight); //可见文档范围的高度:可见文本范围自身+padding(上和下)
            console.log(i.offsetTop); //当前标签距离顶部的高度:height: 20px+border: 5px+padding: 10px
            console.log(i.offsetHeight); //可见文档范围的高度:可见文本范围自身+padding(上和下)+border(上和下)
        </script>
    </body>
    </html>

    offsetTop:距离顶部的高度,这个距离顶部的前提是当前标签的父标签没有出现position,如果当前标签父级出现position,就是当前标签距离父级标签的距离

    实例:定位菜单

      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4     <meta charset="UTF-8">
      5     <title>定位菜单实例</title>
      6     <style>
      7         body{
      8             margin: 0;
      9             background-color: #dddddd;
     10         }
     11         .pg-header{
     12             background-color: black;
     13             color: white;
     14             height: 48px;
     15         }
     16         .pg-body .menu{
     17             position: absolute;
     18             left: 200px;
     19             width: 180px;
     20             background-color: white;
     21             float: left;
     22         }
     23         .pg-body .menu .active{
     24             background-color: darkslateblue;
     25             color: white;
     26         }
     27         .pg-body .fixed{
     28             position: fixed;
     29             top: 5px;
     30         }
     31         .pg-body .content{
     32             position: absolute;
     33             left: 385px;
     34             right: 200px;
     35             background-color: white;
     36             float: left;
     37         }
     38         .pg-body .content .item{
     39             height: 900px;
     40         }
     41     </style>
     42 
     43 </head>
     44 <body onscroll="Hua();">
     45     <div class="pg-header"></div>
     46     <div class="pg-body">
     47         <div id="menu" class="menu">
     48             <ul>
     49                 <li>第一章</li>
     50                 <li>第二章</li>
     51                 <li>第三章</li>
     52             </ul>
     53         </div>
     54         <div id="content" class="content">
     55             <div class="item">床前明月光</div>
     56             <div class="item">疑是地上霜</div>
     57             <div class="item">我是郭德纲</div>
     58         </div>
     59     </div>
     60     <script>
     61         function Hua() {
     62             var a = document.body.offsetHeight;//获取body的自身总高度
     63             var b = document.getElementById("content").offsetHeight;//获取内容的总高度
     64             var c = document.documentElement.clientHeight;//获取可见范围的高度(窗口高度)
     65             var huaGao = document.body.scrollTop;//获取滑动的高度
     66             var caiDan = document.getElementById("menu");//获取菜单并赋值
     67             if(huaGao>48){//判断滑动距离大于48
     68                 caiDan.classList.add("fixed");//将菜单栏固定住
     69             }else{//如果滑动距离小于48
     70                 caiDan.classList.remove("fixed");//将菜单栏固定功能去掉
     71             }
     72             var items = document.getElementById("content").children;//获取内容
     73             for(var i=0;i<items.length;i++) {//循环获取的每个内容
     74                 var currentItem = items[i];//获取索引对应的值
     75                 var currentItemBodyTop = currentItem.offsetTop + currentItem.offsetParent.offsetTop;//获取当前标签离body顶部的距离
     76                 var currentItemWindowTop = currentItemBodyTop - huaGao;//距离浏览器顶部高度减去滑动距离
     77 //                console.log(currentItemWindowTop);
     78                 var currentHeight = currentItem.offsetHeight;//当前文档高度
     79                 var bottomHeight = currentItemBodyTop + currentHeight;//文档底部有多高(自身的高度+顶部离body的高度)
     80 
     81                 if((a+b)==(huaGao+c)){//实现第三章内容高度不够划过顶部时的效果
     82                     var mu = document.getElementById("menu").children[0].lastElementChild;
     83                     var lis = document.getElementById("menu").getElementsByTagName("li");
     84                     for(var m=0;m < lis.length;m++){
     85                         var current_list = lis[m];
     86                         if (current_list.getAttribute("class") == 'active'){
     87                             current_list.classList.remove("active");
     88                             break
     89                         }
     90                     }
     91                     mu.classList.add("active");
     92                     return
     93                 }
     94                 
     95                 if(currentItemWindowTop<0 && huaGao<bottomHeight){//实现每一章内容划过顶部然后菜单栏出现对应的效果
     96                     var ziji = caiDan.getElementsByTagName("li")[i];
     97                     ziji.className = "active";//将对应的菜单加上active属性
     98                     var lis = caiDan.getElementsByTagName("li");
     99                     for(var j=0;j<lis.length;j++){
    100                         if(ziji == lis[j]){
    101 
    102                         }else {
    103                             lis[j].classList.remove("active")
    104                         }
    105                     }
    106                     break;
    107                 }
    108             }
    109         }
    110     </script>
    111 </body>
    112 </html>
    定位菜单

    7、提交表单

    document.geElementById('form').submit()

     示例:

    <body>
    
    <!--提交表单,可以用button替代submit,只要定义一个事件就可以。action提交到哪里,method提交方式-->
        <form id="f" action="http://www.sogou.com/web?" method="get">
            <input name="query" type="text">
            <input type="button" onclick="SubmitForm();" value="提交">
        </form>
        <script>
            function SubmitForm() {
                document.getElementById("f").submit();
            }
        </script>

    8、其他操作

     1 console.log                 输出框
     2 alert                       弹出框
     3 confirm                     确认框
     4   
     5 // URL和刷新
     6 location.href               获取当前页面URL
     7 location.href = "url"       重定向(跳转到制定url页面)
     8 location.reload()           重新加载
     9   
    10 // 定时器
    11 setInterval                 多次定时器
    12 clearInterval               清除多次定时器
    13 setTimeout                  单次定时器(只执行一次就不执行了)
    14 clearTimeout                清除单次定时器

    示例:

    1 <input type="button" value="confirm" onclick="Firm();">
    2  <script>
    3         function Firm() {//弹框显示confirm内容
    4             var r = confirm("hello");//接收返回值
    5             console.log(r);//如果点击确定返回true,如果点取消返回false
    6         }
    7 </script>

    实例:定时器

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>其他操作</title>
     6 </head>
     7 <body>
     8 
     9 <!--提交表单,可以用button替代submit,只要定义一个onclick事件就可以。action提交到哪里,method提交方式-->
    10     <form id="f" action="http://www.sogou.com/web?" method="get">
    11         <input type="button" value="Interval" onclick="Interval();">
    12         <input type="button" value="StopInterval" onclick="StopInterval();">
    13 
    14     </form>
    15 
    16     <script>
    17         function Interval() {
    18             s1 = setInterval(function () {//function ()匿名函数.setInterval相当于一个定时器,没隔制定时间执行匿名函数
    19                 console.log("s1");
    20             },1000);
    21             s2 = setInterval(function () {
    22                 console.log("s2");
    23             },2000);
    24             console.log(1);
    25         }
    26         function StopInterval() {
    27             clearInterval(s1);//让s1定时器停止。s1是全局变量
    28         }
    29     </script>
    30 </body>
    31 </html>
    定时器

    定时器之删除和保留

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>定时器之删除</title>
     6 </head>
     7 <body>
     8     <div>
     9         <input type="button" value="delete" onclick="Delete();" />
    10         <input type="button" value="keep" onclick="UnDelete();" />
    11         <div id="status"></div>
    12     </div>
    13     <script>
    14         function Delete() {
    15             document.getElementById("status").innerText="已删除";//给id为status赋值内容
    16             t1 = setTimeout(ClearStatus,5000);//5秒后执行一次ClearStatus函数
    17         }
    18         function ClearStatus() {
    19             document.getElementById("status").innerText="";
    20         }
    21         function UnDelete() {
    22             clearTimeout(t1);//清除单次定时器
    23         }
    24     </script>
    25 </body>
    26 </html>

    作用域补充(一):

    强烈推荐武大神绝世经典好博客:http://www.cnblogs.com/wupeiqi/p/5649402.html

    JS里面没有块级作用域,只有函数作用域。一个函数就是一个作用域。

    JS在定义时已经创建了作用域链,之后按照作用域链来执行。

    示例:

     1     <script>
     2         function func() {
     3             for(var i=0;i<3;i++){//当i等于2,自增一为3,此时i=3,再判断时已不满足条件,所以i等于3
     4                 setInterval(function () {//一次生成3个计时器
     5                     console.log(i);//一次输出3个3
     6                 },1000);
     7             }
     8         }
     9         func();
    10     </script>

    示例:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>作用域</title>
     6 </head>
     7 <body>
     8     <div id="inp">
     9         <input type="button" value="1">
    10         <input type="button" value="2">
    11         <input type="button" value="3">
    12     </div>
    13     <script>
    14         var btns = document.getElementById("inp").children;
    15         for(var j=0;j<btns.length;j++){
    16             var current_input = btns[j];//当前input标签
    17             current_input.onclick = function () {
    18                 alert(j);//alert:3
    19             }
    20         }
    21         //当for循环执行完之后j=3
    22     </script>
    23 </body>
    24 </html>

    Pthon中作用域链和JS是一样的。

    示例:

    li = []
    for i in range(10):
        li.append(lambda: i)
    # print(i)
    print(li)
    print(li[0]())
    print(li[1]())

    示例:

    li = [lambda :x for x in range(9)]
    print(li)
    print(li[0])
    print(li[0]())

    示例:

    li = [x for x in range(9)]
    print(li)
    #打印结果:[0, 1, 2, 3, 4, 5, 6, 7, 8]

    示例:

    li = [x+10 for x in range(9) if x > 5]
    print(li)
    #打印结果:[16, 17, 18]

    三、事件

     

    对于事件需要注意的要点:

    • this
    • event
    • 事件链以及跳出
    • 默认事件和自定义事件

    this触发当前事件的标签;event触发当前标签的事件的内容(可监听键盘按键:keyCode)。

    注册事件的方式:

    方式一:
    <div 事件名="函数名()"></div>
    
    
    方式二:
    docuement.get......事件名 = function()

    事件绑定示例:

    1     <div onmouseover="Func(this);" onmouseout="Out(this);">123</div>
    2     <script>
    3         function Func(self) {//self表示形参,当前绑定事件参数是this,就表示鼠标移动到当前div
    4             self.style.color = "red";
    5         }
    6         function Out(ths) {//鼠标移动开之后绑定该事件
    7             ths.style.color = "black";
    8         }
    9     </script>

    默认事件和自定义事件:

    注:自定义事件优先于默认事件

    1  <a href="http://www.baidu.com" onclick="return Func();">走你</a>
    2     <script>
    3         function Func() {
    4             alert("确定要跳转到百度首页吗?");
    5             return true;
    6         }
    7     </script>

    注:如果Submitform()里面return false,默认事件就不执行;如果return true,就会执行默认事件

    示例:

     1 <form action="http://www.sogou.com/web?">
     2         <div id="form1">
     3             <input type="text">
     4         </div>
     5         <input type="submit" value="提交" onclick="return Submitform();">
     6         <!--如果Submitform()里面return false,默认事件就不执行;如果return true,就会执行默认事件-->
     7     </form>
     8 
     9     <script>
    10         function Submitform() {
    11             var inputs = document.getElementById("form1").getElementsByTagName("input");//获取input标签
    12             for(var i=0;i<inputs.length;i++){//循环
    13                 var currentInput = inputs[i];//获取循环到的input标签
    14                 var val = currentInput.value;//取值
    15                 if(val.trim().length == 0){//判断将值去除空格,并且长度等于0
    16                     alert("请输入内容");
    17                     return false;
    18                 }
    19             }
    20             return true;
    21         }
    22     </script>
  • 相关阅读:
    ceph pool 管理
    python 创建一个实例:步骤二 添加行为方法,编写方法
    python 创建一个实例:步骤一 编写一个构造函数
    Ceph集群rbd-mirror A、B区域备份实施方案
    python 函数中的递归、lambda 、map reduce 等详解
    reduce python 的用法
    python 搜集参数的共有项和所有项
    argument python 参数 举例
    The Preliminary Contest for ICPC Asia Nanjing 2019 A The beautiful values of the palace(树状数组+思维)
    hdu 4614 Vases and Flowers(线段树+二分)
  • 原文地址:https://www.cnblogs.com/0820-zq/p/5651768.html
Copyright © 2020-2023  润新知