day03

A.今天学什么?

1.定时器timer

  • 1.1 setTimeout --> 超时调用
    • 语法:setTimeout(func,time); 时间单位为毫秒,间隔一段时间触发函数,只触发一次
  • 1.2 setInterval -- > 重复调用
    • 语法:setInterval(func,time); 每间隔一段时间触发
// body
<body>
    <script>
        // setTimeout --> 超时调用
        // 语法
        // setTimeout(func,time) 时间单位为毫秒
        // 间隔一段时间触发函数,只触发一次
        setTimeout(function () {
            alert("测试");
        },2000);

        /*
        setInterval -- > 重复调用
        语法
        setInterval(func,time);
        每间隔一段时间触发*/
        setInterval(function () {
            alert("测试")
        },2000)
    </script>
</body>
  • 1.3 使用setTimeout实现setInterval
    • 核心:递归调用
// body
<body>
<script>
    // 使用setTimeout实现setInterval
    // 相当于无限递归
    function go() {
        alert("hello world");
        setTimeout(go,1000);
    }
    go();
</script>
</body>

2.制作一个input框和按钮,输入后,将内容放入ul内

  • 2.1使用方法
    • 获取元素对象
    • onclick事件
    • 对象.value属性 ---> 输入内容
    • 创建元素对象
    • 对象.innerHTML属性 ---> 标签内内容
// body
<body>
    <div>
        <input type="text" id="txt" />
        <button id="add">添加</button>
    </div>
    <ul id="parent">

    </ul>

    <script>
        var txt = document.getElementById("txt");
        var add = document.getElementById("add");
        var parent = document.getElementById("parent");
        add.onclick = function () {
            var value = txt.value;
            // 提交后,将其清空
            txt.value = ""; // value是输入框里的值
            var li = document.createElement("li");
            li.innerHTML = value; // innerHTML是元素内的内容
            console.log(li);
            parent.appendChild(li);
        }
    </script>
</body>

3.DOM获取元素父节点

  • 3.1方法介绍
    • node.parentNode --> 获取父元素(亲爹~),比如 body>ul>li(这里的>代表上下父子关系),li.parentNode,不会获取body,只会获取ul。
// body
<body>
    <div class="parent">
        <p class="child">hello world</p>
    </div>

    <script>
        // node.parentNode --> 获取父元素(亲爹~)
        var p = document.getElementsByClassName("child")[0];
        var parent = p.parentNode;
        console.log(parent);
    </script>
</body>
  • 3.2实例:点击删除,删掉父节点
    • 利用for循环给a标签加上onclick事件
    • 注意a标签内href加#,或者onclick事件最后return false;终止a标签的默认跳转。否则会造成,删除又恢复BUG
// body
<body>
    <ul>
        <li>小米<a href="#">删除</a></li>
        <li>华为<a href="#">删除</a></li>
        <li>苹果<a href="#">删除</a></li>
    </ul>

    <script>
        var shows = document.getElementsByTagName("a");
        for (var i = 0;i <shows.length;i++){
            shows[i].onclick = function () {
                // this指正在执行事件的当前对象
                this.parentNode.style.display = "none";
                // 阻止a标签的默认跳转事件,否则会发生
                // 删掉又恢复了的情况
                // 或者给a标签 href 给一个 #,表示当前页面,不会跳转。
                return false;
            }
        }
    </script>
</body>

4.获取子节点

  • 4.1 childNodes --> 获取所有类型的子节点
    • childNodes --> 获取所有类型的子节点,// <ul id="parent"> // <li>
      // 之间的换行符也会被当成一个文本节点
  • 4.2 children --> 获取所有的元素子节点,IE9以后
    • 只会获取元素节点,不会获取文本节点。IE9之后貌似才支持,所以不要用IE~~
  • 4.3 获取第一个、最后一个子节点
    • firstChild --> 获取第一个子节点
    • lastChild --> 获取最后一个子节点
  • 4.4 获取第一个、最后一个元素子节点
    • firstElementChild --> 获取第一个元素子节点
    • lastElementChild --> 获取最后一个元素子节点
