2019-06-08 webapi第四天

01appendChild的细节

<!--

        appendChild:给某个元素添加一个子元素,添加到最后

                我们昨天搭配 document.createElement使用的

        细节:

            如果用appendChild添加的是一个已经存在的子元素,那么都相当于是移动到这个父元素的最后

    -->

</head>

<body>

    <input type="button" value="创建新的li添加到第一个ul" id="btn1">

    <input type="button" value="找到li3再重新加到ul1" id="btn2">

    <input type="button" value="找到li3再添加到ul2" id="btn3">

    <input type="button" value="创建新的li添加到两个ul里" id="btn4">

    <ul id="ul1">

        <li>隔壁老王1</li>

        <li>隔壁老王2</li>

        <li id="li3">隔壁老王3</li>

        <li>隔壁老王4</li>

        <li>隔壁老王5</li>

    </ul>

    <ul id="ul2">

        <li>隔壁老周1</li>

        <li>隔壁老周2</li>

        <li>隔壁老周3</li>

        <li>隔壁老周4</li>

        <li>隔壁老周5</li>

    </ul>

    <script>

        // 找到ul1

        var ul1 = document.getElementById('ul1');

        // 找到li3

        var li3 = document.getElementById('li3');

        // 找到ul2

        var ul2 = document.getElementById('ul2');

        // 第一个按钮的点击事件

        document.getElementById('btn1').onclick = function(){

            // 新的空li标签

            var li = document.createElement('li');

            li.innerHTML = "我是新的li";

            ul1.appendChild(li);

        }

        // 第二个按钮的点击事件

        document.getElementById('btn2').onclick = function(){

            ul1.appendChild(li3);

        }

        // 第三个按钮的点击事件

        document.getElementById('btn3').onclick = function(){

            ul2.appendChild(li3);

        };

        // 第四个按钮的点击事件

        document.getElementById('btn4').onclick = function(){

            var li = document.createElement('li');

            li.innerHTML = "这是一个寂寞的天,下着有些猥琐的雨";


            // 这是第一次添加,确实添加过去了

            ul1.appendChild(li);

            // 但是第二次添加时,相当于已经存在了,那么只是移动到第二个ul身上

            ul2.appendChild(li);

        }

    </script>

02水果选择案例

  <!-- multiple:多选

        因为下拉框默认为单选,所以给一个multiple就能变成多选的形式

    -->

    <select id="selLeft" multiple>

        <option>苹果</option>

        <option>香蕉</option>

        <option>鸭梨</option>

        <option>荔枝</option>

        <option>水蜜桃</option>

        <option>菠萝</option>

        <option>黑凤梨</option>

        <option>西瓜</option>

    </select>

    <!-- g:greater  t:than  加在一起就是大于的意思 -->

    <button id="btn1"> &gt;&gt; </button>

    <button id="btn2"> &lt;&lt; </button>

    <button id="btn3"> &gt; </button>

    <button id="btn4"> &lt; </button>

    <select id="selRight" multiple>


    </select>

    <script>

        // 找到左边下拉框

        var selLeft = document.getElementById('selLeft');

        // 找到右边下拉框

        var selRight = document.getElementById('selRight');

        // 给第一个按钮加点击事件

        // 把左边的所有内容全部移动到右边去

        document.getElementById('btn1').onclick = function(){

            // 把左边的所有内容赋值给右边 ,如果用=会把右边原来的部分都覆盖掉

            // 所以记得要用+=,在原来有值的基础上再加一些值

            selRight.innerHTML += selLeft.innerHTML;

            // 把左边内容清空

            selLeft.innerHTML = "";


        }

        // 第二个按钮点击事件,把右边的内容全部移动到左边去

        document.getElementById('btn2').onclick = function(){

            selLeft.innerHTML += selRight.innerHTML;

            selRight.innerHTML = "";

        }

        // 把左边选择的部分移动到右边去

        document.getElementById('btn3').onclick = function(){


            for(var i = 0; i < selLeft.children.length;){

                // == true可以省略,因为selected本身就是返回bool值

                // selLeft.children[i]这个是每个option标签

                if( selLeft.children[i].selected == true ){

                    // 如果选中了,就不要i++

                    // 代表下标不要变,因为选中了会移动过去,后面的会变成当前的下标

                    selRight.appendChild( selLeft.children[i] );


                }else{

                    // 代表没选中,没选中,就要i++,然后进入到下一个元素

                    i++;

                }

            }

        }

        // 把右边选择的部分移动到左边去

        document.getElementById('btn4').onclick = function(){

            // 遍历右边的子元素

            for(var i = 0; i < selRight.children.length; ){

                if( selRight.children[i].selected == true ){

                    selLeft.appendChild( selRight.children[i] );

                }else{

                    i++;

                }

            }

        }

    </script>

