博客列表 >将HTML集合转成真正的数组对象、定时器与事件模拟器、轮播图片案例--2019/07/12

将HTML集合转成真正的数组对象、定时器与事件模拟器、轮播图片案例--2019/07/12

LISTEN的博客
LISTEN的博客原创
2019年07月22日 16:30:43948浏览

1、如何将html元素集合转换为数组对象?

转换方式1:slice()方法

Array.prototype.slice.call(lis,0);

转换方式2:map()  方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值 

Array.prototype.map.call(lis,function (x){
    return x;
});

转换方式3: 仅适用于ES6 Array.from()  from() 方法用于通过拥有 length 属性的对象或可迭代的对象来返回一个数组。

Array.from(lis);

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>将HTML集合转成真正的数组对象</title>
</head>
<body>
<ul>
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
    <li>item4</li>
    <li>item5</li>
</ul>
<script>
    // html元素集合, 是类数组对象
    // 类数组对象二大特征: 1. 从0递增的整数索引 2. 有length属性,表示元素的数量
    var lis=document.getElementsByTagName('li');
    console.log('lis:');
    console.log(lis);

    //将HTML集合(类数组对象)转成真正的数组对象
    // 转换方式1: slice()
    var arr1=Array.prototype.slice.call(lis,0);
    console.log('slice()方法:');
    console.log(arr1);

    // 转换方式2: map()  方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
    var arr2=Array.prototype.map.call(lis,function (x){
        return x;
    });
    console.log('map()方法:');
    console.log(arr2);

    // 转换方式3: 仅适用于ES6 Array.from()  from() 方法用于通过拥有 length 属性的对象或可迭代的对象来返回一个数组。
    var arr3=Array.from(lis);
    console.log('from()方法:');
    console.log(arr3);

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

运行实例 »

点击 "运行实例" 按钮查看在线实例

运行结果

html元素集合转换为数组对象.png


2、slice() / splice()

 (1)slice(): 从数组中取出部分数据, 返回取的数据组成的新数组

slice(起始索引, 结束索引), 结果中不包括结束索引对应的数据

 (2) splice(): 主要用来删除数组中指定的元素, 始终返回被删除的元素
该方法,根据参数不同,功能有很大的差异
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
arrayObject.splice(index,howmany,item1,.....,itemX)
index  必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany    必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX  可选。向数组添加的新项目。

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>slice() / splice()</title>
</head>
<body>
<script>
    var arr1=[55,66,23,999,1678];
    console.log('原数组');
    console.log(arr1);

    // 1. slice(): 从数组中取出部分数据, 返回取的数据组成的新数组
    // slice(起始索引, 结束索引), 结果中不包括结束索引对应的数据
    console.log('slice()方法');
    var arr2=arr1.slice(1,4);//[66,23,999]
    console.log(arr2);
    var arr3=arr1.slice(1);//[66,23,999,1678]
    console.log(arr3);
    var arr4=arr1.slice(0);//返回全部数据 [55,66,23,999,1678]
    console.log(arr4);

    // 2. splice(): 主要用来删除数组中指定的元素, 始终返回被删除的元素
    // 该方法,根据参数不同,功能有很大的差异
    // splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
    // arrayObject.splice(index,howmany,item1,.....,itemX)
    // index	必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
    // howmany	必需。要删除的项目数量。如果设置为 0,则不会删除项目。
    // item1, ..., itemX	可选。向数组添加的新项目。

    // 2.1 删除: 这是最基本的功能, 需要传入二个参数
    // splice(起始索引, 删除数量)
    // 删除前二项, 返回被删除数据组成的数组
    console.log('splice()方法');
    console.log(arr1.splice(0,2));
    // 查看现在的数组情况
    console.log( arr1 );//[23, 999, 1678]

    // 2.2 插入数据
    // 插入新数据, 第二个参数必须是0, 第三个参数起,是插入的新数据
    // 从第二个位置起, 插入三个新数组
    console.log(arr1.splice(1,0,1111,2222,3333));
    console.log(arr1);// [23, 1111, 2222, 3333, 999, 1678]

    // 2.3 更新数据
    // 本质上就是删除+插入
    // 将索引为4的数据替换成666, 其实就是把它删除再插入
    console.log(arr1.splice(4,1,666));
    console.log(arr1);//[23, 1111, 2222, 3333, 666, 1678]

    // 也可以同时用多个值来更新它
    console.log(arr1.splice(2,2,1234,6789));
    console.log(arr1);//[23, 1111, 1234, 6789, 666, 1678]

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