// body
<body>
    <ul id="parent">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>

    <script>
        // childNodes --> 获取所有类型的子节点,
        // <ul id="parent">
        //     <li>
        // 之间的换行符也会被当成一个文本节点
        var parent = document.getElementById("parent");
        var childNodes = parent.childNodes;
        console.log("parent的childNodes长度为"+childNodes.length);
        // nodeType值为1时,是元素节点
        // 文本节点不能设置背景颜色,会报错,所以需要过滤
        for(var i = 0;i < childNodes.length;i++){
            if(childNodes[i].nodeType === 1){
                childNodes[i].style.backgroundColor = "red";
            }
        }


        // children --> 获取所有的元素子节点,IE9以后
        var childs = parent.children;
        console.log("parent的children长度为"+childs.length);


        // firstChild --> 获取第一个子节点
        // lastChild --> 获取最后一个子节点
        var fc = parent.firstChild;
        console.log(fc);
        var lc = parent.lastChild;
        console.log(lc);


        // firstElementChild --> 获取第一个元素子节点
        // lastElementChild --> 获取最后一个元素子节点
        var fec = parent.firstElementChild;
        console.log(fec);
        var lec = parent.lastElementChild;
        console.log(lec);
    </script>
</body>

5.获取兄弟节点

  • 5.1获取兄弟节点--所有类型的节点
    • node.previousSibling -->获取前面的兄弟节点
    • node.nextSibling --> 获取后面的兄弟节点
  • 5.2获取兄弟元素节点
    • node.previousElementSibling --> 获取前面的兄弟元素节点
    • node.nextElementSibling --> 获取后面的兄弟元素节点
// body
<body>
    <div>
        <p>hello world 01</p>
        <p id="test">hello my friend 02</p>
        <p>hello chunjue 03</p>
    </div>

    <script>
        /*node.previousSibling -->获取前面的兄弟节点
        node.nextSibling --> 获取后面的兄弟节点*/
        var test = document.getElementById("test");
        var pSibling = test.previousSibling;
        var nSibling = test.nextSibling;
        console.log("test.previousSibling"+pSibling);
        console.log("test.nextSibling"+nSibling);

        /*node.previousElementSibling --> 获取前面的兄弟元素节点
        node.nextElementSibling --> 获取后面的兄弟元素节点*/
        var peSibling = test.previousElementSibling;
        var neSibling = test.nextElementSibling;
    </script>
</body>

6.offset属性

  • 6.1 特点
    • 只读,无法更改
  • 6.2 获取元素偏移量
    • element.offsetLeft --> 获取元素的左偏移量
    • element.offsetTop --> 获取元素的上偏移量
  • 6.3 获取元素的宽高
    • element.offsetWidth --> 获取元素的宽度
    • element.offsetHeight --> 获取元素的高度
// css
<style>
    *{margin: 0;padding: 0}
    div{
        width: 100px;
        height: 100px;
        background-color: red;
        margin: 100px;
        position: absolute;
        left: 100px;
        padding: 20px;
        border: 10px solid #333;
    }
</style>

// body
<body>
    <div id="test">

    </div>

    <script>
        // 特点:只读属性,无法修改
        var test = document.getElementById("test");
        // element.offsetLeft --> 获取元素的左偏移量
        // element.offsetTop --> 获取元素的上偏移量
        var offL = test.offsetLeft;
        var offT = test.offsetTop;

        // test.offsetLeft = "1000px"; 只读属性,无法修改

        console.log("test.offsetLeft"+offL);
        console.log("test.offsetTop"+offT);

        // element.offsetWidth --> 获取元素的宽度
        // element.offsetHeight --> 获取元素的高度
        var offW = test.offsetWidth;
        var offH = test.offsetHeight;
        // test.offsetWidth = "500px"; 只读属性,无法修改
        console.log("test.offsetWidth"+offW);
        console.log("test.offsetHeight"+offH);
    </script>
</body>

7.属性的操作--Attribute

  • 7.1 设置属性值
    • 设置属性值 --> element.setAttribute("属性名", "属性值");
    • 使用设置属性值的方式来设置样式值
    • test.setAttribute("style","color:red"); style也是属性,内联样式
  • 7.2 获取属性值
    • 获取属性值 --> element.getAttribute("属性名");
    • var cValue = test.getAttribute("class");
  • 7.3 移除属性值
    • 移除属性值 --> removeAttribute("属性名");
    • test.removeAttribute("class");