03 createElement创建元素效率高而且不会覆盖事件

<script>

        // 找到div

        var box = document.getElementById('box');

        var sp = document.getElementById('sp');

        sp.onclick = function(){

            alert('sp');

        }

        // 按钮的点击事件

        document.getElementById('btn').onclick = function(){

            for(var i = 0; i < 10000; i++){

                var p = document.createElement('p');

                p.innerHTML = "我是p标签";

                // 添加到box里

                box.appendChild(p);

            }

        }

    </script>

04获取下一个兄弟节点和下一个兄弟元素

<!--

        nextSibling:

            找到下一个兄弟节点:文本、注释、标签

        nextElementSibling:

            找到下一个兄弟元素:只找到标签

            但是如果后面没有兄弟标签得到null

            IE8和之前的浏览器不支持

    -->

</head>

<body>

    <ul>

        <li>隔壁老王1</li>

        <li>隔壁老王2</li>

        <li id="li3">隔壁老王3</li>

        <li>隔壁老王4</li>

        <li id="li5">隔壁老王5</li>

    </ul>

    <script>

        // 找到li3

        var li3 = document.getElementById('li3');

        // 找到下一个兄弟节点:包括文本、注释、标签

        // console.log(li3.nextSibling);

        // 找到下一个兄弟元素,只会找到标签

        // console.log(li3.nextElementSibling);

        // 隔壁老王5

        // console.log(li3.nextElementSibling.nextElementSibling);

        // null

        // console.log(li3.nextElementSibling.nextElementSibling.nextElementSibling);

        // 就是要你找到下一个兄弟元素,而且要兼容所有浏览器

        // 思想:nextSibling没有兼容问题,那我们用它就行了

        // 但是如果用它可能找到的不一定是标签

        // 找到一个先判断一下是不是标签,如果是就找到了,如果不是,继续往下找

        // console.log( li3.nextSibling);

        // 找li3的下一个兄弟节点

        // var node = li3.nextSibling;

        // // 只要不等于1,代表不是标签,就会继续找下一个

        // while(node.nodeType != 1){

        //    // 继续找它下一个

        //    node =  node.nextSibling;

        // }

        // // 能出循环,就代表==1了,也就是找到标签了

        // console.log(node);

        // var li5 = document.getElementById('li5');

        // var node = li3.nextSibling;

        // // 节点不为null,并且节点不为1,都要继续找下一个

        // while (node != null && node.nodeType != 1) {

        //    node = node.nextSibling;

        // }

        // // 要么找到null,要么找到标签

        // console.log(node);

        /*

            一段代码好多地方要用,封装成函数

            步骤:声明一个函数。直接把代码复制进来作为函数体

                把不能写死的数据当形参传入

        */

        function getNextElement(ele) {

            var node = ele.nextSibling;

            // 节点不为null,并且节点不为1,都要继续找下一个

            while (node != null && node.nodeType != 1) {

                node = node.nextSibling;

            }

            // 要么找到null,要么找到标签

            // console.log(node);

            return node;

        }

        var res1 = getNextElement(li5);

        var res2 = getNextElement(li3);

        console.log(res1);

        console.log(res2);

        05获取上一个兄弟节点和上一个兄弟元素

  <!--

        previousSibling

                找到上一个兄弟节点

                所有浏览器都支持

        previousElementSibling

                找到上一个兄弟元素

                这个IE8和之前浏览器不支持

    -->

</head>