运行实例 »

点击 "运行实例" 按钮查看在线实例

运行结果

2、slice和splice.png


3、自定义属性的操作

元素的属性有两种:原生属性、自定义属性

 获取原生属性,将元素看成对象,标签的属性看成该元素对象的属性,直接用点语法访问

针对data-为前缀的自定义属性,可以使用dataset方法

getAttribute() 方法返回指定属性名的属性值。可以获取原生属性,也可以获取自定义属性

setAttribute() 方法添加指定的属性,并为其赋指定的值。

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义属性的操作</title>
</head>
<body>
<!--元素的属性有两种:原生属性、自定义属性-->
<h2
id="mobile"
class="active"
style="color: red;border: 1px solid black"

data-brand="华为"
data-model="P30"
data-price="4288"
abc-test="test"
>手机</h2>

<script>
    var h2=document.getElementsByTagName('h2')[0];

    // 获取原生属性,将元素看成对象,标签的属性看成该元素对象的属性,直接用点语法访问
    console.log(h2.id);
    console.log(h2.className);  // class不能直接用,因为class是保留字
    console.log(h2.style); // style属性返回值又是一个对象
    console.log(h2.style.color);
    console.log(h2.style.border);
    console.log(h2.style.padding);//未定义,值为空

    // 获取自定义属性
    // console.log( h2.data-brand); // 报错
    console.log(h2.getAttribute('data-brand'));
    console.log(h2.getAttribute('data-model'));
    console.log(h2.getAttribute('data-price'));
    console.log(h2.getAttribute('abc-test'));

    // 针对data-为前缀的自定义属性,还有更简便的访问方式
    console.log(h2.dataset); // DOMStringMap,也是一个对象
    console.log(h2.dataset.brand);
    console.log(h2.dataset.model);
    console.log(h2.dataset.price);

    // getAttribute()也可以用来获取原生属性  getAttribute() 方法返回指定属性名的属性值。
    console.log(h2.getAttribute('id'));
    console.log(h2.getAttribute('class'));// 可直接使用class,不必转换成className
    console.log(h2.getAttribute('style'));

    // 原生属性,自定义属性,支持写操作
    h2.className='hide';
    console.log(h2.className);

    h2.dataset.price='3200';
    //数值类型转换成string类型
    // h2.dataset.price=String(3590);
  //  h2.dataset.price=(3188).toString();
    console.log(h2.dataset.price);

    // setAttribute() 方法添加指定的属性,并为其赋指定的值。
    h2.setAttribute('data-model','P30 Pro');
    console.log(h2.getAttribute('data-model'));

</script>

</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例


4、classList对象

classList 属性返回元素的类名,该属性用于在元素中添加,移除及切换 CSS 类。

方法有:

add(class1, class2, ...)    在元素中添加一个或多个类名。
contains(class)    返回布尔值,判断指定的类名是否存在。
item(index)    返回元素中索引值对应的类名。索引值从 0 开始。
remove(class1, class2, ...)    移除元素中一个或多个类名。
toggle(class, true|false)  在元素中切换类名。

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>classList对象</title>
    <style>
        .red{
            color:red;
        }
    </style>
</head>
<body>
<h2 class="one two three">classList 属性返回元素的类名,该属性用于在元素中添加,移除及切换 CSS 类。</h2>

<!--add(class1, class2, ...)	在元素中添加一个或多个类名。-->
<!--contains(class)	返回布尔值,判断指定的类名是否存在。-->
<!--item(index)	返回元素中索引值对应的类名。索引值从 0 开始。-->
<!--remove(class1, class2, ...)	移除元素中一个或多个类名。-->
<!--toggle(class, true|false)	在元素中切换类名。-->

<script>
    var h2=document.getElementsByTagName('h2')[0];

    //1.获取class样式
    //传统方式
    console.log(h2.className);
    //classList对象方式
    console.log(h2.classList.value);

    //2.添加
    h2.classList.add('four');
    console.log(h2.classList.value);
    h2.classList.add('test1','test2');//添加多个
    console.log(h2.classList.value);

    //3.更新
    h2.classList.replace('one','red');
    console.log(h2.classList.value);

    //4.获取某一个
    console.log(h2.classList.item(0));
    console.log(h2.classList.item(3));

    //5.删除一个或者多个
    h2.classList.remove('four');
    console.log(h2.classList.value);
    h2.classList.remove('two','test1');
    console.log(h2.classList.value);

    //6.自动切换,有则删除,没有就添加
    h2.addEventListener('click',function(event){
        h2.classList.toggle('red');
    },false);

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