// body
<body>
    <p id="test" class="one">hello world</p>

    <script>
        // 设置属性值 --> element.setAttribute("属性名", "属性值");
        // 使用设置属性值的方式来设置样式值
        var test = document.getElementById("test");
        test.setAttribute("style","color:red");

        // 获取属性值 --> element.getAttribute("属性名");
        var cValue = test.getAttribute("class");
        console.log(cValue);

        // 将p标签的class设置为two
        test.setAttribute("class","two");
        console.log(test.getAttribute("class"));

        // 移除属性值 --> removeAttribute("属性名");
        test.removeAttribute("class");
    </script>
</body>
  • 7.4 利用设置属性方法,设置鼠标悬停提示
    • title属性,鼠标悬停提示
// body
<body>
    <p id="test">hello chunjue</p>

    <script>
        var test = document.getElementById("test");
        // title属性,鼠标放上去会出现的那种提示
        test.setAttribute("title","title");
    </script>
</body>

8.窗口宽高

  • 8.1 浏览器的宽高 -- 由窗口大小决定
    • window.innerWidth; --> 浏览器宽度
    • window.innerHeight; --> 浏览器高度
  • 8.2 文档元素的宽高 -- 和浏览器一样(目前来看
    • document.documentElement.clientWidth; --> 文档元素宽度
    • document.documentElement.clientHeight; --> 文档元素高度
  • 8.3 对象body的宽高 -- 由内部元素宽高决定
    • document.body.clientWidth; --> 对象body宽度
    • document.body.clientHeight; --> 对象body高度
  • 8.4 获取页面内容的宽高
    • 如果浏览器显示内容小于内部元素宽高,则显示元素的宽高;如果大于内部元素的宽高,则显示浏览器宽高,不同浏览器显示不一样,不必纠结
    • document.documentElement.scrollWidth; --> 页面内容宽度
    • document.documentElement.scrollHeight; --> 页面内容高度
// css
<style>
    *{margin: 0;padding: 0}
    #test{
        height: 300px;
        background-color: red;
    }
</style>

// body
<body>
    <div id="test"></div>

    <script>
        // 浏览器的宽高 -- 由窗口大小决定
        // window.innerWidth --> 浏览器宽度
        // window.innerHeight --> 浏览器高度
        var windowWidth = window.innerWidth;
        var windowHeight = window.innerHeight;
        console.log("浏览器宽度为"+windowWidth);
        console.log("浏览器高度为"+windowHeight);

        // 文档元素的宽高 -- 和浏览器一样
        var dw = document.documentElement.clientWidth;
        var dh = document.documentElement.clientHeight;
        console.log("文档元素的宽度为"+dw);
        console.log("文档元素的高度为"+dh);

        // 对象body的宽高 -- 由内部元素宽高决定
        var bw = document.body.clientWidth;
        var bh = document.body.clientHeight;
        console.log("body的宽度"+bw);
        console.log("body的高度"+bh);

        // 获取页面内容的宽高 -- 如果浏览器显示内容小于内部元素宽高,则显示元素的宽高
        // 如果大于内部元素的宽高,则显示浏览器宽高,不同浏览器显示不一样,不必纠结
        var dsw = document.documentElement.scrollWidth;
        var dsh = document.documentElement.scrollHeight;
        console.log("页面内容的宽为"+dsw);
        console.log("页面内容的高位"+dsh);
    </script>
</body>

9.文档碎片

  • 9.1优点:提高渲染效率
    • document.createDocumentFragment(); --> 创建文档碎片
    • 是一个脱离文档流的碎片,相当于一个缓冲区
    • 相当于一个缓冲区
// body
<body>
    <ul id="parent">

    </ul>
    <button id="btn">btn</button>

    <script>
        // document.createDocumentFragment(); --> 文档碎片,优点:提高渲染效率
        var btn = document.getElementById("btn");
        var parent = document.getElementById("parent");
        // 脱离文档流的碎片,相当于一个缓冲区
        var frame = document.createDocumentFragment();
        btn.onclick = function () {
            for (var i = 0;i < 10;i++){
                var li = document.createElement("li");
                // 利用fragment缓冲,可以提升一定性能。
                frame.appendChild(li);
            }
            parent.appendChild(frame);
        }
    </script>