<body>

    <ul>

        <li id="li1">隔壁老王1</li>

        <li>隔壁老王2</li>

        <li id="li3">隔壁老王3</li>

        <li>隔壁老王4</li>

        <li>隔壁老王5</li>

    </ul>

    <script>

        var li3 = document.getElementById('li3');

        // // 找到上一个兄弟节点:包括文本、注释、标签

        // console.log(li3.previousSibling);

        // // 找到上一个兄弟元素:只找到标签

        // console.log(li3.previousElementSibling);

        // // 隔壁老王1

        // console.log(li3.previousElementSibling.previousElementSibling);

        // // null

        // console.log(li3.previousElementSibling.previousElementSibling.previousElementSibling);

        // var li1 = document.getElementById('li1');

        // var node = li1.previousSibling;

        // while( node != null && node.nodeType != 1){

        //    node = node.previousSibling;

        // }

        // console.log(node);

        function getPrevElement(ele) {

            var node = ele.previousSibling;

            while (node != null && node.nodeType != 1) {

                node = node.previousSibling;

            }

            return node;

        }

        var res1 = getPrevElement(li1);

        var res2 = getPrevElement(li3);

        console.log(res1);

        console.log(res2);

06祝福墙案例

<!--

        ondblclick

            双击事件

    -->

    <style>

        * {

            margin: 0;

            padding: 0;

        }

        body {

            background: url("images/bg.gif");

            font: 12px "simsun";

        }

        .content {

            width: 960px;

            height: 627px;

            margin: 0 auto;

            background: url("images/content_bg.jpg");

            /* 为了让子元素相对于它来定位 */

            position: relative;

        }

        .clearfix {

            *zoom: 1;

        }

        .clearfix:before,

        .clearfix:after {

            content: '';

            display: table;

        }

        .clearfix:after {

            clear: both;

        }

        .tip {

            width: 227px;

            position: absolute;

            top: 100px;

            left: 200px;

        }

        .tip-h {

            padding-top: 50px;

            background: url("images/tip1_h.gif") no-repeat;

        }

        .text {

            float: left;

            padding-left: 10px;

        }

        .close {

            float: right;

            margin-right: 10px;

        }

        .tip-m {

            /* 最小高度是40,实际是上让内容撑开,但是内容可能特别小,她保证高度也最低有40 */

            min-height: 40px;

            padding: 0 10px;

            padding-top: 10px;

            background: url("images/tip1_c.gif");

        }

        .tip-f {

            height: 53px;

            background: url("images/tip1_f.gif");

            padding-top: 20px;

        }

        .icon {

            float: left;

            padding-left: 10px;

        }

        .name {

            float: right;

            padding-right: 10px;

        }

    </style>

</head>

<body>

    <div class="content" id="content">

        <!-- <div class="tip" id="tip">

            <div class="tip-h clearfix" title="双击关闭纸条">

                <div class="text">第[49568]条 2019-04-16 22:51:52</div>

                <div class="close" title="关闭纸条">x</div>

            </div>

            <div class="tip-m">这是一个寂寞的天,下着有些猥琐的雨</div>

            <div class="tip-f clearfix">

                <div class="icon">

                    <img src="images/bpic_1.gif" alt="" />

                </div>

                <div class="name">群姐</div>

            </div>

        </div> -->

    </div>

</body>

</html>

<!--

    步骤:

        1. 数组有多少个元素创建多少个便利贴

            1.1 遍历数组

            1.2 在循环里创建div,给它一个类叫tip

            1.3 去复制内容,再赋值给div的innerHTML

            1.4 在循环外面找到content

            1.5 把创建出来的div添加到content里面

        2. 给每个div设置随机位置

            2.1 先算出最大能到的x和最大能到的y

            2.2 生成2个随机数x,y

            2.3 把x,y添加到这个div的left和top里

        3. 让数组中的数据,显示到界面

            3.1 先获取到每个元素

            3.2 拼接字符串的时候把对应的属性放到对应的内容位置

        4. 完成双击关闭便利贴

            4.1 找到tip-h,也就是tip的下标0子元素,给他加双击事件(ondblclick)

            4.2 点击事件里,谁双击,就把谁的父元素隐藏

        5. 完成x的点击事件

            4.1 找到x,也就是tip的下标0子元素的下标1子元素,给它加点击事件(onclick)

            4.2 点击事件里,谁被点,就把谁父元素的父元素隐藏

        6. 完成点谁谁在最上面

            6.1 声明一个变量zIndex从0开始

            6.2 点一下让zIndex++

            6.3 谁被点,就把zIndex给谁