运行实例 »

点击 "运行实例" 按钮查看在线实例

运行结果:

classList对象.png


5、定时器的种类与使用场景和事件模拟器

(1)setTimeout(),延时一段时间再执行 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
setTimeout(code,millisec)
code   必需。要调用的函数后要执行的 JavaScript 代码串。
millisec   必需。在执行代码前需等待的毫秒数。
setTimeout() 只执行 code 一次。

 (2)setInterval(): 间歇式重复执行
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。
setInterval(code,millisec[,"lang"])
code   必需。要调用的函数或要执行的代码串。
millisec   必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。

 (3)事件模拟器: 可以自动生成了一个点击事件对象,分配给播放按钮
如实现图片自动播放,不需要点击播放按钮,或者实现自动点击广告

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>定时器与事件模拟器</title>
</head>
<body>
<h2>setTimeout()案例:实现登录后,三秒后跳转网页</h2>
<button>登录</button>
<button>取消</button>
<p></p>

<hr>
<h2>setInterval()案例:实现多张图片轮播效果</h2>
<button>播放</button>
<button>停止</button>
<hr>
<img src="images/banner1.jpg" alt="" width="600">

<hr>
<h2>事件模拟器的应用场景与案例:自动点击联盟广告</h2>
<div style="width: 300px;height:200px;background-color: lightblue ">联盟广告......</div>
<div id="res"></div>


<script>
    //定时器
    // 1.setTimeout(),延时一段时间再执行 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
    // setTimeout(code,millisec)
    // code	必需。要调用的函数后要执行的 JavaScript 代码串。
    // millisec	必需。在执行代码前需等待的毫秒数。
    // setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。
    var btn1=document.getElementsByTagName('button')[0];
    var btn2=document.getElementsByTagName('button')[1];
    var tips=document.getElementsByTagName('p')[0];
    var timer=null;

    btn1.addEventListener('click',login,false);
    function login() {
        tips.innerText='正在跳转中...';

        timer=setTimeout(function () {
            location.assign('http://www.php.cn');//assign() 方法可加载一个新的文档。
        },3000);
        console.log(timer);
    }

    btn2.addEventListener('click',function (event) {
        //clearTimeout() 方法可取消由 setTimeout() 方法设置的 timeout。
        clearTimeout(timer);
        tips.innerText='';
        console.log(timer);
    });

    // 2. setInterval(): 间歇式重复执行
    // setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
    // setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
    // 由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。
    // setInterval(code,millisec[,"lang"])
    // code	必需。要调用的函数或要执行的代码串。
    // millisec	必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。
    var btn3=document.getElementsByTagName('button')[2];
    var btn4=document.getElementsByTagName('button')[3];
    var img=document.images[0];
    var timer1=null;


    // 随机显示一张图片
    btn3.addEventListener('click',play,false);
    function play() {
        timer1=setInterval(function () {
            // Math.random(): 随机产生一个0(包含)-1(不包含)之间的小数
            // ceil() 方法执行的是向上取整计算,它返回的是大于或等于函数参数,并且与之最接近的整数。
            // Math.ceil(Math.random()*3): 产生1-3之间随机数
            var index=Math.ceil(Math.random()*3);
            img.src='images/banner'+index.toString()+'.jpg';
            console.log(img.src);
        },1000);
    }

    btn4.addEventListener('click',function (event) {
        // clearInterval() 方法可取消由 setInterval() 设置的 timeout。
        clearInterval(timer1);
    },false);

    // 事件模拟器: 解放双手, 让机器代替你工作
    // 可以自动生成了一个点击事件对象,分配给播放按钮
    // 实现图片自动播放,不需要点击播放按钮
    //生成事件
    // var event = new Event('click');
    //触发事件
    // btn3.dispatchEvent(event);

    //自动点击联盟广告
    var div=document.getElementsByTagName('div')[0];
    var res=document.getElementById('res');
    var num=0;
    var price=0.5;

    var click=new Event('click');
    setInterval(function () {
        div.dispatchEvent(click);
        num=num+1;
        res.innerHTML='<p>广告点击次数:'+num+'</p>' +
            '<p>广告收入:<span style="color: red">'+(num*price).toString()+'</span>元</p>';
    },3000);