</body>

10.表格属性

  • 10.1表格属性与获取方法
    • table.tHead --> 获取表格的标题部分
    • table.tBodies --> 获取表格的主体部分,得到的是一个数组,因为表格可能有多个tbody
    • tbody.rows --> 获取tbody每一行tr,得到的也是一个数组
    • rows[n].cells[n] --> 获取第n行tr的第n个单元格td
  • 10.2利用js表格属性完成以下要求
    • 1.标题的背景色变为 #eee
    • 2.tbody下奇数行为 #ff2d51 偶数行为 #44cef6
// css
<style>
    table,td,th{
        border: 1px solid #333;
    }

    table{
        width: 500px;
        border-collapse: collapse;
        line-height: 50px;
        text-align: center;
    }
</style>

// body
<body>
    <table id="table">
        <thead>
            <tr>
                <th>商城</th>
                <th>手机</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>京东商城</td>
                <td>苹果手机</td>
            </tr>
            <tr>
                <td>天猫</td>
                <td>华为手机</td>
            </tr>
            <tr>
                <td>拼多多</td>
                <td>魅族手机</td>
            </tr>
            <tr>
                <td>小米商城</td>
                <td>小米</td>
            </tr>
        </tbody>
    </table>

    <script>
        /*1.标题的背景色变为 #eee
            2.tbody下奇数行为 #ff2d51 偶数行为 #44cef6*/
        var table = document.getElementById("table");
        // table.tHead --> 获取表格的标题部分
        var thead = table.tHead;
        // table.tBodies --> 获取表格的主体部分,得到的是一个数组,因为表格可能有多个tbody
        var tbody = table.tBodies[0];
        // tbody.rows --> 获取tbody每一行tr,得到的也是一个数组
        var rows = tbody.rows;
        // rows[n].cells[n] --> 获取第n行tr的第n个单元格td
        var firstCell = rows[0].cells[0];

        console.log(thead);
        thead.style.backgroundColor = "#eee";

        for (var i = 0;i < rows.length;i++){
            if(i%2 === 0){
                rows[i].style.backgroundColor = "#ff2d51";
            }
            else{
                rows[i].style.backgroundColor = "#44cef6";
            }
        }
        firstCell.innerHTML = "银泰百货";
    </script>
</body>
  • 10.3动态添加表格主体内容
    • 标题 -- 品牌,价格
    • 两个input框分别输入品牌与价格,要求按下按钮,能添加到表格内
// css
<style>
    table{
        border: 1px solid #333;
        width: 500px;
        line-height: 50px;
        border-collapse: collapse;
        text-align: center;
        margin-top: 30px;
    }

    th,td{
        border: 1px solid #333;
    }
</style>

// body
<body>
    <div>
        手机品牌<input type="text" id="phone" />
        价格<input type="text" id="price" />
        <button id="btn">添加</button>
    </div>

    <table id="table">
        <thead>
        <tr>
            <th width="60%">品牌</th>
            <th>价格</th>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td>苹果5</td>
            <td>3000</td>
        </tr>
        </tbody>
    </table>


    <script>
        var btn = document.getElementById("btn");
        var phone = document.getElementById("phone");
        var price = document.getElementById("price");
        var tbody = document.getElementById("table").tBodies[0];

        btn.onclick = function ( ) {
            var tr = document.createElement("tr");
            var td = document.createElement("td");
            td.innerHTML = phone.value;
            tr.appendChild(td);

            var td1 = document.createElement("td");
            td1.innerHTML = price.value;
            tr.appendChild(td1);

            console.log(tr);

            tbody.appendChild(tr);
        }
    </script>
</body>

11.函数function

  • 11.1定义函数的三种方法
    • 1.直接定义函数 --> function funcName(args){方法体},可以在函数定义前就调用,但是不推荐
    • 2.变量声明定义函数 --> var funcName = function(args){方法体},由于js的声明提前,不能在函数定义前调用,不推荐
    • 3.构造函数的方式声明 --> var funcName = new Function("args","方法体"); 第一个参数为参数,第二个为函数表达式--更加不推荐