-->

<script>

    // 假设这个数组就是从服务器返回来的

    // 就意味着数组有多少个元素,我就要创建多少个便利贴显示在界面上

    // 这个数组每个元素都是一个,每个对象都是一个便利贴的数据

    var messages = [

        { "id": 1, "name": "张学友", "content": "刘德华说的对", "time": "2017-12-26 00:00:00" },

        { "id": 2, "name": "刘德华", "content": "周林林比林利群帅", "time": "2017-12-25 12:40:00" },

        { "id": 3, "name": "郭富城", "content": "我认同张学友说的", "time": "2017-12-25 12:45:00" },

        { "id": 4, "name": "林利群", "content": "把朋友家厕所拉堵了 不敢出去 掏了半小时了都", "time": "2017-12-24 12:40:00" },

        { "id": 5, "name": "周林林", "content": "师者,所以传道受业解惑也。", "time": "2016-02-22 12:40:00" },

        { "id": 6, "name": "紫霞", "content": "至尊宝,等我", "time": "2017-12-23 09:30:00" },

        { "id": 7, "name": "孙悟空", "content": "吃俺老孙一棒!", "time": "2017-12-23 09:30:00" },

        { "id": 8, "name": "某某", "content": "旋转,跳跃,我不停歇…………舞娘的喜悲没人看见", "time": "2017-12-26 01:30:00" },

        { "id": 9, "name": "哎呦哎呦", "content": "今天谁的礼物最好看!!?答:朋友圈。。。", "time": "2017-12-25 20:30:00" }

    ];

    // 找到content

    var content = document.getElementById('content');

    // 数组有多少个元素就有多少个便利贴,所以遍历数组

    for (var i = 0; i < messages.length; i++) {

        // 取出每个元素

        var obj = messages[i];

        // 创建多少个便利贴

        var tip = document.createElement('div');

        tip.className = "tip";

        tip.innerHTML = '<div class="tip-h clearfix" title="双击关闭纸条">' +

            '<div class="text">第[' + obj.id + ']条 ' + obj.time + '</div>' +

            '<div class="close" title="关闭纸条">x</div>' +

            '</div>' +

            ' <div class="tip-m">' + obj.content + '</div>' +

            ' <div class="tip-f clearfix">' +

            ' <div class="icon">' +

            ' <img src="images/bpic_1.gif" alt="" />' +

            '</div>' +

            '<div class="name">' + obj.name + '</div>' +

            '</div>';

        // 把这个便利贴加到content里面

        content.appendChild(tip);

        // 随机位置:

        // x范围是0 到 content宽度 - div宽度

        var maxX = 960 - 227;

        // y范围是0 到 content高度 - div高度

        var maxY = 627 - 187;

        // 生成随机的x和y

        var x = parseInt(Math.random() * (maxX + 1));

        var y = parseInt(Math.random() * (maxY + 1));

        // 把随机x和y给便利贴的left和top

        tip.style.left = x + "px";

        tip.style.top = y + "px";

        // 第一个子元素就是tip-h头部部分,给他添加双击事件

        tip.children[0].ondblclick = function () {

            // 谁被点,就隐藏谁的父元素(就整体隐藏了)

            this.parentNode.style.display = "none";

        }

        // 找到这个x,给它加点击事件

        tip.children[0].children[1].onclick = function(){

            this.parentNode.parentNode.style.display = "none";

        }

        // 从0开始

        var zIndex = 0;

        // 给整个tip加点击事件,点谁谁就在最上面

        tip.onclick = function(){

            // 点一次让层级+1

            zIndex++;

            // 谁被点谁就用最新的层级

            this.style.zIndex = zIndex;

        }

        // console.log(tip);

    }

</script>

07京东tab栏切换