</script>

</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

运行结果:

定时器和事件模拟器.png


6、写出轮播图的基本实现原理与步骤

(1)基本的HTML和css代码编写,因为是轮播图片,所以需要在css中对图片、前后切换按钮、小圆点按钮进行位置定位;对未播放的图片进行隐藏显示;对各个样式进行编写。

(2)获取所有图片,将图片列表由HTML集合转为真正的数组类型,通过图片创建和设置小圆点的数量与样式, 小圆点与图片的数量关联,实现每添加一张图, 小圆点数量自动更新。同时自定义属性,让小圆点的data-index属性与图片的data-index属性一致,使小圆点与图片一一对应。

(3)为小圆点设置点击事件,需要对图片、小圆点设置激活样式,对原来激活的图片和小圆点移除激活样式,然后在根据小圆点的data-index值与图片data-index对应关系来确定需要切换的图片,进行添加class:‘active’属性来激活新选择的图片和小圆点。

(4)前后页切换按钮设置:对当前激活的图片而已,如果点击前按钮,需要显示前一个兄弟元素节点,如果点击后按钮,需要显示后一个兄弟元素节点,通过判断点击的是前按钮还是后按钮来进行相应的激活设置

(5)通过定时器和事件模拟器,来设置图片的轮播效果,通过鼠标移动事件,来判断图片是否进行轮播。

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轮播图实战</title>

    <style>
        .box{
            position:relative;
            width: 1200px;
            height: 400px;
            margin: 0 auto;
        }

        .box .slider{
            width: 1200px;
            height: 400px;
           display: none; /*元素不会被显示。*/
        }

        .box .slider.active{
            display: block; /*元素将显示为块级元素,此元素前后会带有换行符 */
        }

        .box .point-list{
            position: absolute;
            left: 50%;
            margin-left: -48px;
            top:360px;
        }

        .box .point-list .point{
            display: inline-block;
            width: 15px;
            height: 15px;
            margin: 0 5px;
            background-color: white;
            border-radius:50%;
        }

        .box .point-list .point.active{
            background-color: black;
        }

        .box .point-list .point:hover{
            /*cursor 一些不同的光标*/
            /*pointer	光标呈现为指示链接的指针(一只手)*/
            cursor:pointer;
        }

        .skip{
            position: absolute;
            display: inline-block;
            width: 60px;
            height: 60px;
            text-align: center;
            line-height: 60px;
            background-color: lightgray;
            color: black;
            opacity:0.3;
            font-size: 36px;
            top:170px;
            border-radius:50% ;
        }

        .box .prev{
            left:0;
        }

        .box .next{
            right: 0;
        }

        .box .skip:hover{
            cursor:pointer;
            opacity: 0.6;
            color: red;
        }

    </style>

</head>
<body>
<div class="box">
    <!--轮播图片-->
    <img src="images/banner1.jpg" alt="" data-index="1" class="slider active">
    <img src="images/banner2.jpg" alt="" data-index="2" class="slider">
    <img src="images/banner3.jpg" alt="" data-index="3" class="slider">

    <!--轮播小圆点-->
    <div class="point-list">
        <!--<span class="point active" data-index="1"></span>-->
        <!--<span class="point " data-index="2"></span>-->
    </div>

    <!--轮播左右切换按钮-->
    <span class="skip prev"> < </span>
    <span class="skip next"> > </span>

</div>