// body
<body>
    <script>
        // 1.直接定义函数
        function go() {
            console.log("hello world");
        }
        go(); // 在函数定义前面调用也可以,但是不推荐,还是按顺序式调用

        // 2.变量声明定义函数 -- 会造成声明提前,这样的话就不能在定义函数之前调用
        var one = function () {
            console.log("one");
        };
        one();

        // 3.构造函数的方式声明 -- 第一个参数为参数,第二个为函数表达式--更加不推荐
        var two = new Function("two","console.log(two)");
        two("aaa");
    </script>
</body>
  • 11.2 ES6新的定义函数方法--箭头函数
    • 定义方法:var funcName = (args)=>{方法体},ES6的箭头函数,ES5不支持
// body
<body>

    <script>
        var one = function () {
            console.log("one")
        };

        // ES6箭头函数
        var go = ()=>{
            console.log("hello ES6");
        }
        go();

        // 创建一个对象,其中有2个函数。
        var obj = {
            say:function () {
                console.log("say");
            },eat:()=>{
                console.log("eat");
            }
        }
        obj.eat();
    </script>
</body>
  • 11.3 js函数的传参
    • javaScript不同于java,定义函数参数列表有2个参数,但是执行函数时,甚至可以一个参数都不传,因此,javaScript不像java那样支持函数的重载
    • 如果想实现类似函数重载的效果,需要用到javaScript特有的,函数中存在的arguments对象,其中存储了调用函数时传入的参数,然后根据其长度判断执行不同的方法体。
    • 函数内部有一个arguments对象来管理函数传入的参数,然后可以根据arguments的长度来执行方法体
// body
<body>
    <script>
        // js中函数传不定参
        function go(a,b) {
            console.log(a);
            console.log(b);
        }
        go(); // 不会报错,输出NaN
        // 所以js中一般函数不能重载,后面的重名函数会覆盖前面的重名函数

        // js中如何实现重载 使用arguments对象
        // 函数内部有一个arguments对象来管理函数传入的参数,然后可以根据arguments的长度来执行方法体
        function test() {
            console.log(arguments);
            console.log(arguments.length);
        }

        // 做一个重载函数的例子 -- 其实就是根据传入参数长度不同进入不同的if判断
        function testFunc() {
            if (arguments.length === 1){
                console.log(arguments[0]);
            }
            else if (arguments.length === 2){
                console.log(arguments[1]);
            }
            else{
                console.log("hello chunjue");
            }
        }

    </script>
</body>

14.js基本类型和引用类型的区别

  • 14.1 javaScript这两种变量类型的区别,与java差不多
    • 1.基本类型只传值
    • 2.引用类型既传值也传址,两者指向同一个地址
// body
<body>
    <script>
        // 1.基本类型只传值
        // 2.引用类型既传值也传址,两者指向同一个地址
        var a = 10;
        var b = a;
        a = 15;
        console.log(b); // 10
        // 这时候,b还是10,不会随着a的改变而改变,因为基本类型都在栈里面,占据固定内存大小,是直接使用的。

        // var arr1 = arr的时候,是让arr1指向了arr指向的地址,
        // 如果修改该地址的引用类型变量,那么指向该地址的变量的值都会改变
        var arr = [1,2,3];
        var arr1 = arr;
        arr[arr.length] = 4;
        console.log(arr1); // [1,2,3,4]

        // 对象也同理
        var obj = {name:"依然"};
        var yiran = obj;
        obj.age = 21;
        console.log(yiran.age);
    </script>
</body>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 原文 https://www.kancloud.cn/dennis/tgjavascript/241852 一、节...
    LuckyS007阅读 795评论 0 0
  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 3,562评论 0 7
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,360评论 0 0
  • 一、咨询问题定位 小吴,大三学生,专业是物流管理,但是三年学习下来发现自己对此并不感兴趣,所以今后也不希望在本专业...
    呆小五阅读 307评论 0 0
  • 简历部分 最近林林总总收到50,60份想要求职产品经理的应届生的简历,不得不说简历大部分水平都不错,但是每份简历或...
    小麦是产品经理阅读 1,052评论 2 30