<style>

        * {

            margin: 0;

            padding: 0;

        }

        ul {

            /* 去掉li前面的小点点 */

            list-style: none;

        }

        .box {

            width: 400px;

            height: 300px;

            border: 1px solid #ccc;

            margin: 100px auto;

        }

        .hd {

            height: 45px;

        }

        .hd span {

            /* 转成行内块元素 */

            display: inline-block;

            /*将行内元素转换成行内块元素,宽高才起作用*/

            width: 90px;

            height:45px;

            background-color: pink;

            /* 设置行高的时候,如果没有给高度,会把高度设置跟行高一样高 */

            line-height: 45px;

            text-align: center;

            cursor: pointer;

        }

        .hd span.current {

            /*交集选择器,标签指定式选择器*/

            background-color: purple;

            /*紫色*/

        }

        .bd li {

            height: 255px;

            background-color: purple;

            display: none;

            /*设置隐藏*/

        }

        .bd li.current {

            display: block;

            /*显示*/

        }

    </style>

</head>

<body>

    <div class="box" id="box">

        <!-- 栏目模块 -->

        <div class="hd">

            <span class="current">体育</span>

            <span>娱乐</span>

            <span>新闻</span>

            <span>综合</span>

        </div>

        <!-- 内容模块 -->

        <div class="bd">

            <ul id="list">

                <li class="current">我是体育模块</li>

                <li>我的娱乐模块</li>

                <li id="li3">我是新闻模块</li>

                <li>我是综合模块</li>

            </ul>

        </div>

    </div>

    <script>

        // 找到所有span

        var spList = document.getElementsByTagName('span');

        // 找到所有li

        var liList = document.getElementsByTagName('li');

        // 遍历所有的span,给它们加鼠标移入事件

        for(var i = 0; i < spList.length; i++){

            // span的下标存到每个span自己身上

            spList[i].setAttribute('index',i);

            // 给每个span加鼠标移入事件

            spList[i].onmouseover = function(){

                // 排他

                // 谁移入了,就让所有的span先恢复成默认,也让li恢复成默认

                for(var j = 0; j < spList.length; j++){

                    spList[j].className = "";

                    liList[j].className = "";

                }

                // 谁移入谁变紫,变紫就是类名加current

                this.className = " current";

                // 谁移入取出谁的下标

                var idx = this.getAttribute('index');


                // 根据下标找到对应的li标签

                liList[idx].className = "current";

            }

        }

    </script>

08京东商品展示

  * {

            margin: 0;

            padding: 0;

        }

        ul {

            list-style: none;

            padding-top: 15px;

        }

        .box {

            width: 350px;

            height: 420px;

            border: 1px solid #000;

            margin: 100px auto;

        }

        li {

            float: left;

            width: 20%;

            text-align: center;

        }

        img:hover {

            outline: 3px solid #0094ff;   

        }

    </style>

</head>

<body>

    <div class="box">

        <div>

            <!-- 放大图的 -->

            <img src="images1/b1.jpg" id="big" alt="" />

        </div>

        <div>

            <ul id="ul">

                <!-- 放小图的,data-src是我们自己写的自定义属性,保存了这张小图对应的大图 -->

                <li><img src="images1/s1.jpg" data-src="images1/b1.jpg" alt="" /></li>

                <li><img src="images1/s2.jpg" data-src="images1/b2.jpg" alt="" /></li>

                <li><img src="images1/s3.jpg" data-src="images1/b3.jpg" alt="" /></li>

                <li><img src="images1/s4.jpg" data-src="images1/b4.jpg" alt="" /></li>

                <li><img src="images1/s5.jpg" data-src="images1/b5.jpg" alt="" /></li>

            </ul>

        </div>

    </div>

    <script>

        // 找到大图

        var big = document.getElementById('big');

        // 找到ul

        var ul = document.getElementById('ul');

        // 找到所有的小图

        var imgList = ul.getElementsByTagName('img');


        // 给小图加鼠标移入事件

        for(var i = 0; i < imgList.length; i++){

            imgList[i].onmouseover = function(){

                // 谁移入就取出谁的data-src,再赋值给大图

                big.src = this.getAttribute('data-src');

            }

        }

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

推荐阅读更多精彩内容