<script>
    //获取所有图片,将图片列表由HTML集合转为真正的数组类型
    var imgs=document.images;
    var imgArr=Array.prototype.slice.call(imgs,0);
    // console.log(imgArr);

    //获取小圆点父节点
    var pointList=document.getElementsByClassName('point-list')[0];

    // 设置小圆点的数量与样式, 与图片的数量关联,实现每添加一张图, 小圆点数量自动更新
    // img: 当前元素  index: 当前元素的索引值。
    imgArr.forEach(function (img,index) {
        var span=document.createElement('span');

        if(index===0){
            span.classList.add('point','active');
        }else{
            span.classList.add('point');
        }
        //让小圆点的data-index属性与图片的data-index属性一致,使小圆点与图片一一对应
        span.dataset.index=img.dataset.index;
        pointList.appendChild(span);
    });

    // 获取所有的小圆点,将小圆点的html集合, 转为真正的数组
    var points=document.getElementsByClassName('point');
    pointArr=Array.prototype.slice.call(points,0);

    // 为小圆点设置点击事件,切换图片
    pointArr.forEach(function (point) {
        point.addEventListener('click',setImgActive,false);
    });

    // 设置图片切换
    function setImgActive(event) {
        // event.target: 当前被点击的对象,就是小圆点
        imgArr.forEach(function (img) {
            // 根据小圆点的data-index值与图片data-index对应关系来确定需要切换的图片
            if(img.dataset.index===event.target.dataset.index){
                // 去掉原来所有图片上的激活样式
                imgArr.forEach(function (img1) {
                    img1.classList.remove('active');
                });

                // 设置当前图片为显示激活状态
                img.classList.add('active');

                // 设置小圆点的当前激活与高亮状态
                setPointActive(img.dataset.index);
            }
        });
    }

    // 获取翻页跳转按钮
    var skip =document.getElementsByClassName('skip');
    var leftskip=document.getElementsByClassName('skip')[0];
    var rightskip=document.getElementsByClassName('skip')[1];
    // 为翻页按钮添加事件
    leftskip.addEventListener('click',skipImg,false);
    rightskip.addEventListener('click',skipImg,false);

    function skipImg(event) {
        // 获取当前正在显示的图片
        var currentImg=null;
        imgArr.forEach(function (img) {
            //contains(class)	返回布尔值,判断指定的类名是否存在。
            if(img.classList.contains('active')){
                currentImg=img;
            }
        });

        // 判断点击的是显示前一个图片
        if(event.target.classList.contains('prev')){
            // 显示前一个兄弟元素节点
            // 移除当前图片高亮, 不要再显示
            currentImg.classList.remove('active');
            // 更新当前图片节点
            currentImg=currentImg.previousElementSibling;

            // 显示前一个兄弟元素节点
            if(currentImg!==null && currentImg.nodeName==='IMG'){
                // 高亮前一个兄弟节点图片
                currentImg.classList.add('active');
            }else{
                // 如果不存在前一个兄弟节点,则显示最后一个,以此来循环显示
                // 高亮最后一个兄弟节点图片
                currentImg=imgArr[imgArr.length-1];
                currentImg.classList.add('active');
            }
        }

        // 判断是否是点击了显示后一个图片
        if(event.target.classList.contains('next')){
            currentImg.classList.remove('active');
            currentImg=currentImg.nextElementSibling;

            // 显示后一个兄弟元素节点
            if(currentImg!==null &¤tImg.nodeName==='IMG'){
                currentImg.classList.add('active');
            }else{
                // 如果不存在后一个兄弟节点,则显示第一个,以此来循环显示
                // 高亮第一个兄弟节点图片, 索引为0
                currentImg=imgArr[0];
                currentImg.classList.add('active');
            }
        }

        // 获取当前显示的图片的data-index
        var imgIndex=currentImg.dataset.index;
        setPointActive(imgIndex);
    }

    //  设置小圆点高亮
    function setPointActive(imgIndex) {
        // 清除小圆点原有的高亮
        pointArr.forEach(function (point) {
            point.classList.remove('active');
        });
        pointArr.forEach(function (point) {
            if(point.dataset.index===imgIndex){
                point.classList.add('active');
            }
        });
    }

    // 定时器: 每隔2秒自动切换
    // 这类自动操作最适合事件模拟器完成
    // 这里选择点击下一页的按钮事件来做(上一页也可以,随意)

    // 利用鼠标移入与移出事件来启动/关闭定时器

    var box=document.getElementsByClassName('box')[0];

    // 创建定时器并初始化
    var timer=null;

    // 创建鼠标移动事件监听器
    // 1. 当鼠标移出轮播图区域时, 启动定时器控制轮播图的播放
    box.addEventListener('mouseout',startTimer,false);

    // 2. 当鼠标移入到轮播图区域时, 清除定时器,由用户点击来控制轮播图的播放
    box.addEventListener('mouseover',clearTimer,false);

    // startTimer: 启动定时器的方法
    function startTimer() {
        // 先生成了一个自定义的点击事件对象
        var clickEvent=new Event('click');
        timer=setInterval(function () {
            // 将自定义的点击事件分配给下一页按钮,实现自动点击
            rightskip.dispatchEvent(clickEvent);
        },2000);
    }

    // clearTimer: 清除定时器的方法
    function clearTimer() {
        clearInterval(timer);
    }

</script>

</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

运行结果:

轮播图.png

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议